专门给别人做网站手机如何制作一个网页链接
SQL注入攻击的原理
原理:将SQL命令插入到web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器,执行恶意的SQL命令
SQL注入攻击的主要原因
SQL注入主要原因是程序员在开发用户和数据库的系统时没有对用户输入的字符串进行过滤、转义、限制或处理不严谨,导致攻击者可以通过精心构造的字符串去非法获取到数据库中的数据。
对于Java数据库连接JDBC而言,SQL注入攻击只对Statement有效,对PreparedStatement是无效的,这是因为PreparedStatement不允许在不同的插入时间改变查询的逻辑结构。
SQL注入攻击的两种形式
1.直接注入式攻击法:直接将代码插入到与SQL命令串联在一起,缤纷使得其得以执行的用户用户输入变量。
2.间接的攻击方法:将恶意代码注入要在表中存储或者作为原数据存储的字符串。在存储的字符串中会连接到一个动态的SQL命令中,以执行一些恶意的SQL代码。
注入攻击的过程
提前终止文本字符串,然后追加一个新命令,由于插入的命令可能在执行前追加其他字符串,因此攻击者常常用注释标记“—”来终止注入的字符串。执行时,系统会认为此后语句位注释,故后续的文本将被忽略,不被编译与执行。
SQL攻击的示例:
假如我们有一个users表,里面有两个字段username和password。用sql拼接的方式进行用户验证。比如
"select id from users where username = '"+username +"' and password = '
" + password +"'" 这里的username和password都是我们存取从web表单获得的数据。
下面我们来看一下一种简单的注入,如果我们在表单中username的输入框中输入
' or 1=1-- ,password的表单中随便输入一些东西,假如这里输入123.
此时我们所要执行的sql语句就变成了
select id from users where username = '' or 1=1-- and password = '123',
我们来看一下这个sql,因为1=1是true,后面 and password = '123'被注释掉了。所以这里完全跳过了sql验证
SQL攻击的防御:
使用预编译语句
绑定变量,攻击者无法改变SQL的结构。不同的编程语言Java、Php有不同的语法
- 使用存储过程
使用安全的存储过程对抗SQL注入,由于存储过程中也可能存在SQL注入问题,应尽量避免使用动态SQL语句。
- 检查数据类型
例如,需要输入的是整型,那么,可以判断用户的输入,如果包含非整型,例如,字符串"AND"、“BENCHMARK”等,则不运行sql语句。其他类型,例如,邮箱等可以通过使用正则表达式来进行判断。
- 使用安全函数
各个厂商都有一些安全函数,例如,微软SQL安全函数