首页 > 解决方案 > 这是查看 SQL 准备语句的正确方法吗?

问题描述

我正在尝试寻找确认以查看我理解 SQL 准备语句的方式是否正确。

如果我理解正确,那就是您将用户的输入与语句本身分开。您没有将输入视为语句的一部分,或者在相同的上下文中。在 SQL 注入的情况下,上下文是一个字符串。该语句是一个长字符串,您允许用户输入他们想要的任何内容,然后该输入就是语句的一部分。

因此,取而代之的是,在其位置放置一些参数名称,将 SQL 语句保存在某处以供以后使用。参数不是字符串,而是一些指向数据的“对象”。然后如果你想传递类似的东西,那么参数以字符串'' or '1' ='1'的形式指向这个值。因此,如果您将两者进行比较:

输入被附加到语句中

delete from t where 'hello'='' or '1' = '1'; // will deletet``

语句中的某个参数指向输入

  1. 创建语句。这将作为语句存储在某处,而不是字符串。

delete* from t where password=$somepassword;

计算时where password=$somepassword,$somepassword 被它指向的字符串替换。然后我们有这样的声明:

delete * from t where password='' or '1'='1';// 它没有通过,因为除了字符串之外的所有东西都是一个语句。该字符串不是语句本身的一部分。由于任何字符串都不会被视为语句的一部分,因此不会发生 SQL 注入。

标签: sql

解决方案


推荐阅读