sql注入(SQL Injection):就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

SQL注入攻击的主要危害包括:
非法读取、篡改、添加、删除数据库中的数据;
数据库信息泄漏:数据库中存放的用户的隐私信息的泄露,攻击者盗取用户的各类敏感信息,获取利益。
网页篡改:通过修改数据库来修改网页上的内容。
数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改,攻击者私自添加或删除账号
网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击;
服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。
破坏硬盘数据,瘫痪全系统。

SQL注入的产生原因通常表现在以下几方面:
1. 不当的类型处理;
2. 不安全的数据库配置;
3. 不合理的查询集处理;
4. 不当的错误处理;
5. 转义字符处理不合适;
6. 多个提交处理不当。

SQL注入攻击案例:
查看文章的注入案例:
查看某篇文章的url参数为:?id=1
则通过注入命令:?id=1 or 1=1,则可以列出整个数据表里面的所有文章。
如果查看用户是通过user_id来访问,如:?uid=1
则通过注入命令:?id=1 or 1=1, 则可以把整个用户表的记录全部显示出来
SQL命令如下:
通过?id=1的SQL命令为:select * from article where id=1,此语句查询到1条结构
通过?id=1 and 1=1的SQL命令为:select * from article where id=1 or 1=1,此语句查询到整个表的记录

用户登录的注入案例:
登录表单有user_name字段,查询语句为:select * from users where nickname='{user_name}'
则可以在user_name文本框填入:(' or 1='1),这样可以构造出注入的SQL命令:select * from users where user_name='' or 1='1',这样很容易就进入系统了。

SQL注入猜表:
在登录页面的用户名字段填入:(' or 1=(select count(0) from t_porg_document) or 1='1),可以构造出注入的SQL命令:select * from users where user_name='' or 1=(select count(0) from recharge) or 1='1'
这样就可以猜测是否recharge表存在.存在则语句正常执行,否则就报错了。
猜中表名后,就可以对数据表进行增删改查的操作,如:
在登录页面的用户名字段填入:('; delete from users),可以构造出危险的SQL命令:select * from users where user_name=''; delete from users;
通过加分号,可以构造出任意增删改查sql语句,整个数据库就被攻击者随意控制了。

对SQL注入的防御方法主要有:
1. 字符串长度验证,仅接受指定长度范围内的变量值。sql注入脚本必然会大大增加输入变量的长度,通过长度限制,比如用户名长度为 8 到 20 个字符之间,超过就判定为无效值。
2. 对单引号和双"-"、下划线、百分号等sql注释符号进行转义
3. 对接收的参数进行类型格式化,如id参数值获取后,进行int类型转换
4. 永远不要使用动态拼装SQL,推荐使用参数化的SQL或者直接使用存储过程进行数据查询存取。sql注入最主要的攻击对象就是动态拼装的SQL,通过参数化查询可以极大减少SQL注入的风险。
5. 永远不要使用管理员权限的数据库连接(sa、root、admin),为每个应用使用单独的专用的低特权账户进行有限的数据库连接。
6. 不要把机密信息明文存放,请加密或者hash掉密码和敏感的信息。这样对方就算获取到整个表的数据内容,也没什么价值。
7. 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装,把异常信息输出到日志而不是在页面中展示。
8. 做好XSS跨站攻击的防护,防止攻击者伪造管理员信息进入系统后台
9. 不管客户端是否做过数据校验,在服务端必须要有数据校验(长度、格式、是否必填等等)

SQL注入检测工具:
http://blog.jobbole.com/17763/ 10个SQL注入工具
http://netsecurity.51cto.com/art/201412/458837.htm 国产SQL注入漏洞测试工具——SSQLInjection
https://www.oschina.net/search?scope=project&q=sql注入 sql注入工具排行榜

编程语言自带的过滤方法:
PHP
普通输入可以用mysql_real_escape_string() / mysqli_real_escape_string()来转义特殊的输入字符;
like查询语句中,如果用户输入的值有"_"和"%",则会出现这种情况:用户本来只是想查询"abcd_",查询结果中却有"abcd_"、"abcde"、"abcdf"等等;用户要查询"30%"(注:百分之三十)时也会出现问题。
在PHP脚本中我们可以使用addcslashes()函数来处理以上情况,如下实例:
$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_");
// $sub == \%something\_

参考文章:

http://blog.csdn.net/stilling2006/article/details/8526458 (SQL注入原理讲解,很不错!)
http://netsecurity.51cto.com/art/201009/226227.htm (SQL注入攻击三部曲之入门篇)
http://www.runoob.com/mysql/mysql-sql-injection.html (MySQL 及 SQL 注入)
http://www.jb51.net/article/18874.htm (SQL注入中绕过 单引号 限制继续注入)
http://www.knowsky.com/441536.html (让SQL注入攻击危害最小化三大措施)
http://www.cnblogs.com/smilewxt/p/4229810.html (SQL注入的原理以及危害)
http://blog.jobbole.com/105586/ (记一次SQL注入实战)
https://my.oschina.net/qjedu/blog/1504004 (SQL注入详解)

演示文件下载:

sqlinjectiontest(sql注入演示,php单文件绿色版).zip

版权声明:本文采用署名-非商业性使用-相同方式共享(CC BY-NC-SA 3.0 CN)国际许可协议进行许可,转载请注明作者及出处。
本文标题:SQL注入(SQL Injection)案例和防御方案
本文链接:http://www.cnblogs.com/sochishun/p/6994918.html
本文作者:SoChishun (邮箱:14507247#qq.com | 博客:http://www.cnblogs.com/sochishun/)
发表日期:2017年6月12日

SQL注入(SQL Injection)案例和防御方案的更多相关文章

  1. SQL注入——SQL Injection

    本文部分内容转自:https://www.cnblogs.com/rush/archive/2011/12/31/2309203.html http://www.diybl.com/course/7_ ...

  2. DDOS、CC、sql注入,跨站攻击防御方法

    web安全常见攻击解读--DDos.cc.sql注入.xss.CSRF 一,DDos https://www.cnblogs.com/sochishun/p/7081739.html#4111858 ...

  3. Web安全相关(五):SQL注入(SQL Injection)

    简介 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据 ...

  4. DVWA 黑客攻防演练(八)SQL 注入 SQL Injection

    web 程序中离不开数据库,但到今天 SQL注入是一种常见的攻击手段.如今现在一些 orm 框架(Hibernate)或者一些 mapper 框架( iBatis)会对 SQL 有一个更友好的封装,使 ...

  5. 仿sql注入 sql

    <?phpclass sqlsafe { //(and|or)\\b 表示以and和or结尾的单词如:aand,band,都可以匹配//如果匹配and或or则使用 \\b(and|or)\\b来 ...

  6. JDBC课程4--使用PreparedStatement进行增删查改--封装进JDBCTools的功能中;模拟SQL注入 ; sql的date()传入参数值格式!

    主要内容: /*SQL 的date()需要传入参数值: preparedStatement().setDate(new java.util.Date().getTime()); 熟悉了使用Prepar ...

  7. 梨子带你刷burp练兵场(burp Academy) - 服务器篇 - Sql注入 - SQL injection UNION attack, determining the number of columns returned by the query

    目录 SQL injection UNION attack, determining the number of columns returned by the query SQL injection ...

  8. 代码审计中的SQL注入

    0x00 背景 SQL注入是一种常见Web漏洞,所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.本文以代码审计的形式研 ...

  9. 网站SQL注入防御实战

    SQL注入作为直接威胁web业务的最严重攻击行为,已经被大多数的网站管理员所了解,这种通过HTTP标准端口,利用网页编码不严谨,提交精心构造的代码实现对数据库非授权访问的攻击方法,已经被越来越多的sc ...

随机推荐

  1. windows更改MySQL存储路径

    在C:\ProgramData\MySQL\MySQL Server 5.7文件夹 my.ini是默认的配置文件.在这里我们只更改数据存储路径.不更改配置文件 1 # Path to the data ...

  2. 1035 Password (20 分)(字符串)

    注意下单复数 #include<bits/stdc++.h> using namespace std; pair<string,string>pa; int main() { ...

  3. 洛谷【P1057】传球游戏

    https://www.luogu.org/problemnew/show/P1057 题目描述 在体育课上, 老师带着同学们一起做传球游戏. 游戏规则是这样的: n 个同学站成一个圆圈, 其中的一个 ...

  4. R之RMySQL

    linux,mysql和R的版本信息: Linux naci 3.19.0-16-generic #16-Ubuntu SMP Server version: 5.6.24-0ubuntu2 (Ubu ...

  5. Qt类继承关系图

    分享两个资源,对于系统了解Qt框架的整体脉络很有帮助. Qt4类关系图+Qt5类关系图,PDF+JPG格式 [下载] Qt5类关系图(基于Qt5.1版),JPG格式[下载]

  6. VR产业链全景图

  7. php命名空间学习笔记。

    为什么要用命名空间? 在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题: 用户编写的代码 与  PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲 ...

  8. 2018-2019-20172329 《Java软件结构与数据结构》第四周学习总结

    2018-2019-20172329 <Java软件结构与数据结构>第四周学习总结 经过这样一个国庆节的假期,心中只有一个想法,这个国庆假期放的,不如不放呢!! 教材学习内容总结 < ...

  9. 电梯V2.0

    电梯V2.0 GitHub仓库地址 Problem 一栋10层的大楼(楼层编号1-10),设3台无限载重的电梯,初始时电梯停在1层.其中:1号电梯只能停留在奇数层,2号电梯可以各层都停留,3号电梯只停 ...

  10. (二)MySQL中级篇

    1.视图view 视图是一个虚拟表,其内容由查询定义.定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图. 视图的优点: ①简化了操作,把经常使用的数据定义为视图. ②安全性,用户只能 ...