9
votes

Comment échapper aux citations lors de l'insertion dans la base de données avec PHP

J'ai un message d'erreur lors de l'insertion de contenu contenant des citations dans ma DB. Voici ce que j'ai essayé d'essayer d'échapper aux citations, mais je n'ai pas fonctionné:

$con = mysql_connect("localhost","xxxx","xxxxx");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("test", $con);

$nowdate = date('d-m-Y')

$title =  sprintf($_POST[title], mysql_real_escape_string($_POST[title]));

$body = sprintf($_POST[body], mysql_real_escape_string($_POST[body]));

$sql="INSERT INTO articles (title, body, date) VALUES ('$title','$body','$nowdate'),";

if (!mysql_query($sql,$con))
  {
  
die('Error: ' . mysql_error());
  
}

header('Location: index.php');


1 commentaires

Veuillez afficher le message d'erreur, vous semblez déjà échapper aux données correctement.


4 Réponses :


12
votes

Il devrait fonctionner sans le Sprintf Stuff

$title = mysql_real_escape_string($_POST[title]);
$body = mysql_real_escape_string($_POST[body]);


6 commentaires

@MAURO: Vous ne devez toujours pas utiliser cela, mais des déclarations paramétrées à la place.


@Tomalak pas "devrait" mais "recommandé". Les déclarations préparées sont plus lourdes, oui, mais toujours pas une balle d'argent.


@Col. Shrapnel: Je pensais que "devrait" et "recommandé" était la même chose. J'aurais utilisé une forme de "avoir à" ou "doit" sinon. Désolé, je ne suis pas en train d'arroser des constructions de langue purement pour des raisons de politesse. ;)


Alors que les déclarations paramétrées sont définitivement une meilleure approche en général, malheureusement PHP's's's's's's's's's's's's's's's's's's's's> MySQLI_Bind_Param d'eux est un bit verbeux, et dispose d'un piège à interface désastreuse pour le déplacement en ce qu'il lie la référence variable au lieu de la valeur. Cela en fait souvent une vente plus difficile que de s'échapper. (PDO est un peu mieux sur ce front.)


@Bobince: la liaison par référence ne doit pas être un problème tant que la liaison et l'exécution sont effectuées en pleine succession. En dehors de cela, c'est un mauvais style de réutiliser des variables dédiées pour autre chose de toute façon. ;) Pour ma part, la verbosité + la sécurité bat la brièveté. Le code est plus souvent lu que écrit, alors être verbose est en fait une bonne chose.


Ce n'est pas un problème tant que vous le savez. Pour un débutant (et, je parie, une majorité de codeurs PHP de tous les jours) qui ne le font pas, c'est un piège contre-intuitif et potentiellement ennuyeux à déboguer. Il vous empêche également de contraignant une valeur comme 'foo'. Bar à 60 $ , ce qui signifie plus de variables temporaires bogus. J'adore les requêtes paramétrées, mais L'interface MySQLI est un hangar. La DB-API de Python montre comment cela devrait être fait de manière concise. (Bien que vous obteniez le chagrin d'amour de paramstyle , vous ne pouvez donc pas gagner, je suppose ...)



2
votes

Avec toute requête de base de données, notamment les insertions d'une application Web, vous devez vraiment utiliser des paramètres. Voyez ici pour l'aide PHP sur l'utilisation des paramètres de vos requêtes: Paramètres PHP

Cela aidera à prévenir les attaques d'injection SQL et à vous empêcher de devoir échapper des caractères.


1 commentaires

Merci je vais regarder ça! :)



2
votes

Votre code xxx

doit être comme suit xxx

virgule ne doit pas être là à la fin de la requête < / p>


0 commentaires

14
votes

Veuillez commencer à utiliser des déclarations paramétrées préparées. Ils retirent le besoin de malheurs d'échappement SQL et fermez l'échappatoire d'injection SQL que les déclarations SQL-Cord-concaténées sont ouvertes. De plus, ils sont beaucoup plus agréables à travailler avec et beaucoup plus vite lorsqu'ils sont utilisés dans une boucle.

$con  = new mysqli("localhost", "u", "p", "test");
if (mysqli_connect_errno()) die(mysqli_connect_error());

$sql  = "INSERT INTO articles (title, body, date) VALUES (?, ?, NOW())";
$stmt = $con->prepare($sql);
$ok   = $stmt->bind_param("ss", $_POST[title], $_POST[body]);

if ($ok && $stmt->execute())
  header('Location: index.php');
else
  die('Error: '.$con->error);


0 commentaires