2010-12-12 4 views
2

Je travaille sur un site où les pages de contenu sont traitées avec mod_rewrite et j'essaie de rendre l'URL géré avec mod_rewrite protégé de SQL injections avec une certaine restriction char , car les utilisateurs peuvent créer des pages contenu comme celui-ci:URL et mod_rewrite: utiliser de nombreux caractères spéciaux et protéger les données contre les attaques

http://site.com/content-type/Page-created-by-user 

Mes doutes viennent quand ils insèrent quelque chose comme:

http://site.com/architect/Giovanni+Dall'Agata 

J'ai besoin d'insérer ' ombles parce que je peux avoir des noms comme ceci par exemple des architectes célèbres, mais je ne sais pas si je peux garder des données sûres et comment empêcher SQL injections avec ce caractère.

Dois-je faire quelque chose de particulier pour prévenir les attaques?

J'utilise PDO class dans PHP comme ceci:

$architect = strip_tags (trim ($_REQUEST["architect"])); 

// pdo class etc.. 
$pdo_stmt->bindParam (":arch", $architect, PDO::PARAM_STR); 
// and the other code here... 

Les utilisateurs ne peuvent créer des pages avec ces caractères: < >/\ * ? = dois-je interdire ' et " aussi? Ou devrais-je autoriser un seul des caractères ' et " ou puis-je les utiliser ensemble et protéger le serveur?

+3

Du point de vue de la conception, vous voulez vraiment être garder contre l'injection SQL aussi proche de la base de données que possible au lieu de compter sur d'autres couches de votre application - comme vos règles mod_rewrite - pour assurer cette protection. Votre utilisation des paramètres liés dans PDO est fortement recommandée à cet égard. – Schwartzie

Répondre

2

$stmt->bindParam (et bindValue, et en général, préparé des déclarations) sont en sécurité contre l'injection SQL. Tous les frameworks SB sérieux supportent une manière d'ajouter des paramètres à une requête, et les valeurs ajoutées de cette manière sont aseptisées. Vous devriez toujours le faire et ne jamais insérer variables données provenant des utilisateurs (voir les commentaires) manuellement dans une chaîne de requête SQL. Cela laisse toujours la question des injections XSS, qui sont plus faciles à manquer (mais aussi moins dangereuses); pour les éviter, assurez-vous de toujours utiliser htmlspecialchars($var,ENT_QUOTES) (ou urlencode, selon le contexte).

+0

Cependant, parfois nous devons ajouter une variable ou deux dans la requête directement de toute façon. Il vaut mieux être armé pour un tel cas plutôt que de simplement l'interdire. –

+0

Je l'éviterais en règle générale, à moins que ce soit une constante ou sinon manifestement intransigeant par l'utilisateur. Il ne suffit pas que le code soit sécurisé; il devrait * regarder * sécurisé.Rend la probabilité de dérapages accidentels beaucoup plus petite. – Tgr

+0

donc, vous feriez mieux de l'ajouter à la réponse ou du moins de mentionner que vous parlez de données seulement. Parce que les instructions préparées peuvent protéger uniquement les données et ne peuvent pas aider avec toute autre partie de la requête. –

0

AOP échappe automatiquement des personnages comme ' alors vous devriez être ok, assurez-vous que vous avez register_globals et magic_quotes désactivé et toujours utiliser bindParam pour vos requêtes.

Aussi, si vous parlez de la création d'URL dynamique vous ne devriez pas avoir le caractère ' en eux de toute façon. Je l'utilise toujours:

$str = preg_replace("([^0-9a-zA-Z\-])", "", $str); 

qui supprime tout ce thats pas 0-9, a-z ou un tiret de la chaîne.

+0

Merci pour votre réponse, dois-je encore utiliser strip_tags (trim ("...")) Si je travaille avec la classe PDO? – vitto

+0

En fait, PDO n'échappe pas à rien. Au moins pas en mode compatible. Il utilise un mécanisme différent –

Questions connexes