2010-03-03 9 views
4

Je n'ai aucun concept sur la sécurité ZF. Dois-je utiliser le filtre lorsque je travaille sur une base de données? Peut-être que la liaison est suffisante? Que diriez-vous de ceci:Comment empêcher l'attaque par injection SQL dans les applications programmées dans Zend Framework?

$users->update($data, 'id=1'); 

Devrait-on filtrer le tableau $ data? N'hésitez pas à écrire tout ce que vous savez sur le sujet. Pourriez-vous donner quelques liens vers de bons articles sur la sécurité dans ZF (principalement sur SQL Injection et XSS)?

Répondre

5

Réponse courte
Alors que ZF prend et fournit quelques mesures pour sécuriser votre application, vous devriez toujours appliquer les mêmes précautions que vous utiliseriez sans Zend Framework.


En ce qui concerne l'extrait de code, consultez le chapitre sur Zend_Db in the Reference Guide:

Par défaut, les valeurs dans votre tableau de données sont insérées à l'aide des paramètres. Cela réduit le risque de certains types de problèmes de sécurité. Vous n'avez pas besoin d'appliquer l'échappement ou la citation aux valeurs du tableau de données.

Cela ne signifie pas que vous n'avez pas à vous soucier de la sécurité. Par exemple, pour le Update method ci-dessus

Le troisième argument est une chaîne contenant une expression SQL utilisée comme critère pour les lignes à modifier. Les valeurs et les identifiants de cet argument ne sont pas indiqués ou échappés. Vous êtes responsable de vous assurer que tout contenu dynamique est interpolé dans cette chaîne en toute sécurité. Voir Quoting Values and Identifiers pour les méthodes pour vous aider à le faire.

Remarque puisque vous utilisez Zend_Db_Table évidemment, troisième argument est le deuxième argument.En interne, l'instance de table va déléguer l'appel à l'adaptateur db avec le premier paramètre étant le nom de table de l'instance de la table.


En ce qui concerne Zend_View et XSS vecteurs d'attaque:

Zend_View est livré avec une première série de classes d'aide, dont la plupart se rapportent à former la génération d'éléments et d'effectuer la sortie appropriée échapper automatiquement.

Encore une fois dont la plupart ne signifie pas tout. Zend_View fournit Zend_View::escape() pour vous aider à assainir la sortie, mais ce n'est rien de spécial.

2

Le même concept est valable pour le Zend Framework et pour toutes les autres applications Web/bibliothèque/whatever qui manipulent des données utilisateur:

valident toujours l'entrée d'utilisateur. Ne faites pas confiance à .

Si vous attendez une chaîne, assurez-vous de recevoir une chaîne. Cela peut être réalisé en utilisant des bibliothèques de frameworks (par exemple, dans ce cas précis, vous utilisez le framework Zend) ou en implémentant manuellement des fonctions de validation.

La validation doit TOUJOURS être effectuée côté serveur. La validation côté client doit également être présente afin de fournir une meilleure expérience utilisateur. Dans le cas de Zend, veuillez vous reporter au manuel Validation page.

1

La liaison devrait empêcher l'injection SQL mais elle ne fait rien pour empêcher XSS. Vous devriez toujours filtrer vos données si nécessaire et lorsque vous faites écho à la sortie dans la vue, vous devriez échapper à tout ce qui pourrait être dangereux.

echo $this->escape($this->foo); 
+0

pouvons-nous l'utiliser dans le modèle avant d'enregistrer des données? –

1

Je vais vous suggérer l'utilisation de filtres Zend, partout où vous avez besoin de quelque chose de spécifique. Vous pouvez l'utiliser sur anypoint dans votre application.

Demande Paramètre

$alpha = new Zend_Filter_Alpha(); 
$name = $alpha -> filter($this -> _request -> getParam('name')); //while processing url parameters 

Database

$int = new Zend_Filter_Int(); 
$select -> where("id = ?", $int -> filter($id)); //during db processing also 

également sous forme des éléments. Je vais sauter ceci comme exemple de ceci peut être trouvé abudantly.

+0

Y a-t-il une fonction spécifique dans zend framework qui empêche toute injection sql et xss? –