开发者社区> 问答> 正文

准备好的语句如何防止SQL注入攻击?

准备好的语句如何帮助我们防止SQL注入攻击?

维基百科说:

预准备的语句可以抵抗SQL注入,因为稍后需要使用其他协议传输的参数值不需要正确地转义。如果原始语句模板不是从外部输入派生的,则不会发生SQL注入。

我不太清楚原因。用简单的英语和一些例子,简单的解释是什么?

问题来源于stack overflow

展开
收起
保持可爱mmm 2019-11-15 15:26:09 618 0
1 条回答
写回答
取消 提交回答
  • 这个想法很简单-查询和数据被发送到数据库服务器分开。 就这样。

    SQL注入问题的根源在于代码和数据的混合。

    实际上,我们的SQL查询是合法程序。我们正在动态创建这样的程序,动态添加一些数据。因此,数据可能会干扰程序代码,甚至对其进行更改,正如每个SQL注入示例所显示的那样(PHP / Mysql中的所有示例):

    $expected_data = 1; $query = "SELECT * FROM users where id=$expected_data"; 会产生一个常规查询

    SELECT * FROM users where id=1 而这段代码

    $spoiled_data = "1; DROP TABLE users;" $query = "SELECT * FROM users where id=$spoiled_data"; 会产生恶意序列

    SELECT * FROM users where id=1; DROP TABLE users; 之所以起作用,是因为我们将数据直接添加到程序主体中,并且它成为程序的一部分,因此数据可能会更改程序,并且根据传递的数据,我们将有常规输出或users删除表。

    尽管在准备语句的情况下我们不会更改程序,但它仍然完整无缺 。

    我们先将程序发送到服务器

    $db->prepare("SELECT * FROM users where id=?"); 数据被称为参数或占位符的某个变量代替。

    请注意,完全相同的查询将发送到服务器,其中没有任何数据!然后,我们通过第二个请求发送数据,该请求实际上与查询本身是分开的:

    $db->execute($data); 因此它不能更改我们的程序并造成任何伤害。 很简单-是吗?

    我必须补充的唯一一件事是在每本手册中始终省略:

    预处理语句只能保护数据文字,但不能与其他任何查询部分一起使用。 因此,一旦必须添加动态标识符(例如字段名),准备好的语句就无济于事。我最近已经解释了这个问题,所以我不再重复。

    2019-11-15 15:26:19
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
SQL Server 2017 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载