使用$ _SERVER ["SCRIPT_NAME"]是否安全

2 php code-injection

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

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

我有三个问题:

  1. PHP $_SERVER["SCRIPT_NAME"]从服务器或客户端浏览器获取数据的位置是什么?

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

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

cee*_*yoz 7

$_SERVER['SCRIPT_NAME']服务器端.因此没有浏览器兼容性问题,并且不应该存在安全问题,因为它只是指示服务器为请求的URL服务的内容(即http://example.com/http://示例. com/index.php都会导致'/index.php').

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


小智 5

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

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

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

'HTTP_HOST'

Contents of the Host: header from the current request, if there is one.
Run Code Online (Sandbox Code Playgroud)

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

<?php
$server = array();
foreach($_SERVER as $k => $v)
  $server[urlencode($k)] = urlencode($v);

if(!preg_match("...", "...", $server["X"]))
  exit;

?>
Run Code Online (Sandbox Code Playgroud)

请记住,永远不要假设应用程序的输入是安全的。不值得偷懒——只需编码并检查所有内容,不管其他人怎么想。