Heim >php教程 >PHP开发 >Analyse der Strategie zur Verhinderung von Yii2 XSS-Angriffen

Analyse der Strategie zur Verhinderung von Yii2 XSS-Angriffen

高洛峰
高洛峰Original
2016-12-23 16:46:421338Durchsuche

Dieser Artikel beschreibt die XSS-Angriffspräventionsstrategie von Yii2 anhand von Beispielen. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:

Reparatur von XSS-Schwachstellen

Grundsatz: Den vom Kunden eingegebenen Daten nicht vertrauen
Hinweis: Der Angriffscode ist nicht unbedingt in 3f1c4e4b6b16bbbd69b2ee476dc4f83a4c28f382be9c1f2b73aa7b7aacbd73ce Markieren Sie wichtige Cookies nur als http, damit die document.cookie-Anweisung in Javascript das Cookie nicht abrufen kann.
② Erlauben Sie Benutzern nur die Eingabe Daten, die wir erwarten. Beispiel: Im Textfeld „Alter“ dürfen Benutzer nur Zahlen eingeben. Andere Zeichen als Zahlen werden herausgefiltert.
③ HTML-Kodierungsverarbeitung von Daten
④ Filtern oder entfernen Sie spezielle HTML-Tags, wie zum Beispiel: script, iframe, becf6a6438ca278ebdafb803bbef3040, " für
⑤ Filtern Sie JavaScript-Ereignis-Tags. Zum Beispiel „onclick=", „onfocus" und so weiter.

XSS-Prävention in Yii

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

Quellcode:

/**
* 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);
}

htmlspecialchars & htmlentities & urlencode Der Unterschied zwischen den dreien:

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

Verfügbare Flag-Konstanten
Beschreibung des Konstantennamens
ENT_COMPAT Wandelt doppelte Anführungszeichen um und lässt einfache Anführungszeichen in Ruhe.

ENT_QUOTES Wandelt sowohl doppelte als auch einfache Anführungszeichen um.

ENT_NOQUOTES Lässt sowohl doppelte als auch einfache Anführungszeichen unkonvertiert.
ENT_IGNORE Verwirft ungültige Codeeinheitensequenzen stillschweigend Von der Verwendung dieses Flags wird abgeraten, da es Auswirkungen auf die Sicherheit haben kann.
ENT_SUBSTITUTE Ersetzen Sie stattdessen ungültige Code-Einheitensequenzen durch ein Unicode-Ersatzzeichen U+ FFFD (UTF-8) oder FFFD; der Rückgabe einer leeren Zeichenfolge.
ENT_DISALLOWED Ersetzen Sie ungültige Codepunkte für den angegebenen Dokumenttyp durch ein Unicode-Ersatzzeichen U+FFFD (UTF-8) oder FFFD; (andernfalls), anstatt sie unverändert zu lassen nützlich, um beispielsweise die Wohlgeformtheit von XML-Dokumenten mit eingebetteten externen Inhalten sicherzustellen.
ENT_HTML401 Behandeln Sie Code als HTML 4.01.
ENT_XML1 Behandeln Sie Code als XML 1.
ENT_XHTML Behandeln Sie Code als XHTML >



Die durchgeführten Übersetzungen sind:

& (kaufmännisches Und) wird zu &

" (doppeltes Anführungszeichen) wird zu ", wenn ENT_NOQUOTES nicht festgelegt ist.

' (einfaches Anführungszeichen). quote) wird nur dann zu ' (oder '), wenn ENT_QUOTES gesetzt ist.

618474613d03b6b5aeef1d7f5105f01e (größer als) wird zu >

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

htmlentities


Alle anwendbaren Zeichen in HTML-Entitäten konvertieren


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

urlencode

Die URL-Kodierung muss den URL-Spezifikationen entsprechen. Denn in der Standard-URL-Spezifikation dürfen Chinesisch und viele Zeichen nicht in der URL vorkommen.

Suchen Sie beispielsweise in Baidu nach „chinesische Schriftzeichen testen“. Die URL wird zu

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

string htmlentities (
      string $string
      [, int $flags = ENT_COMPAT | ENT_HTML401
      [, string $encoding = ini_get("default_charset")
      [, bool $double_encode = true ]
    ]
  ]
)
Also Die sogenannte URL-Kodierung lautet: Alle nicht alphanumerischen Zeichen werden durch ein Prozentzeichen (%) gefolgt von zwei hexadezimalen Ziffern ersetzt, und Leerzeichen werden als Pluszeichen (+) kodiert.

Alle nicht alphanumerischen Zeichen Zeichen werden durch ein Prozentzeichen (%) gefolgt von zwei hexadezimalen Ziffern ersetzt und Leerzeichen werden als Pluszeichen (+) kodiert. Diese Kodierung ist dieselbe wie die Kodierung von WWW-Formular-POST-Daten und dieselbe Kodierung wie der Medientyp application/x-www-form-urlencoded. Aus historischen Gründen unterscheidet sich diese Kodierung von der RFC1738-Kodierung (siehe rawurlencode()) darin, dass Leerzeichen als Pluszeichen (+) kodiert werden.

<?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);
?>

Ich hoffe, dass dieser Artikel für jedermann beim PHP-Programmdesign basierend auf dem Yii-Framework hilfreich sein wird.

Weitere Artikel zur Analyse der XSS-Angriffspräventionsstrategie von Yii2 finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn