p.S:我知道一直使用准备好的语句是一种最佳实践,使用准备好语句应该是一种习惯。所以抛开这一点不谈,请让我知道技术上如果我不用prepare
写下面的场景,会出什么问题。
1.我不会从用户或任何其他类文件获得任何输入,将来也不会。
2.我从同一个PHP文件中的一个变量(例如数组(获得输入。
示例:($myID
将是同一PHP文件中硬编码的变量(
$myID=12;
$wpdb->query("UPDATE `$table_name` SET `your_column_1` = 1 WHERE `myTable`.`your_column_id` = $myID");
Tl;DR这是个非常糟糕的主意。您引入了长期风险以节省几秒钟的编码工作。随着代码和数据的发展,您迟早会引入SQL注入风险。
如果您:
- 在验证数据时非常小心
- 在构建查询时非常小心
- 绝对确信您的数据是安全的,不受任何用户输入的影响(来自任何来源,包括表单、传感器、API、抓取网站等(,以及
- 绝对确信没有人会修改您的数据或代码(或不适当地重用您的代码(,包括您
然后我们可以说:
- 在没有准备好的语句的情况下执行查询是安全的,这是重要的部分-
- 你会生活在一个幻想的世界里
您可以永远安全地假设您可以避免准备语句。如果你这样做,你的代码很有可能会崩溃。你可能有坏数据,忽略了一个问题,以某种方式自己更改代码,将代码重新用于不安全的地方,或者犯许多其他错误。你可能会自己进行无害的SQL注入(比如说,使用O’Brien
这样的名称或拼写(,或者你可能会被大量黑客攻击。。。
所有这些都是为了节省几秒钟的编码时间。
简短版本:(1(在上使用准备好的语句,每个查询都有任何类型的变量信息,或者(2(深入了解为什么这是规则。
这是一个wordpress插件,只供我在管理面板中使用。因此,由于使用"in"语句而导致的问题是,很难在color in('black','white'(的地方编写类似查询的更新列。
如果你正在为WordPress开发,你是否考虑过使用wpdb API?它使向SQL查询添加参数变得非常容易。
为IN( )
谓词使用参数的示例:
$colors_array = ["black", "white"];
$placeholders = array_fill(0, count($colors_array), "%s");
$placeholder_list = implode(",", $placeholders);
$wpdb->query( $wpdb->prepare(
"
UPDATE $wpdb->stock
SET quantity = 327
WHERE color IN ($placeholder_list)
",
$colors_array
));
请参阅https://codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks
我同意Ed Cottrell的建议,即不应在安全编程方法上妥协。使用最安全的方法并始终如一地使用它。
- 您不必浪费时间思考任何给定的案例是否"足够安全",从而跳过使用安全方法
- 在PHP变量不再硬编码后,您不必担心它是否仍然安全
- 你不必担心有人会复制&粘贴你的代码作为一个例子,他们以不安全的方式使用它