PHP_SELF和XSS

McR*_*ald 30 php xss

我发现一篇声称$_SERVER['PHP_SELF']易受XSS攻击的文章.

我不确定我是否理解它,但我几乎可以肯定这是错的.

这怎么会容易受到XSS攻击!?

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  <!-- form contents -->
</form>
Run Code Online (Sandbox Code Playgroud)

Joh*_*nde 32

为了使用安全,您需要使用htmlspecialchars().

<?php echo htmlspecialchars($_SERVER["PHP_SELF"], ENT_QUOTES, "utf-8"); ?>
Run Code Online (Sandbox Code Playgroud)

请参阅我曾编写的几乎所有PHP表单中的XSS漏洞,了解如何$_SERVER["PHP_SELF"]攻击.

  • 一些解释(为什么不执行此操作不安全?)将受到高度赞赏 (22认同)

Flo*_*ima 26

这确实是一个XSS漏洞.我确实理解您认为它可能不会损害您的网站,但这并不意味着它不是真实的.

如果您不相信,请尝试以下方法:

我们假设您有一个页面,例如"registration.php".我们假设您有一个表单,其中的操作是:

<?php echo $_SERVER['PHP_SELF']; ?>
Run Code Online (Sandbox Code Playgroud)

你确实放下了它:

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  <!-- form contents -->
</form>
Run Code Online (Sandbox Code Playgroud)

现在只需将字符串附加到下方

%27%22/%3E%3Cscript%3Ealert(1)%3C/script%3E
Run Code Online (Sandbox Code Playgroud)

实际上并不难理解,因为PHP_SELF它是URL的反映,您的应用程序将读取您放入URL中的任何内容并回显它.这很简单.

htmlspecialchars应该处理此事,没有理由对证据提出异议.

<form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>">
   <!-- form contents -->
</form>
Run Code Online (Sandbox Code Playgroud)

然而,即使这是加工饼干的第一步,也不是它自动发生.即使是很容易工艺的攻击(如攻击者在你的网站上注册,并会看到饼干的样子...等),一系列其他因素必须是真实的去有一个cookie棒磨点情况.例如,cookie不得过期.而不是取决于cookie的复杂程度.可能你在服务器上有其他预防措施,它不必是基于cookie的存在的所有身份验证!

虽然我相信这是相当困难的,非常糟糕的编程所有条件满足(即使yahoo.mail例如有这样一个漏洞,如果你看看互联网上,你会发现即使是开发和cookie的解码器),该XSS是真实的,谁知道如果你的网站遭受狡猾的攻击者可能会做什么.治愈很简单......


chx*_*chx 17

您链接的文章为您提供:

http://www.example.com/form.php/%22%3E%3Cscript%3Ealert(‘xss attack’)%3C/script%3E%3Cbr%20class=%22irrelevant
Run Code Online (Sandbox Code Playgroud)

什么不清楚?

编辑:这是一个XSS攻击,因为我可以隐藏从我的网站到你的网站的链接,一些JS添加到URL,它发送给我你的cookie,所以当你点击该链接,你是pwnd.

  • 麦克唐纳,你知道什么是XSS吗? (11认同)
  • @McRonald:阅读[这里的第一行](http://en.wikipedia.org/wiki/Cross-site_scripting),它描述了这个答案中到底发生了什么. (3认同)

Ada*_*wen 5

您应该使用filter_input()来访问PHP中的超全局变量。如果将过滤器设置为FILTER_SANITIZE_FULL_SPECIAL_CHARS,它将去除XSS中通常使用的不安全字符。给出您的示例:

<form method="post" 
    action="<?php filter_input(INPUT_SERVER, 'PHP_SELF', FILTER_SANITIZE_FULL_SPECIAL_CHARS); ?>">
<!-- form contents -->
</form>
Run Code Online (Sandbox Code Playgroud)