凭自动转义防止脚本注入吗?

中防止sql注入的方法详解。产生的原因最常见的就是字符串拼接了,当然,sql注入并不只是拼接一种情况,还有像宽字节注入,特殊字符转义等等很多种,这里就说说最常见的字符串拼接,这也是初级程序员最容易犯的错误。

首先咱们定义一个类来处理的操作

这里 execute 执行的时候传入两个参数,第一个是参数化的sql语句,第二个是对应的实际的参数值,函数内部会对传入的参数值进行相应的处理防止sql注入,实际使用的方法如下

这样就可以防止sql注入,传入一个列表之后,MySQLdb模块内部会将列表序列化成一个元组,然后进行escape操作。


SQL 注入是一种攻击方式,在这种攻击方式中,恶意代码被插入到字符串中,然后将该字符串传递到 SQL Server 的实例以进行分析和执行。任何构成 SQL 语句的过程都应进行注入漏洞检查,因为 SQL Server 将执行其接收到的所有语法有效的查询。

SQL 注入的主要形式包括直接将代码插入到与 SQL 命令串联在一起并使其得以执行的用户输入变量。一种间接的攻击会将恶意代码注入要在表中存储或作为元数据存储的字符串。在存储的字符串随后串连到一个动态 SQL 命令中时,将执行该恶意代码。

注入过程的工作方式是提前终止文本字符串,然后追加一个新的命令。由于插入的命令可能在执行前追加其他字符串,因此攻击者将用注释标记“--”来终止注入的字符串。执行时,此后的文本将被忽略。

以下脚本显示了一个简单的 SQL 注入。此脚本通过串联硬编码字符串和用户输入的字符串而生成一个 SQL 查询:

在存储过程中使用参数化输入
存储过程如果使用未筛选的输入,则可能容易受 SQL Injection 攻击。例如,以下代码容易受到攻击:

"'", conn);如果使用存储过程,则应使用参数作为存储过程的输入。

在动态 SQL 中使用参数集合
如果不能使用存储过程,您仍可使用参数,如以下代码示例所示:

筛选输入可以删除转义符,这也可能有助于防止 SQL 注入。但由于可引起问题的字符数量很大,因此这并不是一种可靠的防护方法。以下示例可搜索字符串分隔符。

如果分配给变量的任何动态 Transact-SQL 比为该变量分配的缓冲区大,那么它将被截断。如果攻击者能够通过将意外长度的字符串传递给存储过程来强制执行语句截断,则该攻击者可以操作该结果。

通过向 128 个字符的缓冲区传递 154 个字符,攻击者便可以在不知道旧密码的情况下为 sa 设置新密码。

因此,应对命令变量使用较大的缓冲区,或直接在 EXECUTE 语句内执行动态 Transact-SQL。

当您串联 sysname 类型的值时,应使用足够大的临时变量来保存每个值的最多 128 个字符。应尽可能直接在动态 Transact-SQL 内调用 QUOTENAME()。

我要回帖

更多关于 引用外部脚本的正确语法 的文章