如何使用HTML/PHP防止XSS?

如何使用HTML/PHP防止XSS?,php,xss,Php,Xss,如何防止仅使用HTML和PHP的XSS(跨站点脚本) 我已经看过很多关于这个主题的其他帖子,但我还没有找到一篇文章明确而简洁地说明如何实际防止XSS。最重要的步骤之一是在处理和/或将任何用户输入返回浏览器之前对其进行清理。PHP有一些可以使用的“”函数 XSS攻击通常采用的形式是插入指向某些非现场javascript的链接,这些javascript包含用户的恶意意图。阅读更多关于它的信息 您还需要测试您的站点-我可以推荐Firefox插件[XSS Me]。现在看来是时候了。基本上,只要您想向浏览

如何防止仅使用HTML和PHP的XSS(跨站点脚本)


我已经看过很多关于这个主题的其他帖子,但我还没有找到一篇文章明确而简洁地说明如何实际防止XSS。

最重要的步骤之一是在处理和/或将任何用户输入返回浏览器之前对其进行清理。PHP有一些可以使用的“”函数

XSS攻击通常采用的形式是插入指向某些非现场javascript的链接,这些javascript包含用户的恶意意图。阅读更多关于它的信息


您还需要测试您的站点-我可以推荐Firefox插件[XSS Me]。现在看来是时候了。

基本上,只要您想向浏览器输出来自用户输入的内容,就需要使用该功能。

使用此功能的正确方法如下:

echo htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
谷歌代码大学也有关于网络安全的教育视频:


按优先顺序:

  • 如果您使用的是模板引擎(如Twig、Smarty、Blade),请检查它是否提供上下文相关转义。根据经验我知道细枝是这样的<代码>{{var|e('html_attr')}
  • 如果要允许HTML,请使用。即使您认为您只接受Markdown或StructuredText,您仍然希望净化这些标记语言输出的HTML
  • 否则,请使用
    htmlentities($var,ENT_QUOTES | ENT_HTML5,$charset)
    ,并确保文档的其余部分使用与
    $charset
    相同的字符集。在大多数情况下,
    'UTF-8'
    是所需的字符集
  • 另外,请确保您是正确的。

    ]*+>#iu'、“$1>”、$data);
    //删除javascript:和vbscript:协议
    (a-z)目前,[\x00-\x20,,[\x00-\x20,,[\x00-\x20,,[[[,“““,””...[[[[,,,[[x00-\x20-\x00-\x20][[[[[[0]数据]将会]将在未来一个,,,[[[a.[[[a-a-a-a-a-a-a-0.......[[[0]将会]将会]将会]将将将会取代取代取代取代,,,,,,[孕孕孕孕孕孕孕孕孕孕,[未来未来会取代取代取代取代取代取代取代取代取代取代取代,,,,,,,,,,,[[[[[a....[[[[[[[[[a.........[[[[[[[[[3]会]会]将,,,[[Avascript…,$data);
    $data=preg\u replace(“#([a-z]*)[\x00-\x20]*=([\'“]*)[\x00-\x20]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:\x00-\x20]:\x00-\x20]:\x00-\x00-\x20]*,$1,$ovbscript=”;
    $data=preg\u replace(“#([a-z]*)[\x00-\x20]*=([\'”]*)[\x00-\x20]*-moz绑定[\x00-\x20]*::#u',“$1=$2nomozbinding…”,$data);
    //仅适用于IE:
    $data=preg#u replace(“#”(]+?)样式[\x00-\x20]*=[\x00-\x20]*[`\'”]*.*?表达式[\x00-\x20]*\([^>]*+>\i',“$1>”,$data);
    $data=preg#u replace(“#(]+?)样式[\x00-\x20]*=[\x00-\x20]*[`\'”]*.*?行为[\x00-\x20]*\([^>]*+>\i',“$1>”,$data);
    $data=preg\u replace('#(]+?)样式[\x00-\x20]*=[\x00-\x20]*[`''''''']*.*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[\x00-\x00-\x20]*:*[\x00-\x00-\x20]*:[\x00-\x20]*:[\x00-\x00-\x20]]++++\x0]、''''''>;
    //删除命名空间元素(我们不需要它们)
    $data=preg#U replace(“#]*+>#i',“$data”);
    做
    {
    //删除真正不需要的标签
    $old_data=$data;
    $data=preg#U replace(“#]*+>#i',“$data”);
    }
    while($old_data!==$data);
    //我们完了。。。
    返回$data;
    }
    
    您还可以通过
    头(…)设置一些与XSS相关的HTTP响应头。

    X-XSS-保护“1;模式=块”

    可以肯定的是,浏览器XSS保护模式已启用

    内容安全策略“默认src'self';…”

    启用浏览器端内容安全。有关内容安全策略(CSP)的详细信息,请参阅此项: 特别是设置CSP来阻止内联脚本和外部脚本源,这对XSS很有帮助


    有关Web应用程序安全性的常用HTTP响应头,请查看OWASP:

    PHP
    上使用
    htmlspecialchars
    。在HTML上,请尽量避免使用:

    element.innerHTML=“…”;
    element.outerHTML=“…”;
    文件。编写(…);
    document.writeln(…);

    其中,
    var
    由用户控制

    显然,也要避免
    eval(var)
    , 如果您必须使用其中任何一个,请尝试JS转义它们,HTML转义它们,您可能需要做更多的工作,但对于基础来说,这应该足够了。

    交叉发布这篇文章,作为即将脱机的SO文档测试版的合并参考

    问题 跨站点脚本是web客户端无意中执行远程代码。如果任何web应用程序从用户处获取输入并直接在网页上输出,则可能会将自身暴露于XSS。如果输入包括HTML或JavaScript,则可以在web客户端呈现此内容时执行远程代码

    例如,如果第三方包含JavaScript文件:

    // http://example.com/runme.js
    document.write("I'm running");
    
    PHP应用程序直接输出传入的字符串:

    <?php
    echo '<div>' . $_GET['input'] . '</div>';
    
    将输出:

    <div>&lt;script src=&quot;http://example.com/runme.js&quot;&gt;&lt;/script&gt;</div>
    
    任何恶意输入都将转换为编码的URL参数

    使用专门的外部库或OWASP反艾米列表 有时你会想发送HTML或其他类型的代码输入。你需要维护一个授权单词列表(白名单)和未授权单词列表(黑名单)

    您可以从下载标准列表。每个列表都适合于特定类型的交互(ebay api、tinyMCE等),并且是开源的

    现有的一些库可以过滤HTML并防止XSS攻击(针对一般情况),至少可以执行简单易用的反垃圾邮件列表。
    例如,您有许多框架以各种方式帮助处理XSS。当您使用自己的框架或存在某些XSS问题时,我们可以利用(在PHP5>=5.2.0、PHP7中提供) 我通常会将此代码段添加到我的SessionController中,因为在任何其他控制器与数据交互之前,所有调用都会通过该代码段。通过这种方式,所有用户输入都会在一个中心位置进行清理。如果这是在项目开始时或数据库中毒之前完成的,则在输出时不应出现任何问题。。。把垃圾收起来,装束
    <div><script src="http://example.com/runme.js"></script></div>
    
    <?php
    echo '<div>' . htmlspecialchars($_GET['input']) . '</div>';
    // or
    echo '<div>' . filter_input(INPUT_GET, 'input', FILTER_SANITIZE_SPECIAL_CHARS) . '</div>';
    
    <div>&lt;script src=&quot;http://example.com/runme.js&quot;&gt;&lt;/script&gt;</div>
    
    <script src="http://example.com/runme.js"></script>
    
    <?php
    $input = urlencode($_GET['input']);
    // or
    $input = filter_input(INPUT_GET, 'input', FILTER_SANITIZE_URL);
    echo '<a href="http://example.com/page?input="' . $input . '">Link</a>';
    
    /* Prevent XSS input */
    $_GET   = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING);
    $_POST  = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
    /* I prefer not to use $_REQUEST...but for those who do: */
    $_REQUEST = (array)$_POST + (array)$_GET + (array)$_REQUEST;
    
    //xss mitigation functions
    function xssafe($data,$encoding='UTF-8')
    {
       return htmlspecialchars($data,ENT_QUOTES | ENT_HTML401,$encoding);
    }
    function xecho($data)
    {
       echo xssafe($data);
    }
    
    htmlentities($target, ENT_QUOTES, 'UTF-8');