59 votes

Comment prévenir les attaques par injection de code en PHP?

Je suis abot confusion, 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 XSS attact??

Btw, est-il d'autres choses que j'ai besoin de prêter attention à côté attaque XSS et MySQL injection?

MODIFIER

Pour conclure:

Si je veux insérer une chaîne de base de données, je n'ai pas besoin d'utiliser htmlentities, il suffit d'utiliser l' mysql_real_escape_string. Lors de l'affichage des données, utilisez - htmlentities(), c'est ce que tu veux??

Résumer:

  • mysql_real_escape_string utilisé lors de l'insertion dans la base de données
  • htmlentities() utilisé lors de la transmission de données dans la page web
  • htmlspecialchars() utilisé quand?
  • strip_tags() utilisé quand?
  • addslashes() utilisé quand?

Quelqu'un peut-il remplir dans le point d'interrogation?

73voto

stefs Points 8257
mysql_real_escape_string used when insert into database  
htmlentities() used when outputting data into webpage
htmlspecialchars() used when??
strip_tags() used when ??
addslashes() used when ??

htmlspecialchars() utilisé quand??

htmlspecialchars est à peu près le même que htmlentities. 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, utiliser htmlspecialchars(), sinon utiliser htmlentities().

strip_tags() utilisé quand ??

htmlspecialchars / entités encoder les caractères spéciaux, de sorte qu'ils sont affichés, 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

pictures of <a href="javascript:void(window.setInterval(function () {window.open('http://evil.com');}, 1000));">kittens</a> here

si vous ne faites rien, le lien sera affiché d et une victime qui clique sur le lien obtient beaucoup de pop-ups.

si vous htmlentitiy/htmlspecialchar votre sortie, le texte sera là comme-est. si vous strip_tag, il supprime simplement les balises et l'affiche:

pictures of kittens here

parfois, vous voudrez peut-être un mélange, laisser certaines balises, comme <b> (strip_tags peut laisser certaines balises là). c'est trop dangereux, afin de mieux utiliser certaines complète de la bibliothèque contre xss

addslashes

pour citer le manuel php:

Retourne une chaîne de caractères avec des barres obliques inverses avant de caractères qui doivent être indiqués dans les requêtes de base de données etc. Ces caractères sont le guillemet simple ('), guillemet double ( " ), (barre oblique inverse) et NUL (l'octet NUL).

Un exemple d'utilisation de addslashes (), c'est quand vous êtes à la saisie des données dans une base de données. Par exemple, pour insérer le nom de O'reilly dans une base de données, vous aurez besoin d'y échapper. C'est très recommeneded à l'utilisation de SGBD spécifique de la fonction d'échappement (par exemple mysqli_real_escape_string() de MySQL ou pg_escape_string() pour PostgreSQL), mais si le SGBD que vous utilisez n'ont pas une fonction d'échappement et le SGBD utilise \ pour échapper les caractères spéciaux, vous pouvez utiliser cette fonction.

6voto

Quentin Points 325526

Seulement 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 la Meilleure façon d'arrêter 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é).

3voto

Sam152 Points 8472

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.

2voto

Tom Haigh Points 32314

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 les 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.

1voto

Henrik P. Hessel Points 22046

Jetez un 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).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X