Je lutte avec un petit problème depuis un moment. Il existe depuis des années, mais il s’agit simplement d’un problème irritant et non grave; je viens d’y remédier. Mais maintenant, je veux savoir si quelqu'un peut m'aider. J'ai fait des recherches sur Google mais pas de succès.
Si je fais un post de formulaire à partir d'un texte HTML dans un fichier php comme ceci:
<form action="http://action.com" method="post">
<textarea name="text"><a href="http://google.com">google's site</a></textarea>
</form>
et bien sûr il y a un bouton de soumission et ainsi de suite.
La valeur est le problème: <a href="http://google.com">google's site</a>
La valeur de la zone de texte a "(guillemet) et '(apostrophe).
Pour enregistrer ceci dans une base de données mysql_, je fais ceci:
$result = mysql_query("INSERT INTO `table` (`row1`) VALUES ('".$_POST['text']."') ") or die(mysql_error());
Et maintenant je reçois l'erreur mysql:
Vous avez une erreur dans votre syntaxe SQL; Consultez le manuel correspondant à la version de votre serveur MySQL pour connaître la syntaxe à utiliser auprès de 's site' 'à la ligne 1.
Votre chaîne SQL sera:
INSERT INTO `table` (`row1`) VALUES ('google's site')
Ce qui n'est pas une déclaration valide. Comme Nanne l'a écrit, échappez au moins à la chaîne avec mysql_real_escape_string: http://php.net/manual/en/function.mysql-real-escape-string.php
Et lisez à propos de sql injection http://en.wikipedia.org/wiki/SQL_injection
Pensez un peu: si quelqu'un poste ceci: $_POST['text']
avec la valeur: ');delete from table;....
Vous pouvez dire au revoir à vos données :)
Toujours filtrer/échapper l'entrée!
EDIT: à partir de PHP 5.5.0, mysql_real_escape_string et l'extension mysql sont obsolètes. Merci d'utiliser l'extension mysqli et la fonction mysqli :: escape_string
Utilisez toujours au moins mysql_real_escape_string lorsque vous ajoutez des valeurs fournies par l'utilisateur à la base de données. Vous devriez examiner les paramètres de liaison ou mysqli pour que votre requête devienne:
INSERT INTO `table` (`row1`) VALUES (?)
Et ? serait remplacé par la valeur réelle après la désinfection de l’entrée.
Dans votre cas, utilisez:
$result = mysql_query("INSERT INTO `table` (`row1`) VALUES ('".mysql_real_escape_string($_POST['text'])."') ") or die(mysql_error());
Lire sur l'injection SQL. Cela vaut la peine de faire les choses aussi vite que possible!
Échapper à la chaîne: D
http://php.net/manual/en/function.mysql-real-escape-string.php
vous pouvez utiliser la fonction includeslashes (). Il cite une chaîne avec des barres obliques. alors, cela vous sera très utile lorsque vous ajouterez une apostrophe dans votre champ.
$result = mysql_query("INSERT INTO `table` (`row1`) VALUES ('".addslashes($_POST['text'])."') ") or die(mysql_error());
au lieu d'utiliser les anciennes fonctions mysql *, utilisez PDO et écrivez des requêtes paramétrées - http://php.net/pdo
Je me débattais également à propos des caractères lorsque je mettais à jour des données dans mysql.
Mais je suis finalement arrivé à une meilleure réponse, voici:
$lastname = "$_POST["lastname"]"; //lastname is : O'Brian, Bran'storm
Et lorsque vous allez mettre à jour votre base de données, le système ne le mettra pas à jour à moins que vous n'utilisiez la chaîne d'échappement MySQL REAL . Ici:
$lastname = mysql_real_escape_string($_POST["lastname"]); // This Works Always.
Ensuite, votre requête sera mise à jour certainement.
Example: mysql_query("UPDATE client SET lastname = '$lastname' where clientID = '%"); //This will update your data and provide you with security.
Pour plus d'informations, veuillez vérifier MYSQL_REAL_ESCAPE_STRING
J'espère que cela t'aides