gpt4 book ai didi

php - 在 PHP 的 SQL 查询中将变量转换为整数

转载 作者:可可西里 更新时间:2023-11-01 07:05:16 25 4
gpt4 key购买 nike

首先,我完全了解 SQL injection vulnerabilities 并且我将 PDO 用于我用 PHP 开发的较新的应用程序。

长话短说,我工作的组织目前无法委派任何人力资源来将我目前正在处理的相当大的应用程序的所有内容都切换到 PDO,所以我坚持同时使用 mysql_* 函数。

无论如何,我想知道使用数据验证函数来“清理”内插查询中使用的数字 参数是否安全。我们确实对字符串使用 mysql_real_escape_string()(是的,我也知道那里的限制)。这是一个例子:

public function foo($id) {
$sql = "SELECT * FROM items WHERE item_id = $id";
$this->query($sql); // call mysql_query and does things with result
}

$id id 是用户通过 HTTP GET 提供的值,因此显然这段代码很容易受到攻击。如果我这样做可以吗?

public function foo($id) {

if (!ctype_digit($id)) {
throw new \InvalidArgumentException("ID must be numeric");
}

$sql = "SELECT * FROM items WHERE item_id = $id";
$this->query($sql); // call mysql_query and does things with result
}

据我所知,ctype_digit 与检查 \d+ 的正则表达式相同。

(还有 filter_var($id, FILTER_VALIDATE_INT),但它可能会返回 int(0),它在松散的条件下计算为 FALSE - 类型的比较,所以我必须在那里做 === FALSE。)

这个临时方案有什么问题吗?

更新:

  • 变量不仅包括主键,还包括booleantinyintintbigint 类型的任何字段> 等,这意味着零是一个完全可以接受的搜索值。
  • 我们正在使用 PHP 5.3.2

最佳答案

是的,如果您确实虔诚地使用正确的函数来验证数据并在数据不符合预期时正确地阻止查询运行,那么我看不出任何漏洞。 ctype_digit 有一个非常有限和明确的目的:

Returns TRUE if every character in the string text is a decimal digit, FALSE otherwise.

这个功能基本不会出问题,可以放心使用。它甚至会在空字符串上返回 false(自 PHP 5.1 起)。请注意,is_numeric 如此值得信赖。我可能仍会添加范围检查以确保数字在预期范围内,我不确定溢出整数会发生什么。如果您在此检查后额外转换为 (int),则没有注入(inject)的机会。

注意买者:与所有非本地参数化查询一样,如果您使用连接字符集进行任何恶作剧,仍然有注入(inject)的机会。 ctype_digit 可能漏掉的字节范围受到严格限制,但您永远不知道会出现什么。

关于php - 在 PHP 的 SQL 查询中将变量转换为整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24257675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com