PS :我知道始终使用用户准备好的语句是一种最佳做法,应该习惯使用准备好的语句。因此,暂且不谈,如果我不使用prepare
写下面的情况,请从技术上告诉我什么会出问题。
1。。我没有从用户或任何其他班级文件中获取任何输入,将来也不会。
2。。我从同一PHP文件(例如,数组)中的变量获取输入。
示例({$myID
是一个硬编码在同一PHP文件中的变量)
$myID=12;
$wpdb->query("UPDATE `$table_name` SET `your_column_1` = 1 WHERE `myTable`.`your_column_id` = $myID");
答案 0 :(得分:3)
Tl; DR 这是一个非常糟糕的主意。您正在引入长期风险,以节省几秒钟的编码工作。绝大多数情况下,随着代码和数据的发展,您迟早会引入SQL注入风险。
如果您:
那么我们可以说:
您可以从不安全地假设 可以避免准备语句。如果这样做,您的代码很有可能会被破坏。您可能有错误的数据,忽略了一个问题,以某种方式自己更改了代码,将代码重新用于不安全的地方或犯了许多其他错误。您可能最终自己进行了无害的SQL注入(例如,使用诸如O’Brien
之类的名称或拼写),或者您可能被大量黑客入侵...
...全部可节省几秒钟的编码时间。
简短版本:(1)在具有任何变量信息的每个查询上使用准备好的语句,或(2)了解制定规则的艰难方式。
答案 1 :(得分:1)
这是一个wordpress插件,仅供我在管理面板中使用。因此,由于使用“ in”语句引起的问题是因为很难编写像update列这样的查询,其中的颜色为('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的建议,即您不应在安全的编程方法上妥协。使用最安全的方法,并始终如一地使用它。