2010-07-13 8 views
2

J'ai un site Web où je ne peux pas utiliser html_entities() ou html_specialchars() pour traiter les données d'entrée de l'utilisateur. Au lieu de cela, j'ai ajouté une fonction personnalisée, qui à la fin est une fonction, qui utilise un tableau $ interdit pour nettoyer la chaîne d'entrée de tous les caractères indésirables. En ce moment, j'ai '<', '>', "'" comme caractères indésirables en raison de sql-injection/navigateur piratage. Mon site est encodé en utf-8 - dois-je ajouter plus de caractères à ce tableau, c'est-à-dire les caractères '<', encodés dans d'autres jeux de caractères?sql injection/Browser-Hijacker prevention php

Merci pour toute aide,

Maenny

+3

Pourquoi ne pouvez-vous pas utiliser htmlentities()? –

+0

parce qu'il fait des choses bizarres avec des caractères kyrilliques, que je veux être activé pour l'entrée de l'utilisateur. – Maenny

+0

avez-vous essayé d'utiliser htmlentities() avec l'argument charset optionnel? –

Répondre

1
  1. htmlentities ni fonctions htmlspecialchars n'a rien à voir avec l'injection sql
  2. pour empêcher l'injection, vous devez suivre quelques règles, je les ai décrit tout here
  3. pour filtrer HTML, vous pouvez utiliser htmlspecialchars(), cela ne nuira à aucun de vos caractères cyrilliques
+0

c'est vrai que htmlentities ou htmlspecialchars n'ont rien à voir avec l'injection sql, ce serait pour le piratage de navigateur. Néanmoins, il semble que le problème que j'ai vraiment est un problème d'encodage, car tous les caractères cyrilliques sont envoyés via POST et convertis en esperluette. Je n'ai pas trouvé un moyen de convertir l'esperluette en caractères utf-8, quelqu'un a une idée pour ça? Maenny – Maenny

+0

@Maenny html_entity_decode() est une idée pour cela, mais au lieu du décodage constant, vous devez le faire une seule fois et ensuite arrêter l'encodage du tout. –

+0

+1 vous avez raison monsieur. – rook

0

Vous devez échapper " aussi. Il fait beaucoup plus de mal que ', parce que vous incluez souvent des attributs HTML dans ". Mais, pourquoi ne pas simlpy utiliser htmlspecialchars pour faire ce travail? De plus: Il n'est pas bon d'utiliser une fonction d'échappement pour le SQL et le code HTML. HTML a besoin d'échapper des balises, contrairement à SQL. Donc, ce serait mieux, si vous avez utilisé htmlspecialchars pour la sortie HTML et PDO::quote (ou mysql_real_escape_string ou tout ce que vous utilisez) pour les requêtes SQL. Mais je sais (d'après mon expérience) qu'échapper à toutes les entrées utilisateur dans les requêtes SQL peut être vraiment ennuyeux et parfois je n'échappe pas aux parties, car je pense qu'elles sont "sécurisées". Mais je suis sûr que je n'ai pas toujours raison de supposer cela. Donc, à la fin, je voulais m'assurer que j'échappe vraiment toutes les variables utilisées dans une requête SQL et donc avoir écrit une petite classe pour le faire facilement: http://github.com/nikic/DB Peut-être que vous voulez utiliser quelque chose de similaire, aussi.

-1

Mettez ce code dans votre page d'en-tête. Il peut empêcher l'attaque par injection SQL en PHP. Function clean_header ($ string) { $ chaîne = taille ($ chaîne);

// De la RFC 822: «Le corps de champ peut être composé d'un ASCII // caractères, sauf CR ou LF » if (! Strpos ($ string, « \ n «) == false) { $ chaîne = substr ($ chaîne, 0, chaîne ($ chaîne, "\ n")); } if (strpos ($ chaîne, "\ r")! == false) { $ chaîne = sous-chaîne ($ chaîne, 0, chaîne ($ chaîne, "\ r")); }

return $ chaîne; }

+0

catastrophe doit être arrêté en quelque sorte –