web-dev-qa-db-fra.com

Mysqli_real_escape_string est-il sûr?

Je suis nouveau dans PHP et j'ai réalisé que ma connexion à la base de données, en utilisant un formulaire php (avec des entrées de texte d'utilisateur et de passe) était totalement dangereuse:

Cela fonctionnait, mais n'était pas sûr:

<?php
$link=mysqli_connect('localhost','xx','xx','xx');
$sql='  SELECT * FROM usuarios 
        WHERE username="'.$_POST['usuario'].'" 
        AND pass="'.$_POST['usuario'].'"
     ';
$rs=mysqli_query($link,$sql);
mysqli_close($link);
?>

J'ai donc lu sur mysqli_real_escape_string et j'ai décidé de l'essayer:

<?php    
$link=mysqli_connect('localhost','xx','xx','xx');
$usuario=mysqli_real_escape_string($link, $_POST["usuario"]);
$clave=mysqli_real_escape_string($link, $_POST["clave"]);
$sql='  SELECT * FROM usuarios 
        WHERE username="'.$usuario.'" 
        AND pass="'.$clave.'"
     ';
$rs=mysqli_query($link,$sql);
mysqli_close($link);
?>

Est-ce correct? Est-ce un bon exemple de la façon d'utiliser mysqli_real_escape_string?

14
Rosamunda

Est-ce correct?

Oui.

Est-ce un bon exemple de la façon d'utiliser mysqli_real_escape_string?

NON

Si jamais elle est utilisée, cette fonction doit être encapsulée dans un traitement interne et ne doit jamais être appelée directement à partir du code d'application. Un espace réservé doit être utilisé à la place, pour représenter les données dans votre requête:

$sql='SELECT * FROM usuarios WHERE username=? AND pass=?';

Et puis, lors du traitement des marques de réservation, cette fonction peut être appliquée (le cas échéant) mais pas par elle-même mais le long de TOUTES les règles de formatage.

19
Your Common Sense

Oui, vous l'utiliserez maintenant.

La bonne chose à propos de l'utilisation de mysqli est qu'il est orienté objet. Vous pouvez donc l'utiliser comme ceci:

<?php

$mysqli = new mysqli("Host", "user", "password", "database");

$usuario = $mysqli->real_escape_string($_POST["usuario"]);
$clave = $mysqli->real_escape_string($_POST["clave"]);

$sql='  SELECT * FROM usuarios 
        WHERE username="'.$usuario.'" 
        AND pass="'.$clave.'"
     ';

$mysqli->query($sql);

$mysqli->close();
?>

Ou vous pouvez utiliser PDO.

7
Aartsie

L'utilisation des fonctions mysqli () ne doit être réservée qu'aux développeurs de frameworks et autres qui sont conscients de tous les problèmes de sécurité que cela peut entraîner. Pour tout le monde, il y a PDO . Il est tout aussi facile à utiliser que mysqli () et beaucoup plus sûr.

6
Ermir