如何使用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”是所需的字符集。
另外,请确保。

您还可以通过header设置一些与XSS相关的HTTP响应头

X-XSS-Protection 1;模式=块

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

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

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

有关webapp安全性的常用HTTP响应头,请参阅OWASP:

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

element.innerHTML=“…”; element.outerHTML=“…”; 文件。写…; 书面文件

其中,var由用户控制

当然也要尽量避免使用evalvar, 如果您必须使用其中任何一个,那么请尝试JS转义、HTML转义,您可能还需要做更多的工作,但对于基础知识来说,这应该足够了。

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

问题 跨站点脚本是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或其他类型的代码输入。您需要维护一份授权词语白名单和未授权黑名单

您可以从网站下载标准列表。每个列表都适合特定类型的交互易趣api、tinyMCE等。。。。而且它是开源的

现有的一些库可以过滤HTML并防止XSS攻击(针对一般情况),至少可以执行简单易用的反垃圾邮件列表。
例如,您有许多框架以各种方式帮助处理XS。当您自己运行时,或者如果存在一些XSS问题,我们可以利用PHP5>=5.2.0和PHP7中的可用功能。 我通常会将此代码段添加到我的SessionController中,因为在任何其他控制器与数据交互之前,所有调用都会经过该代码段。通过这种方式,所有用户输入都在一个中心位置进行消毒。如果这是在项目开始时或数据库中毒之前完成的,那么在输出时不应该有任何问题……停止垃圾输入,垃圾输出

以上内容将删除所有HTML和脚本标记。如果您需要一个基于白名单的允许安全标记的解决方案,请查看

如果您的数据库已经中毒,或者您希望在输出时处理XSS,建议为echo创建自定义包装函数,并在输出用户提供的值的任何地方使用它:

//xss mitigation functions
function xssafe($data,$encoding='UTF-8')
{
   return htmlspecialchars($data,ENT_QUOTES | ENT_HTML401,$encoding);
}
function xecho($data)
{
   echo xssafe($data);
}

保护输入的最佳方法是使用htmlentities函数。 例如:


您可以获得更多信息。

我需要做什么来确保完全从中清理输入。是否有一个特定的字符/字符串需要我注意?@TimTim-否。所有用户输入都应该是
始终被视为天生的敌意。此外,内部数据员工、系统管理员等可能不安全。您应该使用日志日期和用户数据进行识别和监控,并进行解释。@TimTim:在大多数情况下,是的。然而,当您需要允许HTML输入时,事情变得有点棘手,如果是这种情况,我建议您使用@Alix Axel,那么您的答案是使用htmlspecialchars还是使用?如果您需要接受HTML输入,请使用HTML净化器,如果不使用htmlspecialchars.htmlspecialchars或htmlentities?在这里检查大多数时间它是正确的,但它不是那么简单。您应该考虑将不可信字符串放入HTML、Js、CSS中,并考虑将不可信的HTML放入HTML中。请注意:这并不能解决您可能希望将用户输入用作HTML属性的情况。例如,图像的源URL。这不是一种常见的情况,但很容易忘记。@MichaelMior这里有一个在href或src HTML属性中防止XSS的解决方案:有一篇很好的文章解释XSS以及如何在不同的语言(包括PHP)中防止XSS。您不应该使用preg_replace,因为它在输入中使用eval。此注释在输出而不是输入时仍然有效吗?考虑到跨应用程序堆栈处理输入的多种技术,您不认为输入可能是恶意的吗?是的,它仍然有效。您应该按原样存储它,然后在显示它时转义。如果您需要更新输出转义代码以减轻漏洞,那么最好存储未更改的、未混合的输入以更新单元测试。
<?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');