【问题标题】:Is it safe to use $_SERVER["SCRIPT_NAME"]使用 $_SERVER["SCRIPT_NAME"] 是否安全
【发布时间】:2010-11-23 10:28:59
【问题描述】:

我不想将 GET 或 POST 变量传递给脚本。我想使用文件名并使用它从 php 脚本中查找产品,例如:

......./DELL1500.php ......./COMPAQ1213.php

我有三个问题:

  1. PHP从哪里获取$_SERVER["SCRIPT_NAME"]的数据是从服务器还是客户端浏览器?

  2. 谁能想到使用它的任何安全问题?

  3. 这无论如何都可能与任何旧浏览器不兼容。我假设它不是由服务器提供的?

【问题讨论】:

  • ohhhh...这就是你如何拼写“维护噩梦”...
  • 没有人认为“$_SERVER”是由服务器分配的..因此是全局变量?
  • 浏览器(和其他用户代理)可能会影响 $_SERVER 的某些内容(例如 $_SERVER['HTTP_ACCEPT']),因此如果不确定某个设置,最好询问而不是询问假设!

标签: php code-injection


【解决方案1】:

$_SERVER['SCRIPT_NAME'] 是服务器端的。结果不存在浏览器兼容性问题,也不应该存在安全问题,因为它只是表明服务器正在为请求的 URL 提供什么服务(即 http://example.com/http://example.com/index.php 都会导致 '/index.php') .

也就是说,在这个廉价、简单的数据库驱动网站时代,每个产品都有不同的 PHP 脚本让我觉得效率非常低。

【讨论】:

    【解决方案2】:

    我知道这是一篇旧帖子,但是在 Google 上快速搜索“PHP $_SERVER 安全性”后发现了这篇帖子,我简直不敢相信我所看到的。

    您应该编码并检查所有输入,无论您认为它有多安全。例如,HTTP_HOST 服务器变量是从客户端发送的请求的标头中读取的。 “客户端”可以是任何东西……不只是浏览器……例如,有人专门为模糊这些标头而编写的 PERL/python 脚本。

    来自 PHP 文档(再次)...

    'HTTP_HOST'

    Contents of the Host: header from the current request, if there is one.
    

    客户端请求中几乎总是有一个 HTTP_HOST。这不是唯一的变量,Apache 和 PHP 不会为您清理/编码这些变量。您应该始终对所有输入进行编码和检查,包括“由服务器生成的。

    <?php
    $server = array();
    foreach($_SERVER as $k => $v)
      $server[urlencode($k)] = urlencode($v);
    
    if(!preg_match("...", "...", $server["X"]))
      exit;
    
    ?>
    

    请记住,永远不要假设应用程序的输入是安全的。懒惰是不值得的——只是编码和检查一切,不管别人怎么想。

    【讨论】:

      【解决方案3】:

      我认为没有安全问题,它是在服务器上创建的,因此它不依赖于客户端浏览器。我想你可以使用它。

      【讨论】:

        【解决方案4】:

        PHP.net

        $_SERVER 是一个包含诸如标题、路径和脚本位置等信息的数组。此数组中的条目由 Web 服务器创建。无法保证每个 Web 服务器都会提供其中任何一个;服务器可能会省略一些,或提供此处未列出的其他内容。

        它应该是完全安全的,因为它是由服务器生成的。就个人而言,我总是对来自超级全球的任何东西进行消毒,不管它应该有多安全。

        【讨论】:

          猜你喜欢
          • 2011-06-14
          • 2014-06-18
          • 2011-09-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-03
          • 2023-04-10
          • 2016-03-03
          相关资源
          最近更新 更多