如何防范此类攻击?
How to protect against this type of attack?
我最近让某人 运行 对一个应用程序进行了渗透测试,它发现的一个关键问题是当一些垃圾在 URL 中传递时,如下所示:
http://example.com/index.php/
%27%3e%3c%69%4d%67%20%53%72%43%3d%78%20%4f%6e%45%72%52%6f%52%3d%61%6c%65%
72%74%28%34%37%34%31%32%29%3e
问题在于,攻击者只是添加了一个斜杠,然后添加了一些编码的 javascript(带有警告框的图像标签),这会杀死该页面。简单有效的攻击。
我该如何针对它进行编码?我已经在清理所有预期的用户输入(例如当用户通过 index.php?id=<script>alert(1)</script>
时)。那部分工作正常。
如何防止上面第一段下面引用的意外数据? (另外,这种XSS攻击有具体的名称吗?)
我在 href
标签中使用了 $_SERVER['PHP_SELF']
,所以这就是触发 JavaScript 的地方。
解决方法很简单。我 运行 PHP_SELF
在使用前通过过滤器,任何通过的垃圾都会被清除并可以在页面上安全使用。
小心使用$_SERVER['PHP_SELF]
你应该htmlspecialchars($_SERVER["PHP_SELF"]);
或htmlentities($_SERVER["PHP_SELF"]);
这是一次正常的 XSS 攻击。
更多信息:
Info
前面的答案已经可以了,但是由于某些原因htmlspecialchars()
没有过滤单引号。如果您需要过滤单引号,您需要在 htmlspecialchars($_SERVER["PHP_SELF"], ENT_QUOTES)
中添加一个参数
strip_tags()
函数可能会有所帮助。
例如:
$str = 'index.php?id=<script>alert(1)</script>';
echo "<pre>";
echo strip_tags($str), "\n";
以上将输出:
index.php?id=alert(1)
How do I protect against unexpected data quoted below the first
paragraph above?
filter_input( INPUT_SERVER, 'PHP_SELF', FILTER_SANITIZE_FULL_SPECIAL_CHARS );
感谢 @Sverri M. Olsen
解释为什么使用 filter_input
而不是 superglobals
Also, is there a specific name for this type of XSS attack?
这是存储型 XSS。黑客可以构造自定义查询,通过存储恶意代码来攻击用户。
@Sandeep Nair 解释了 Stored XSS 和 Reflected XSS[=16 之间的区别=]
我最近让某人 运行 对一个应用程序进行了渗透测试,它发现的一个关键问题是当一些垃圾在 URL 中传递时,如下所示:
http://example.com/index.php/
%27%3e%3c%69%4d%67%20%53%72%43%3d%78%20%4f%6e%45%72%52%6f%52%3d%61%6c%65%
72%74%28%34%37%34%31%32%29%3e
问题在于,攻击者只是添加了一个斜杠,然后添加了一些编码的 javascript(带有警告框的图像标签),这会杀死该页面。简单有效的攻击。
我该如何针对它进行编码?我已经在清理所有预期的用户输入(例如当用户通过 index.php?id=<script>alert(1)</script>
时)。那部分工作正常。
如何防止上面第一段下面引用的意外数据? (另外,这种XSS攻击有具体的名称吗?)
我在 href
标签中使用了 $_SERVER['PHP_SELF']
,所以这就是触发 JavaScript 的地方。
解决方法很简单。我 运行 PHP_SELF
在使用前通过过滤器,任何通过的垃圾都会被清除并可以在页面上安全使用。
小心使用$_SERVER['PHP_SELF]
你应该htmlspecialchars($_SERVER["PHP_SELF"]);
或htmlentities($_SERVER["PHP_SELF"]);
这是一次正常的 XSS 攻击。
更多信息: Info
前面的答案已经可以了,但是由于某些原因htmlspecialchars()
没有过滤单引号。如果您需要过滤单引号,您需要在 htmlspecialchars($_SERVER["PHP_SELF"], ENT_QUOTES)
strip_tags()
函数可能会有所帮助。
例如:
$str = 'index.php?id=<script>alert(1)</script>';
echo "<pre>";
echo strip_tags($str), "\n";
以上将输出:
index.php?id=alert(1)
How do I protect against unexpected data quoted below the first paragraph above?
filter_input( INPUT_SERVER, 'PHP_SELF', FILTER_SANITIZE_FULL_SPECIAL_CHARS );
感谢 @Sverri M. Olsen
解释为什么使用 filter_input
而不是 superglobals
Also, is there a specific name for this type of XSS attack?
这是存储型 XSS。黑客可以构造自定义查询,通过存储恶意代码来攻击用户。
@Sandeep Nair 解释了 Stored XSS 和 Reflected XSS[=16 之间的区别=]