SQL注入是指通过构造可以注入的特殊字符,攻击者利用已修改的输入语句,在服务器端拼接SQL 命令,从而达到改变原始业务逻辑,进而盗取系统数据,成功攻陷服务器的目的。MSSQL 转义是一种有效的预防 SQL 注入的方法,它可以把可疑的字符转义成安全的字符,有效的规避攻击者的攻击。
MSSQL 转义的方法有很多种,其中一种典型的方式是使用特殊转义字符和转义子句,比如 \char 子句,即可以将字符串中的某些特殊字符(如引号,反斜杠等)转义成安全的可以用于查询的字符。例如,在接受用户输入的值时,可以将输入进行 \char 转义,即:
SELECT * FROM table WHERE search Parameter = \ char(39) + user_input + \ char(39);
上面的 SQL 查询声明中 \ chars(39) 是一个转义函数,用来处理来自用户输入的单引号可能带来的注入的漏洞,当用户输入单引号,系统将自动把其转义成 ASCII 码中对应的安全值,从而防止 SQL 注入事件的发生。
MSSQL 转义方式并不仅仅是使用 \char 字符,还有一句更强大的技巧,这就是使用 sp_executesql 来处理用户输入。sp_executesql 可以让你赋予任意用户输入,以字符串形式编写 SQL 查询,绅士处理用户输入,比如:
Declare @param NVARCHAR(50)
Set @param= ‘user_input’
Exec sp_executesql N’select * from table where search parameter = @param’, N’@param NVARCHAR(50)’, @param
在上面的示例中,sp_executesql 会先声明一个用于处理用户输入的变量 @param,规避可能的 SQL 注入,因为单引号被植入变量 \param 中,因此用户输入的单引号无法直接组合成恶意的 SQL 命令。
MSSQL 转义之路不仅仅停在转义子句或用 sp_executesql 来处理用户输入这两步,还有一些转义函数:
– QUOTENAME 和 REPLACE 函数,可以将许多特殊字符转义;
– PATINDEX 和 REPLACE 函数,用于搜索和替换特殊字符;
– IIF,可以检查用户输入的长度,如果长度超过指定大小,就将用户输入的值拆成两个字符串;
– sp_procedure_params 内置存储过程,用来构建参数组,用于传递可能存在注入漏洞的参数;
– 可变游标 (Dynamic Cursor),改善向数据库发送复杂查询的效率;
以上就是 MSSQL 转义的简单概述,明白了如何预防 SQL 注入,你就可以使用各种方式把 SQL 注入藏起来,避免被攻击者利用。