Comment prévenir les attaques par injection de code en PHP?
Je suis un peu confus, il ya tellement de nombreuses fonctions en PHP, et certains à l'aide de cela, certains en les utilisant. Certaines personnes utilisent: htmlspecialchars()
, htmlentities()
, strip_tags()
etc
Qui est la bonne et que faites-vous le plus souvent?
Est-ce correct (me conseiller un meilleur, le cas échéant):
$var = mysql_real_escape_string(htmlentities($_POST['username']));
Cette ligne peut empêcher l'injection MySQL et attaque XSS??
Btw, est-il d'autres choses, je dois faire attention en plus d'attaques XSS et MySQL injection?
MODIFIER
De conclure:
Si je veux insérer une chaîne de caractères de la base de données, je n'ai pas besoin d'utiliser htmlentities
, il suffit d'utiliser la mysql_real_escape_string
. Lors de l'affichage des données, de l'utilisation htmlentities()
, c'est ce que tu veux??
Résumer:
mysql_real_escape_string
utilisé lors de l'insertion dans la base de donnéeshtmlentities()
utilisé lors de la transmission de données dans la page webhtmlspecialchars()
utilisé quand?strip_tags()
utilisé quand?addslashes()
utilisé quand?
Quelqu'un peut-il remplir dans le point d'interrogation?
- strip_tags() peut être dangereux securiteam.com/unixfocus/5UP0C15DFI.html
- Vous pourriez être concerné par CSRF et directory transversal, le moyen le plus facile de fixer directory transversal est
basename(realpath($path))
.
Vous devez vous connecter pour publier un commentaire.
htmlspecialchars() utilisé lors de l'?
htmlspecialchars
est à peu près le même quehtmlentities
. La différence: les encodages de caractères.La fois d'encoder les caractères de contrôle comme
<
,>
,&
et ainsi de suite utilisé pour les balises d'ouverture etc.htmlentities
aussi encoder les caractères d'autres langues comme des trémas, euro-symboles et ces. Si vos sites web sont en UTF, utilisezhtmlspecialchars()
, sinon utilisezhtmlentities()
.strip_tags() utilisé lors de l'?
htmlspecialchars
/entities
encoder les caractères spéciaux, ils sont donc affiché, mais pas interprété.strip_tags
SUPPRIME.Dans la pratique, cela dépend de ce que vous devez faire.
Un exemple: vous avez codé un forum, et de donner aux utilisateurs un champ de texte de sorte qu'ils peuvent poster des trucs. Les logiciels malveillants juste essayer:
Si vous ne faites rien, le lien sera affiché et une victime qui clique sur le lien obtient beaucoup de pop-ups.
Si vous htmlentity/htmlspecialchar votre sortie, le texte sera là comme-est. Si vous strip_tag, il supprime simplement les balises et l'affiche:
Parfois, vous voudrez peut-être un mélange, laisser certaines balises, comme le
<b>
(strip_tags
peut laisser certaines balises là). C'est trop dangereux, afin de mieux utiliser certaines complète de la bibliothèque contre le XSS.addslashes
Pour citer un ancienne version du manuel PHP:
La version actuelle est libellée différemment.
J'ai pensé à cette petite liste de vérification:
htmlspecialchars()
sur toute sortie à partir de votre code PHP, qui est, ou contient une entrée de l'utilisateur. La plupart des moteurs de template vous aider à le faire facilement.php.ini
de bloquer les scripts d'accéder à vos cookiesPHPSESSID
de session (session ID) à l'extérieur du cookie, si quelqu'un arrive à savoir un IDENTIFIANT de Session de quelqu'un d'autre, ils peuvent l'utiliser pour se connecter à son compteRemember me
fonction, montrer un petit avertissement, peut-être.PDO
ignorer cette erreur par défaut, et journal d'un avertissement dans les journaux. Cela provoque les variables que vous obtenez à partir de la DB nulle, en fonction de votre code, cela peut provoquer un problème de sécurité.PDO
émuler déclarations préparées à l'avance. Désactiver cette fonction.UTF-8
encodage dans vos bases de données, il vous permet de stocker pratiquement n'importe quel caractère et d'éviter de codage-attaques liées à l'$myquery = "INSERT INTO mydb.mytable (title) VALUES(" . $user_input . ")"
joli beaucoup signifie que vous avez un énorme risque de sécurité d'une injection SQL..php
l'extension de fichier alors à chaque fois que votre code charge ce fichier il l'exécute, et permet à l'utilisateur d'exécuter certaines backend codeSeulement coder les données au point où elle passe dans le système, il doit être codé pour — sinon, vous serez confronté à des situations où vous souhaitez manipuler les données réelles.
Pour l'injection SQL - utiliser des variables liées, comme décrit dans Comment puis-je prévenir l'injection SQL en PHP? (il parle de déclarations préparées à l'avance, mais c'est la liaison qui vous donne une protection, n'est pas la préparation).
Pour XSS - si vous écrivez en HTML au point où le format HTML ou texte est spécifié. Utiliser htmlentities à l'endroit où vous générez votre document. Je voudrais éviter de stocker les données de ce formulaire dans la base de données (à l'exception possible dans une écriture-rare-lire-souvent système où les performances du CPU/disque temps d'accès étaient en train de devenir un problème alors que j'aurais un raw_ et un html_ version de la colonne ... ou tout simplement utiliser memcached ou similaire).
Si vous êtes de permettre aux utilisateurs d'entrer des Url, alors vous devez être plus prudent, car
javascript:do_evil()
est une URI valide à exécuter (par exemple, comme un href pour un cliqué sur le lien ou (dans certains navigateurs) le src d'une image qui est juste chargé).htmlspecialchars()
tourne
&
,'
,"
,<
, et>
dans une entité HTML (format de&
,"
, etc.)htmlentities()
transforme toutes les lois personnages dans leur entité HTML format.
strip_tags()
supprime tout le code HTML et des balises PHP.
Les deux
htmlspecialchars()
ethtmlentities()
prendre un paramètre optionnel indiquant comment les guillemets doivent être manipulés. Voir laManuel PHP pour plus de détails.
La
strip_tags()
fonction prend unparamètre optionnel indiquant quelles balises
ne doit pas être dépouillé.
La
strip_tags()
fonction supprimemême invalide balises HTML, ce qui peut
causer des problèmes. Par exemple,
strip_tags()
va tirer tous lesle code qu'il pense est une balise HTML, même
si c'est mal formé, comme
Vous avez seulement besoin d'utiliser mysql_escape_string() lors de l'insertion dans une base de données et htmlentites lors de l'affichage du HTML. C'est suffisant si vous voulez éviter qu'une simple injection de l'attaque, mais il n'y a aucun doute de nombreux autres problèmes de sécurité que vous devez être conscient lors de l'élaboration d'une application web, un autre principale étant cross site request forgeries.
Je ne voudrais pas utiliser htmlentities() lors de l'insertion de données dans la base de données ou d'interrogation de la base de données. Si les données dans votre base de données est stockée en tant qu'entités, que les données sont ensuite seulement utile à quelque chose qui comprend les entités html.
Vous devez utiliser différents mécanismes d'échappement pour les différents types de sortie, par exemple, SQL - mysql_real_escape_string(), HTML - htmlentities() ou htmlspecialchars(), shell - escapeshellarg(). C'est parce que les caractères qui sont "dangereuses", sont différents pour chacun, il n'y a pas une manière magique vous pouvez faire toutes les données en toute sécurité pour tout support de sortie.
Prendre un coup d'oeil à ce site PHP Security Consortium. Je l'ai trouvé un bon site pour un aperçu global sur PHP de Sécurité (Injection SQL et XSS inclus).
Je sais que c'est une vieille question, mais de nos jours le plus voté réponse peut être trompeuse pour les débutants.
À compter de 2017
Vous devriez ne jamais les utiliser mysql_real_escape_string. Même mysqli_real_escape_string est trop faible pour protéger votre base de données contre les injections SQL. Au lieu de cela, vous devez utiliser PDO, et de techniques similaires. (voir que guide)
XSS (je veux dire ici:
strip_tags()
,addslashes()
,htmlspecialchars()
,htmlentities()
) - ici le plus voté réponse est toujours correct, mais je suggère la lecture de cet article