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

StackOverflow https://stackoverflow.com/questions/613680

  •  03-07-2019
  •  | 
  •  

我总是使用表格

<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>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top