在将服务器变量回显到页面时,我是否已覆盖所有安全基础?

时间:2009-03-05 05:38:02

标签: php security xss

我总是使用表格

<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攻击,或者我应该使用更白名单的方法,例如只允许使用字母数字字符,正斜杠,问号,等号,括号等的正则表达式?

谢谢!

5 个答案:

答案 0 :(得分:6)

使用htmlspecialchars代替strip_tags

答案 1 :(得分:3)

如果你想引用相同的模式/主机/路径,那么一个简单的动作=“?”应该足够了。 根据{{​​3}}

relative-ref  = relative-part [ "?" query ] [ "#" fragment ]

      relative-part = "//" authority path-abempty
                    / path-absolute
                    / path-noscheme
                    / path-empty

这是一个有效的亲戚。

答案 2 :(得分:2)

将表单发送给自己:

$_SERVER["PHP_SELF"]

该全局变量将输出当前页面。除非你有理由需要整个查询字符串吗?

修改

由于VolkerK在评论中指出,即使PHP_SELF容易受到攻击,您也可以根据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;

答案 3 :(得分:0)

如果您的striptags()仅剥离标记(“&lt;”和“&gt;”之间的字符,包括尖括号),则有人仍可以注入javascript:

http://www.mysite.com/page-with-form.php?bla=" onsubmit="return function(){ /*nasty code here*/ }()" style="

更好地将HTML,Javascript和CSS中的每个可能元字符列入白名单(即尖括号,括号,大括号,分号,双引号,单引号等)。

答案 4 :(得分:0)

如果您希望表单提交给自己,请将操作留空,例如

<form action="" method="POST">
...
</form>