Sql语句防注入攻击研究

时间:2022-09-21 09:43:55

Sql语句防注入攻击研究

【摘要】本文对注入攻击进行了深入研究使用链表实现了简单Sql语句转化为带参数Sql有效防止了注入。

【关键词】链表;注入;带参数Sql语句

在操作数据库的程序中我们一般都喜欢使用sql语句拼接的方式编写程序,这样编写出的程序灵活性较高,不受制约,运行速度较快。但这样的程序容易受到注入的为威胁,如你编写一个sql语句来判断用户密码是否存在:select top 1 * from User

where UserName=’admin’ and Pwd=’adminpwd’这条语句的两个值Username和Pwd一般来自于用户的输入。正常用户通常会填入用户名和密码,但别有用心的用户会使用特殊的方法进行攻击,比如他在用户名里填写一个admin’ or 1=1‘这样sql语句就变成了select top 1 * from User where UserName=’admin’

or 1=1‘and Pwd=’adminpwd’注意这个or 1=1也就是不管用户名密码是不是成立where表达式的值总是成立的,这就是SQL注入攻击的本质。

一、如何防范注入攻击

我们知道注入攻击的原理就可以进行防范,防范注入攻击的方式大体分为2类:第一类是对用户输入的内容进行过滤,过滤掉用户输入’and or等这些特殊字符。这种方式比较简单实现也相对容易。大部分网站都采用这种方式。代码如下:

但是这种方式在参数特别多情况,会极大的降低效率,要确认哪个参数需要去判断一遍,也给写程序员带来了很大的负担,笔者就曾经遗漏了参数使网站被注入攻击。另一类是利用带参数的SQL语句,把需要的用户输入全部使用Sql参数代替,这样在Sql语句执行时会把参数带入执行,在执行完成时在把值填充入参数。如刚才的登陆Sql语句可以写成:select top 1

* from User where UserName=@UserName and Pwd=@pwd .

@Username和@pwd为SQL语句的参数,以C#语言和Sqlserver数据库为例代码如下:

这种参数化的查询优势是安全性高,就算用户使用注入攻击对Sql语句进行截断admin’or 1=1‘Sql语句也不会执行。同时使用Sql参数会提高Sql语句的执行速度。但是这种每次必须指定参数的做法使程序丧失了灵活性,对程序重用性是一种极大的挑战,不得不在程序编写时每次都使用Parameters。Add为Sql语句添加参数。综合上面的两种方式,我们可以发现带参数的Sql语句比过滤用户输入内容的方式更加安全高效,但是程序员必须编写更复杂的代码。有没有方法可以让一般的Sql语句自动转换为带参数的Sql语句呢。在转换之前我们必须先要研究格式化问题。

二、结论

为了能够正确解析sql语句,必须使用一种数据结构,能够非常方便的插入到这些关键字中,又不影响后面的关键字,这种结构只有链表,C#提供了链表结构。通过链表格式化可以把SQL语句分解成单个的关键字节点,经过作者实践证明完全可以解释简单的Sql语句。

上一篇:高职服装设计专业实训教学探讨 下一篇:中日文化产业及文化产品出口现状