当将一个服务器变量回显到页面时,我是否覆盖了所有安全基础?
题
我总是使用表格
<form method="post" action="<?php echo strip_tags($_SERVER['REQUEST_URI']); ?>">
让我的表格提交给自己。
如果有人链接到
,我会使用striptags()
http://www.mysite.com/page-with-form.php?bla="><script src="http://www.nasty.com/super-nasty.js"></script><a href="#
我是否已覆盖所有基础,以防止XSS攻击,或者我应该使用更白名单的方法,例如只允许使用字母数字字符,正斜杠,问号,等号,括号等的正则表达式?
谢谢!
解决方案
使用 htmlspecialchars
代替strip_tags
。
其他提示
如果要引用相同的架构/主机/路径,则只需要一个简单的操作= <!>“; <!>”; <!> schould就够了。 根据 http://tools.ietf.org/html/rfc3986#section-4.2
relative-ref = relative-part [ "?" query ] [ "#" fragment ] relative-part = "//" authority path-abempty / path-absolute / path-noscheme / path-empty
这是一个有效的亲戚。
将表单发送给自己:
$_SERVER["PHP_SELF"]
该全局变量将输出当前页面。除非你有理由需要整个查询字符串吗?
修改强>
由于VolkerK在评论中指出,即使PHP_SELF
易受攻击,您也可以根据<=>编写自己的小变量,然后将您知道不属于页面的URI的其余部分分解出来。像这样:
$file_ext = '.php'; //knowing what file extension your URI is
$page_on = $_SERVER["PHP_SELF"]; //grab this page, with all that junk
$page_huh = explode($file_ext, $page_on); //blow it apart based on file ext
$page_on = $page_huh[0].$file_ext; //attach the leg back onto the URI
echo $page_on;
如果您的striptags()
仅剥离标记(<!>“之间的字符<!> <!> <!>>和<!>”; <!> gt; <!>“;包括尖括号) ,有人仍然可以注入javascript:
http://www.mysite.com/page-with-form.php?bla=" onsubmit="return function(){ /*nasty code here*/ }()" style="
更好地将HTML,Javascript和CSS中的每个可能元字符列入白名单(即尖括号,括号,大括号,分号,双引号,单引号等)。
如果您希望表单提交给自己,请将操作留空,例如
<form action="" method="POST">
...
</form>
不隶属于 StackOverflow