PDO 和 SQL 注入问题
PDO and SQL Injection concerns
很抱歉标题有点不清楚,但我是新来的。我在 Whosebug 闲逛,遇到了一个答案,指出在执行 SQL 查询时,数据不应该直接输入 ($db->query("SELECT * FROM users WHERE id LIKE $id")
),而应该绑定在准备好的语句中 ($db->prepare("SELECT * FROM users WHERE id LIKE ?)->execute(array($id))
).
现在,我知道 SQL 注入,我应该使用类似于后者的代码,但我的问题是;是总是吗?就像,如果我有以下代码:
$db->query("SELECT * FROM products WHERE id LIKE $id")
假设 I 在我的代码中给出了 $id
,并且它不是来自用户的输入,我是否仍然需要使用准备好的陈述?或者我可以接受第一个例子吗?
这是安全的,因为您的代码将 $id
设置为文字常量值。无法使用不受信任的值。
$id = 123;
$db->query("SELECT * FROM products WHERE id LIKE $id");
这是安全的,因为进行类型转换消除了任何可能导致 SQL 注入问题的特殊字符的可能性。普通整数是安全的。
$id = (int) $_GET['id'];
$db->query("SELECT * FROM products WHERE id LIKE $id");
但事实仍然是,一旦您使用不同的方法编写查询,有时在字符串中使用变量扩展,有时使用绑定查询参数,您的代码将更难维护。
考虑这段代码的生命周期。您有多大信心接管此代码支持的下一位初级程序员会充分理解 SQL 注入的风险,以判断何时使用变量扩展是安全的,以及何时应该使用绑定查询参数?
当您想要将变量与 SQL 查询组合时,始终 使用绑定查询参数来建立编码标准会更安全,因为此编码标准是更容易记录和更容易执行。因此,不太可能意外允许不安全的情况。
很抱歉标题有点不清楚,但我是新来的。我在 Whosebug 闲逛,遇到了一个答案,指出在执行 SQL 查询时,数据不应该直接输入 ($db->query("SELECT * FROM users WHERE id LIKE $id")
),而应该绑定在准备好的语句中 ($db->prepare("SELECT * FROM users WHERE id LIKE ?)->execute(array($id))
).
现在,我知道 SQL 注入,我应该使用类似于后者的代码,但我的问题是;是总是吗?就像,如果我有以下代码:
$db->query("SELECT * FROM products WHERE id LIKE $id")
假设 I 在我的代码中给出了 $id
,并且它不是来自用户的输入,我是否仍然需要使用准备好的陈述?或者我可以接受第一个例子吗?
这是安全的,因为您的代码将 $id
设置为文字常量值。无法使用不受信任的值。
$id = 123;
$db->query("SELECT * FROM products WHERE id LIKE $id");
这是安全的,因为进行类型转换消除了任何可能导致 SQL 注入问题的特殊字符的可能性。普通整数是安全的。
$id = (int) $_GET['id'];
$db->query("SELECT * FROM products WHERE id LIKE $id");
但事实仍然是,一旦您使用不同的方法编写查询,有时在字符串中使用变量扩展,有时使用绑定查询参数,您的代码将更难维护。
考虑这段代码的生命周期。您有多大信心接管此代码支持的下一位初级程序员会充分理解 SQL 注入的风险,以判断何时使用变量扩展是安全的,以及何时应该使用绑定查询参数?
当您想要将变量与 SQL 查询组合时,始终 使用绑定查询参数来建立编码标准会更安全,因为此编码标准是更容易记录和更容易执行。因此,不太可能意外允许不安全的情况。