Maison  >  Article  >  développement back-end  >  Analyse de la méthode de la stratégie de prévention des attaques XSS de Yii2

Analyse de la méthode de la stratégie de prévention des attaques XSS de Yii2

不言
不言original
2018-06-19 13:44:012120parcourir

Cet article présente principalement la stratégie de prévention des attaques XSS de Yii2. Il analyse plus en détail le principe de l'attaque XSS et la stratégie de prévention correspondante de Yii2. Les amis dans le besoin peuvent s'y référer

Cet article décrit la stratégie de prévention des attaques XSS de Yii2. exemple de stratégies de prévention des attaques Yii2 XSS. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

Réparation de vulnérabilité XSS

Principe : Ne faites pas confiance aux données saisies par le client
Remarque : Le code d'attaque n'est pas nécessairement dans < ;script>2cacc6d41bbb37262a98f745aa00fbf0

① Marquez les cookies importants comme http uniquement, afin que l'instruction document.cookie en Javascript ne puisse pas obtenir le cookie.
② Uniquement permettre aux utilisateurs de nous saisir les données attendues. Par exemple : dans la zone de texte Âge, les utilisateurs sont uniquement autorisés à saisir des chiffres. Les caractères autres que les chiffres sont filtrés.
③ Html Encode le traitement des données
④ Filtrez ou supprimez les balises HTML spéciales, telles que : script, iframe, bd908e9f3ad427276a829b98921f92c0 pour ", " pour
⑤ Filtrez l'étiquette des événements JavaScript. Par exemple "onclick=", "onfocus" etc.

Prévention XSS dans Yii

<?php echo CHtml::encode($user->name) ?>

Code source de cette méthode :

/**
* Encodes special characters into HTML entities.
* The [[\yii\base\Application::charset|application charset]] will be used for encoding.
* @param string $content the content to be encoded
* @param boolean $doubleEncode whether to encode HTML entities in `$content`. If false,
* HTML entities in `$content` will not be further encoded.
* @return string the encoded content
* @see decode()
* @see http://www.php.net/manual/en/function.htmlspecialchars.php
*/
public static function encode($content, $doubleEncode = true)
{
  return htmlspecialchars($content, ENT_QUOTES | ENT_SUBSTITUTE, Yii::$app->charset, $doubleEncode);
}

La différence entre htmlspecialchars & htmlentities & urlencode :

http://php.net/manual/zh/function.htmlspecialchars.php
http ://php.net/manual/zh/function.htmlentities.php
http://cn2.php.net/manual/zh/function.urlencode.php

Constantes des indicateurs disponibles
Description du nom de la constante
ENT_COMPAT Convertira les guillemets doubles et laissera les guillemets simples seuls.
ENT_QUOTES Convertira les guillemets doubles et simples.
ENT_NOQUOTES laissera les guillemets doubles et simples non convertis.
ENT_IGNORE Supprimer silencieusement séquences d'unités de code invalides au lieu de renvoyer une chaîne vide. L'utilisation de cet indicateur est déconseillée car cela peut avoir des implications en matière de sécurité.
ENT_SUBSTITUTE Remplacez les séquences d'unités de code invalides par un caractère de remplacement Unicode U+FFFD (UTF-8) ou FFFD ; sinon) au lieu de renvoyer une chaîne vide.
ENT_DISALLOWED Remplacez les points de code invalides pour le type de document donné par un caractère de remplacement Unicode U+FFFD (UTF-8) ou FFFD (sinon) au lieu de les laisser tels quels ; être utile, par exemple, pour garantir la bonne forme des documents XML avec du contenu externe intégré.
ENT_HTML401 Gérer le code comme HTML 4.01
ENT_HTML5 Gérer le code comme HTML 5.

htmlspecialchars.

Convertir les caractères spéciaux en entités HTML

string htmlspecialchars ( 
      string $string 
      [, int $flags = ENT_COMPAT | ENT_HTML401 
      [, string $encoding = ini_get("default_charset") 
      [, bool $double_encode = true ]
    ]
  ] 
)

Les traductions effectuées sont :

& (esperluette ) devient &

" (guillemet double) devient " lorsque ENT_NOQUOTES n'est pas défini.

' (guillemet simple) devient ' ( ou ') uniquement lorsque ENT_QUOTES est défini.
< (inférieur à) devient 6ad13de1db10159b32bcd264a61b3be1 (supérieur à) devient >

<?php
$new = htmlspecialchars("<a href=&#39;test&#39;>Test</a>", ENT_QUOTES);
echo $new; // <a href=&#39;test&#39;>Test</a>
?>

htmlentities

Convertir toutes les entités applicables caractères aux entités HTML

string htmlentities ( 
      string $string 
      [, int $flags = ENT_COMPAT | ENT_HTML401 
      [, string $encoding = ini_get("default_charset") 
      [, bool $double_encode = true ]
    ]
  ] 
)

<?php
$str = "A &#39;quote&#39; is <b>bold</b>";
// Outputs: A &#39;quote&#39; is <b>bold</b>
echo htmlentities($str);
// Outputs: A &#39;quote&#39; is <b>bold</b>
echo htmlentities($str, ENT_QUOTES);
?>

urlencode

Le codage de l'URL doit être conforme à la spécification de l'URL. Parce que dans la spécification d'URL standard, le chinois et de nombreux caractères ne sont pas autorisés à apparaître dans l'URL.

Par exemple, recherchez « tester les caractères chinois » dans Baidu. L'URL deviendra

http://www.baidu.com/s?wd=%B2%E2%CA%D4%BA%BA%D7%D6&rsv_bp=0&rsv_spt=3&inputT=7477


Donc -appelé le codage d'URL est le suivant : tous les caractères non alphanumériques seront remplacés par un signe de pourcentage (%) suivi de deux chiffres hexadécimaux, et les espaces seront codés sous forme de signes plus (+)

Sauf pour -_ Tous les caractères non alphanumériques. les caractères sont remplacés par un signe de pourcentage (%) suivi de deux chiffres hexadécimaux et les espaces sont codés sous forme de signe plus (+). Cet encodage est le même que l'encodage des données POST du formulaire WWW et le même encodage que le type de média application/x-www-form-urlencoded. Pour des raisons historiques, ce codage diffère du codage RFC1738 (voir rawurlencode()) dans les espaces de codage sous forme de signes plus (+).


<?php
echo &#39;<a href="mycgi?foo=&#39;, urlencode($userinput), &#39;">&#39;;
?>

<?php
$query_string = &#39;foo=&#39; . urlencode($foo) . &#39;&bar=&#39; . urlencode($bar);
echo &#39;<a href="mycgi?&#39; . htmlentities($query_string) . &#39;">&#39;;
?>

Ce qui précède est l'intégralité du contenu de ce article, j'espère qu'il sera utile à l'apprentissage de tout le monde. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !

Recommandations associées :

Comment implémenter le nettoyage du cache Yii


Comment gérer les liens de routage transférés dans Yii2. 0 Droiture du code de base


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn