2010-08-09 4 views
7

Comment éviter les attaques par script intersites?Comment éviter les "attaques de script intersite"

Cross-site script attacks (ou script cross-site) est par exemple si vous avez un livre d'or sur votre page d'accueil et un message client un code javascript qui fx vous redirige vers un autre site ou envoie vos cookies dans un e-mail à un utilisateur malveillant ou il pourrait y avoir beaucoup d'autres choses qui peuvent s'avérer être vraiment dangereux pour vous et les personnes visitant votre page.

Je suis sûr que cela peut être fait fx. dans PHP par la validation des formes mais je ne suis pas assez expérimenté pour fx. ban javascript ou d'autres choses qui peuvent vous nuire.

J'espère que vous comprenez ma question et que vous êtes en mesure de m'aider.

+0

Cadre cible? PHP? – Arthur

+0

Il existe des options pour tout langage/framework/etc. Vous obtiendrez des réponses plus spécifiques - comme htmlencode - si vous fournissez plus d'informations sur votre configuration. (Empiler). – Tobiasopdenbrouw

+0

Vous avez raison, Tobiasopdenbrouw, mais c'était en fait plus comme une question générale que d'autres personnes pourraient aussi en tirer :) – Latze

Répondre

12

Je suis sûr que cela peut être fait fx. en PHP en validant des formulaires

Pas vraiment. L'étape d'entrée est entièrement le mauvais endroit pour traiter les problèmes XSS.

Si l'utilisateur tape, disons <script>alert(document.cookie)</script> dans une entrée, il n'y a rien de mal à cela en soi. Je l'ai juste fait dans ce message, et si StackOverflow ne l'autorisait pas, nous aurions beaucoup de mal à parler de JavaScript sur le site! Dans la plupart des cas, vous souhaitez autoriser toute entrée (*), afin que les utilisateurs puissent utiliser un caractère < pour signifier littéralement un signe inférieur. Le fait est que, lorsque vous écrivez du texte dans une page HTML, vous devez l'échapper correctement pour le contexte dans lequel il va. Pour PHP, cela signifie que l'utilisation htmlspecialchars() à l'étage de sortie :

<p> Hello, <?php echo htmlspecialchars($name); ?>! </p> 

[indice PHP: vous pouvez vous définir une fonction avec un nom plus facile à faire echo htmlspecialchars, puisque cela est tout à fait beaucoup de taper à faire tous les temps que vous voulez mettre une variable dans du code HTML.]

Ceci est nécessaire, peu importe d'où vient le texte, qu'il provienne d'un formulaire soumis par l'utilisateur ou non. Alors que les données soumises par les utilisateurs sont l'endroit le plus dangereux pour oublier votre encodage HTML, le fait est que vous prenez une chaîne dans un format (texte brut) et l'insérez dans un contexte dans un autre format (HTML).Chaque fois que vous lancez du texte dans un contexte différent, vous aurez besoin d'un schéma d'encodage/d'échappement approprié à ce contexte. Par exemple si vous insérez du texte dans un littéral de chaîne JavaScript, vous devrez échapper le caractère de citation, la barre oblique inverse et les retours à la ligne. Si vous insérez du texte dans un composant de requête dans une URL, vous devrez convertir la plupart des caractères non alphanumériques en séquences %xx. Chaque contexte a ses propres règles; vous devez savoir quelle est la bonne fonction pour chaque contexte dans votre langue/cadre choisi. Vous ne pouvez pas résoudre ces problèmes en mangeant des soumissions de formulaire à l'étape de saisie - bien que de nombreux programmeurs PHP naïfs essaient, ce qui explique pourquoi tant d'applications gâchent votre entrée dans les cas de coin et ne sont toujours pas sécurisées.

(*: bien, presque tous.) Il y a un argument raisonnable pour filtrer les caractères de contrôle ASCII du texte soumis.Il est très peu probable que leur permettre de faire quelque chose.Out Bien sûr, vous aurez des validations spécifiques à l'application vous voulez faire, comme s'assurer qu'un champ e-mail ressemble à une adresse e-mail ou que les chiffres sont vraiment numériques.Mais ce n'est pas quelque chose qui peut être appliqué à toutes les entrées pour vous sortir du pétrin.

9

Les attaques par script inter-site (XSS) se produisent lorsqu'un serveur accepte l'entrée du client et écrit ensuite aveuglément cette entrée sur la page. La plupart de la protection contre ces attaques implique l'échappement de la sortie, de sorte que le Javascript se transforme en HTML brut. Une chose à garder à l'esprit est que ce ne sont pas seulement les données provenant directement du client qui peuvent contenir une attaque. Une attaque stockée XSS consiste à écrire du code JavaScript malveillant dans une base de données, dont le contenu est ensuite interrogé par l'application Web. Si la base de données peut être écrite séparément du client, l'application peut ne pas être en mesure d'être sûr que les données ont été correctement échappées. Pour cette raison, l'application Web doit traiter TOUTES les données qu'elle écrit au client comme si elles pouvaient contenir une attaque.

Voir ce lien pour une ressource complète sur la façon de vous protéger: http://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet

+0

Bon point - je vois beaucoup trop parler d'un "nettoyage des entrées", alors qu'en réalité ce n'est pas toujours possible ou même sage, et il ne résout pas complètement le problème de toute façon. Les solutions doivent se produire au moment de la sortie. En outre, il est important de noter que le HTML n'est pas le seul contexte vulnérable - SQL Injection est vraiment juste une variation sur le même thème. – Pointy

+0

Validation des entrées, sorties d'échappement –

Questions connexes