当我没有收到用户输入时不使用php prepare语句

时间:2018-12-15 16:27:40

标签: php security prepared-statement sql-injection

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");

2 个答案:

答案 0 :(得分:3)

Tl; DR 这是一个非常糟糕的主意。您正在引入长期风险,以节省几秒钟的编码工作。绝大多数情况下,随着代码和数据的发展,您迟早会引入SQL注入风险。

如果您:

  • 在验证数据时要格外小心,
  • 在构造查询时要格外小心,
  • 绝对确定您的数据是安全的,并且没有任何用户输入(完全来自任何来源,包括表格,传感器,API,抓取网站等),并且
  • 绝对确定没有人会修改您的数据或您的代码(或不当地重复使用您的代码),包括您

那么我们可以说:

  • 在没有准备好的语句的情况下执行查询将是安全的,并且-这是重要的部分-
  • 您将生活在幻想世界中。

您可以从不安全地假设 可以避免准备语句。如果这样做,您的代码很有可能会被破坏。您可能有错误的数据,忽略了一个问题,以某种方式自己更改了代码,将代码重新用于不安全的地方或犯了许多其他错误。您可能最终自己进行了无害的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的建议,即您不应在安全的编程方法上妥协。使用最安全的方法,并始终如一地使用它。

  • 您不必浪费时间思考任何给定的案例是否“足够安全”以跳过使用安全方法。
  • 您不必担心PHP变量不再经过硬编码后它是否仍然安全。
  • 您不必担心有人会复制并粘贴您的代码作为示例,并且他们以不安全的方式使用它。