【问题标题】:How "tamper proof" is the $_SERVER variable in php?php 中的 $_SERVER 变量如何“防篡改”?
【发布时间】:2010-11-22 16:31:13
【问题描述】:

通过信任 $_SERVER 变量数组的内容来使用 $_SERVER['PHP_SELF'] 获取 php 文件的名称,我会承担很大的安全风险吗?

【问题讨论】:

  • 您需要向我们提供更多详细信息。您正在查看哪个变量,您在什么情况下使用它?
  • @Aurel300,这本来是我的猜测,但我之前被愚弄了......
  • 你答错了。检查我的。

标签: php security tampering


【解决方案1】:

Many but not all of the $_SERVER variables are attacker controlled。例如,$_SERVER['SCRIPT_NAME'] 是安全的,而 $_SEVER['PHP_SELF'] 是一个不同的危险变量,并且通常是 xss 的来源:

<?php
echo $_SEVER['PHP_SELF'];
?>

概念验证:

http://localhost/self.php/<script>alert(/xss/)</script>

通过查看phpinfo,很容易看到此漏洞的实际作用。

【讨论】:

  • Rook,你能告诉我一些关于为什么 $_SEVER['PHP_SELF'] 是危险的以及为什么 $_SERVER['SCRIPT_NAME'] 是安全的文档吗?我不太了解 $_SERVER 中的不同值,想了解更多。
  • @Chris J,当然没问题 我假设您运行了我的 xss 漏洞示例。但也许更好的例子是 phpinfo:cgi.ccs.neu.edu/home/cgiadmin/examples/phpinfo.php/…
  • 哇,太棒了! $_SERVER['SCRIPT_NAME'] 是文件名,不再有,$_SEVER['PHP_SELF'] 可以强制将“/”作为其一部分文件名。很好的收获,谢谢!
【解决方案2】:

没有有效的特殊机制来保护这个变量。您可以像写入任何其他变量一样写入它。所以你必须像任何其他变量一样保护它免受篡改(禁用 register_globals,避免变量变量等)。那么你就可以信任它了。

作为一种解决方法,可以肯定的是,您可以在程序的早期定义自己的常量:

define('SCRIPT_FILENAME',$_SERVER['SCRIPT_FILENAME']);

并在可用的情况下使用预定义的常量,例如__FILE__.

【讨论】:

    【解决方案3】:

    来自the php.net manual:

    此数组中的条目由 Web 服务器创建。无法保证每个 Web 服务器都会提供其中任何一个;服务器可能会省略一些,或提供此处未列出的其他内容。

    因此,如果您知道所有有权更改服务器配置的用户(以及会话中可能修改变量内容的所有脚本),您就可以合理地确定 $_SERVER 变量的数据。

    【讨论】:

    • 请注意,这并不总是正确的。 $_SERVER['HTTP_HOST'] 可由用户更改。
    • 注意,合理当然。 OP 关注的是PHP_SELF,而不是HTTP_HOST。 :)
    【解决方案4】:

    一点也不,只要您不使用来自用户的数据,这实际上根本不会构成风险。也就是说,使用以下之一:

    echo __FILE__;
    // is the same as
    echo $_SERVER["SCRIPT_FILENAME"];
    
    echo $_SERVER["SCRIPT_NAME"];
    // SCRIPT_NAME contains just the path
    

    【讨论】:

    • 如果 "FILE" 在包含的文件中,则其工作方式不同。
    • 我没有检查,但我很确定 $_SERVER['SCRIPT_FILENAME'] 给出了请求脚本的路径,而__FILE__ 给出了它使用的文件的路径,即完全不同的东西。
    • 当然。虽然它在手册中。但无论如何,最重要的是获取包含文件的名称,而不是包含文件 - 打开的文件和更多包含的文件仍将相对于“父”文件的路径。
    猜你喜欢
    • 2011-10-06
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多