网站的色彩,网站的流量是什么意思,广告制作公司口号,建筑资源网站SQL 语句文本对于数据库来说#xff0c;是一种指令#xff0c;与 Shell 中输入的一条条命令行很类似。我们在 SQL 中混入的各种值就是操作的参数。考虑一个 WHERE user_id 10 的筛选#xff0c;WHERE 的条件包含两个部分#xff1a;按用户筛选#xff0c;以及用户 id 的值…SQL 语句文本对于数据库来说是一种指令与 Shell 中输入的一条条命令行很类似。我们在 SQL 中混入的各种值就是操作的参数。考虑一个 WHERE user_id 10 的筛选WHERE 的条件包含两个部分按用户筛选以及用户 id 的值后者即为筛选操作的参数。当用户 id 直接混在 SQL 中表示 id 值的文本作为 SQL 正文的一部分就很容易被动手脚攻击者只要伪造一个令你最终也能符合语法的 伪装值就行。比如 WHERE user_id 10;delete from xxxx这样工程师直接拼到里面之后在执行引擎里它分析我们的语句发现是两个子句。就会执行后面的注入的 SQL。上述过程的问题在于执行引擎理解到的 SQL 语义与我们要表达的不一致。我们隐含地意思是在 WHERE user_id 之后的值都被当作 user_id 的筛选条件而不应该有其他语句出现。但是基于 SQL 分析来执行数据交互这种误解是无法解除的比如上面的例子伪装之后它也是个符合语法的 SQL。参数化为我们提供了消除这种误解的能力。在遇到参数时不管输入任何值都将整个值作为参数的值而不是原始 SQL 文本的一部分。在上面的例子里如果使用参数化 SQL则 10;delete from xxxx 整体会作为用于比对的 user_id 值显然找不到。而且数据库不会被注入因为这时 delete from xxxx 是参与运算的值的一部分而不是 SQL 操作指令的一部分。其他答案里有提到这是一种抽象。如果做过表达式解析的练习你会发现操作数与操作算子是两种不同性质的东西。SQL 注入的原理就是如果简单地通过拼接字符串来获得 SQL 文本就会使本应属于操作数的内容被当作操作算子来执行了。