如何修复跨站点脚本(XSS)?我们可以使用 .htaccess 修复吗

Posted

技术标签:

【中文标题】如何修复跨站点脚本(XSS)?我们可以使用 .htaccess 修复吗【英文标题】:How to fix Cross Site Scripting (XSS)? can we fix using .htaccess 【发布时间】:2018-05-25 09:58:10 【问题描述】:

我无法修复我们网站上的跨站脚本 (XSS)。我正在清理输入。部分代码如下

$smecompname = $_POST['companyname'];
$companyname = strip_tags(trim($smecompname));
            $companyname = htmlspecialchars($companyname);
            $companyname = $this->validateInput($companyname);

protected function validateInput($data)   
$data = preg_replace('/[^\pArabic\dA-Za-z0-9 !@#%^&*_.-]/ui', ' ', $data);
    $data = htmlspecialchars($data);
    $data = html_entity_decode($data);

    return  $data;   

客户端正在使用某种测试工具,并且有评论是跨站点脚本 (XSS) 可能发生在站点上。请建议我还能做些什么来解决这个问题。

我们可以使用 .htaccess 文件解决此问题吗? 谢谢。

【问题讨论】:

如果有人告诉您您的网站对 XSS 攻击持开放态度,您应该询问他们“如何”并提供证据,这样您就可以更好地了解从哪里开始检查和修复您的代码。 如果测试团队将输入设置为 ()&%,则表单公司名称上有一个字段。有 985005 的警报提示,表示它的执行脚本。如果我们从浏览器中的 url 检查它不会发生,因为客户端验证已经到位。但是当他们检查一些工具时,它就会被执行。请指教 ()&%<acx><ScRiPt>prompt(985005)</ScRiPt> 的输入将使用该代码转换为 &amp %prompt 985005,这不会创建提示。输出的变量在哪里,它产生什么 html?您可以禁用客户端验证以进行测试,或发出您自己的发布请求,因为您不能依赖它来确保安全。 【参考方案1】:

我们可以利用 filter_input_array(在 php 5 >= 5.2.0, PHP 7 中可用。) 我通常会将此 sn-p 添加到我的 SessionController 中,因为在任何其他控制器与数据交互之前,所有调用都会通过那里。通过这种方式,所有用户输入都会在 1 个中心位置进行清理。 如果这是在项目开始时或在您的数据库中毒之前完成的,那么在输出时应该不会有任何问题...停止垃圾输入,垃圾输出。

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

http://php.net/manual/en/function.filter-input-array.php

【讨论】:

以上是关于如何修复跨站点脚本(XSS)?我们可以使用 .htaccess 修复吗的主要内容,如果未能解决你的问题,请参考以下文章

如何修复JSP表达式标记中的跨站点脚本(XSS)

请教关于使用appscan 检测"基于DOM的跨站点脚本"漏洞修复问题

通过 URL 进行跨站点脚本

XSS跨站脚本攻击

如何关闭跨站点脚本 (XSS) 筛选器

AMF和跨站点脚本漏洞混淆