准备好的语句如何帮助我们防止SQL注入攻击?
维基百科说:
预准备的语句可以抵抗SQL注入,因为稍后需要使用其他协议传输的参数值不需要正确地转义。如果原始语句模板不是从外部输入派生的,则不会发生SQL注入。
我不太清楚原因。用简单的英语和一些例子,简单的解释是什么?
问题来源于stack overflow
这个想法很简单-查询和数据被发送到数据库服务器分开。 就这样。
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); 因此它不能更改我们的程序并造成任何伤害。 很简单-是吗?
我必须补充的唯一一件事是在每本手册中始终省略:
预处理语句只能保护数据文字,但不能与其他任何查询部分一起使用。 因此,一旦必须添加动态标识符(例如字段名),准备好的语句就无济于事。我最近已经解释了这个问题,所以我不再重复。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。