【问题标题】:Security: $_SERVER array sql injection in PHP安全性:PHP 中的 $_SERVER 数组 sql 注入
【发布时间】:2015-02-24 18:11:48
【问题描述】:

我编写了一个 PHP 函数,它记录 $_SERVER 数组中的所有内容,如果我的数据库中不存在某个特定的 $_SERVER 变量,它将添加该列。

我的问题是:这听起来有多安全?在研究和理解标题信息之后,出现了一些问题。

  1. 客户端能否修改发送到服务器的某些变量,它们的浏览器代理或操作系统?
  2. 从自己的服务器托管网站的人能否将代码插入到他们自己的自定义 $_SERVER 数组中?

总的来说,我只是在问这听起来有多安全,但这是我首先想到的问题。

如果您发现我提出这个问题的方式有任何问题,请在投反对票之前发表评论,我会立即更改。

【问题讨论】:

  • 网络服务器确定$_SERVER 中的内容,如果您信任您的网络服务器,您就可以信任$_SERVER。为什么要在$_SERVER 中记录所有内容?大部分都是无用的信息。
  • 只是为了我自己的统计和好奇。它将在数百个网络服务器上运行,其中一些我不知道它的所有者。
  • 这听起来是个坏主意。我不会做你想做的事。对于您要解决的任何问题,我都会寻找不同的解决方案。
  • 我不是一定要解决问题,我只是想收集信息。您是否有任何特定的原因会让您认为这不安全?

标签: php security header-injection


【解决方案1】:

$_SERVER 可以被信任。 $_SERVER['HTTP_USER_AGENT'] 包含一个易于用户配置的字符串 - 可以进行 SQL 注入。甚至还有为此目的的浏览器插件。事实上,有很多$_SERVER 的变量可以由用户更改,例如$_SERVER['HTTP_ACCEPT_LANGUAGE']

看看Chrome插件ModHeader

【讨论】:

  • 这个答案正是我想要的!所以这是我的后续问题:假设我使用准备好的语句或转义字符串将数据存储在我的 SQL 服务器中,我是否仍然容易受到注入的攻击?我知道它对数据倾斜没有任何作用......
  • 我在我的项目中使用prepared statements。使用准备好的语句时,您不会受到 SQL 注入的攻击,请参阅我链接到的答案以获取更多信息。
【解决方案2】:

PHP 使用 $_SERVER 变量来返回有关基于服务器的信息的信息,它不是存储数据的地方。老实说,还是第一次听说有人想用$_SERVER superglobal 来存储数据。也许你应该使用 $_SESSION ?如果数据库不是一个选项,我认为这是存储数据的正确方法......

每次重新加载页面时,$_SERVER 数组似乎都会刷新。 @ByteHamster 指出的 $_SERVER 变量中的一些值可以被篡改。

关键是您正在尝试使用不是为此目的而设计的东西......

【讨论】:

  • 我不是用它来存储数据,只是收集它并将其存储到 SQL 服务器中,然后再对其进行分析。不过还是谢谢你的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-21
  • 2011-08-14
  • 1970-01-01
  • 2015-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多