【问题标题】:PHP retrieving an integer value from $_GETPHP 从 $_GET 中检索整数值
【发布时间】:2014-02-21 19:31:25
【问题描述】:

考虑一下以下情况。

www.example.com/post.php?delete=3

上面生成的链接会删除 id 为 3 的帖子。你可以想象,我会像这样检索 id:

$id = (int) $_GET['delete']; //casting to int to make sure that 
                             //the value is an integer - is  
                             //it safe enough?
if($user->isAdmin()) {

  //proceed with deletion from database - SQL queries, etc

}

我的问题:简单地将 $_GET 值转换为整数并完成它是否安全?我知道我们不应该将 GET 数据用于与数据库相关的操作,但总是这样吗? (假设isAdmin() 方法正确地检查了当前用户是否是管理员)。

这种$_GET 数据使用关于安全性的可能警告是什么?

【问题讨论】:

  • 如果您知道它应该是一个整数并且您的代码会检查零值,那么这是一个很好的做法。
  • 只要您不介意我手动将其更改为 4 或 5 或 6;你的保险箱
  • @crush 为什么intval() 超过(int)
  • 如果将非数字值转换为整数,则该值将为零。如果这被认为是有效值,那可能会也可能不会导致您的软件出现问题。如果它是一个有效值,那么强制转换可能会破坏事情或导致意外结果。
  • 好吧,看来我错了(经常发生)。 intval() 和转换为 int 是同义词。唯一的区别是intval() 允许您指定一个基数。

标签: php security get


【解决方案1】:

不,这不安全。

问题不在于值的转换,而是使用GET 而不是POST。如果您将链接用于删除选项,并且您的一位管理员使用例如安装了 fasterfox 扩展的 firefox,则所有链接都将被预取,从而有效地清除您的数据库或其中的一部分,具体取决于您显示的链接数量.

虽然我不认为链接预取很常见,但您确实应该使用POST 来避免它对您的系统造成的问题。

如果你不使用链接,切换到POST 会更容易,所以真的没有理由不这样做。

顺便说一句,如果你是paranoid over security,我假设你已经使用了准备好的语句,所以转换为int 无论如何都不会有太大的不同。

【讨论】:

  • 感谢您的评论。还有一个问题 - 使用 POST 并转换为整数是否安全?对我来说似乎是一个安全的解决方案。
  • @doitmyway 是的,但就像我说的,如果你使用准备好的语句,强制转换不会增加太多价值。虽然知道你正在处理什么样的变量总是很高兴....
  • 我用的是concrete5自带的ADO db层,所以我想应该是安全的。
【解决方案2】:

你的具体方法的安全性很好。

通过强制转换,您将输入限制为特定类型,这可以防止出现缺陷,假设您的系统不会在“-1”上中断,并且当您将“恶意软件”强制转换为 int 时 PHP 不会爆炸。

你看过 filter_var 吗?如果您有最新版本的 php,这也可以让您验证变量(除 int 和 int 范围之外的类型)。

【讨论】:

  • 我知道 filter_var。所需的值是一个整数 - 例如,我尽量不使用字符串的 GET 请求。
猜你喜欢
  • 2019-08-07
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多