Php 哪些$\u服务器变量是安全的?

Php 哪些$\u服务器变量是安全的?,php,security,Php,Security,用户可以控制的任何变量,攻击者也可以控制,因此是攻击源。这称为“受污染”变量,是不安全的 使用时,许多变量都可以控制PHP\u SELF,HTTP\u USER\u AGENT,HTTP\u X\u FORWARDED\u FOR,HTTP\u ACCEPT\u LANGUAGE以及许多其他内容都是客户端发送的HTTP请求头的一部分 有人知道服务器变量的“安全列表”或未受污染列表吗?没有“安全”或“不安全”值。只有服务器控制的值和用户控制的值,您需要知道值来自何处,从而知道它是否可以用于特定目的

用户可以控制的任何变量,攻击者也可以控制,因此是攻击源。这称为“受污染”变量,是不安全的

使用时,许多变量都可以控制
PHP\u SELF
HTTP\u USER\u AGENT
HTTP\u X\u FORWARDED\u FOR
HTTP\u ACCEPT\u LANGUAGE
以及许多其他内容都是客户端发送的HTTP请求头的一部分

有人知道服务器变量的“安全列表”或未受污染列表吗?

没有“安全”或“不安全”值。只有服务器控制的值和用户控制的值,您需要知道值来自何处,从而知道它是否可以用于特定目的<代码>$\u服务器['HTTP\u FOOBAR']例如,存储在数据库中是完全安全的,但我肯定不会
评估它

因此,让我们将这些值分为三类:

服务器控制 这些变量由服务器环境设置,完全取决于服务器配置

  • “网关接口”
  • “服务器地址”
  • “服务器软件”
  • 'DOCUMENT\u ROOT'
  • “服务器管理”
  • “服务器签名”
部分服务器控制 这些变量取决于客户端发送的特定请求,但只能接受有限数量的有效值,因为web服务器应拒绝所有无效值,而不会导致脚本的调用。因此,可以认为它们是可靠的

  • 'HTTPS'
  • “请求时间”
  • “远程地址”
    *
  • “远程主机”
    *
  • “远程端口”
    *
  • “服务器协议”
  • “HTTP\u主机”
  • “服务器名称”
  • “脚本文件名”
  • “服务器端口”
  • “脚本名称”
*通过TCP/IP握手验证,
远程
值保证为客户端的有效地址。这是任何响应都将发送到的地址
REMOTE_HOST
依赖反向DNS查找,因此可能会受到针对您服务器的DNS攻击的欺骗(在这种情况下,您会遇到更大的问题)。这个值可能是一个代理,这是TCP/IP协议的一个简单现实,您对此无能为力

†如果您的web服务器响应任何请求,而不考虑
主机
标题,则这也应视为不安全。请参阅。
另见

"看,

完全任意的用户控制值 这些值根本不需要检查,也不依赖于任何服务器配置,它们完全是客户端发送的任意信息

  • 'argv'
    'argc'
    (仅适用于CLI调用,通常不涉及web服务器)
  • “请求方法”
    §
  • “查询字符串”
  • 'HTTP\u ACCEPT'
  • 'HTTP\u ACCEPT\u CHARSET'
  • “HTTP\u接受\u编码”
  • “HTTP\u接受语言”
  • “HTTP\u连接”
  • 'HTTP\u REFERER'
  • “HTTP\u用户\u代理”
  • 'AUTH_TYPE'
    /
  • “PHP身份验证摘要”
  • 'PHP\u AUTH\u USER'
    /
  • 'PHP\u AUTH\u PW'
    /
  • “路径信息”
  • “原始路径信息”
  • “请求URI”
    (可能包含受污染的数据)
  • 'PHP_SELF'
    (可能包含受污染的数据)
  • “路径翻译”
  • 任何其他
    'HTTP.'
§只要web服务器只允许某些请求方法,就可以认为是可靠的

如果身份验证完全由web服务器处理,则可以认为是可靠的


超级全局
$\u服务器
还包括几个环境变量。它们是否“安全”取决于它们的定义方式(和位置)。它们可以是完全由服务器控制的,也可以是完全由用户控制的。

在PHP中,每个
$\u服务器
变量(以
HTTP.
开头)都会受到用户的影响。例如,变量
$\u SERVER['HTTP\u REINERS']
可以通过将HTTP头
REINERS
设置为HTTP请求中的任意值而受到污染。

取决于您如何定义“安全”。这些值都是安全的,这只取决于您使用它们的目的。我认为在这种情况下,Rook说的是“哪些服务器变量不能被用户欺骗”,例如
REMOTE\u ADDR
。任何以
HTTP\u
开头的内容都是请求头,可以由浏览器或代理在两者之间进行设置。我会把这些当作其他用户输入。@ Bob驱逐舰Read Tead AdDR是直接从Apache的TCP套接字中提取的,这个值不会因为三路握手而在互联网上被欺骗。我想提到“欺骗”,我更倾向于旧的ip欺骗行为本身,而不是伪造
REMOTE\u ADDR
的实际价值。这将超出这个问题的范围。很高兴了解这个值是如何设置的,所以谢谢你。@Rook,但正如我所说的,这完全取决于你如何使用它。价值观本身既不安全也不安全,这取决于你使用它们的目的。即使是从恶意用户发送的数据也是完全安全的,只要您不做任何可能危害您安全的事情。@Rook:您对“安全”的想法使这个问题看起来有点武断,特别是因为它完全与一个模糊的扩展或自定义版本的PHP相关联。当你说“不应该有”的时候