如何使用HTML/PHP防止XSS?
如何防止仅使用HTML和PHP的XSS(跨站点脚本)如何使用HTML/PHP防止XSS?,php,xss,Php,Xss,如何防止仅使用HTML和PHP的XSS(跨站点脚本) 我已经看过很多关于这个主题的其他帖子,但我还没有找到一篇文章明确而简洁地说明如何实际防止XSS。最重要的步骤之一是在处理和/或将任何用户输入返回浏览器之前对其进行清理。PHP有一些可以使用的“”函数 XSS攻击通常采用的形式是插入指向某些非现场javascript的链接,这些javascript包含用户的恶意意图。阅读更多关于它的信息 您还需要测试您的站点-我可以推荐Firefox插件[XSS Me]。现在看来是时候了。基本上,只要您想向浏览
我已经看过很多关于这个主题的其他帖子,但我还没有找到一篇文章明确而简洁地说明如何实际防止XSS。最重要的步骤之一是在处理和/或将任何用户输入返回浏览器之前对其进行清理。PHP有一些可以使用的“”函数 XSS攻击通常采用的形式是插入指向某些非现场javascript的链接,这些javascript包含用户的恶意意图。阅读更多关于它的信息
您还需要测试您的站点-我可以推荐Firefox插件[XSS Me]。现在看来是时候了。基本上,只要您想向浏览器输出来自用户输入的内容,就需要使用该功能。 使用此功能的正确方法如下:
echo htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
谷歌代码大学也有关于网络安全的教育视频:
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><script src="http://example.com/runme.js"></script></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><script src="http://example.com/runme.js"></script></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');