当我没有从用户那里得到输入时不使用 php prepare 语句
Not using php prepare statement when I am not getting an input from a user
P.S:我知道一直使用预处理语句是最佳实践,使用预处理语句应该成为一种习惯。所以把这个放在一边,请让我知道技术上如果我不写下面的场景prepare
会出什么问题。
1. 我没有收到来自用户或任何其他 class 文件的任何输入,以后也不会。
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) 艰难地学习为什么这是规则。
This is a wordpress plugin and will only be used by me in admin panel. So the problem caused because of using "in" statement because it is hard to write the query like update column where 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 的建议,即您不应在安全编程方法上妥协。使用最安全的方法并始终如一地使用它。
- 您不必浪费时间思考任何给定案例是否 "safe enough" 即可跳过使用安全方法。
- 在您的 PHP 变量不再被硬编码后,您不必担心它是否仍然安全。
- 您不必担心有人会复制粘贴您的代码作为示例,他们会以不安全的方式使用它。
P.S:我知道一直使用预处理语句是最佳实践,使用预处理语句应该成为一种习惯。所以把这个放在一边,请让我知道技术上如果我不写下面的场景prepare
会出什么问题。
1. 我没有收到来自用户或任何其他 class 文件的任何输入,以后也不会。
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) 艰难地学习为什么这是规则。
This is a wordpress plugin and will only be used by me in admin panel. So the problem caused because of using "in" statement because it is hard to write the query like update column where 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 的建议,即您不应在安全编程方法上妥协。使用最安全的方法并始终如一地使用它。
- 您不必浪费时间思考任何给定案例是否 "safe enough" 即可跳过使用安全方法。
- 在您的 PHP 变量不再被硬编码后,您不必担心它是否仍然安全。
- 您不必担心有人会复制粘贴您的代码作为示例,他们会以不安全的方式使用它。