(转)SQL注入攻击简介
如果你是做Javaweb应用开发的,那么必须熟悉那声名狼藉的SQL注入式攻击。去年Sony就遭受了SQL注入攻击,被盗用了一些Sony play station(PS机)用户的数据。在SQL注入攻击里,恶意用户通过SQL元数据绑定输入,比如:某个网站的登录验证SQL查询代码为:
strSQL = "SELECT * FROM users WHERE name = '" + userName + "' and pw = '"+ passWord +"';"
恶意填入:
userName = "1' OR '1'='1";
passWord = "1' OR '1'='1";
那么最终SQL语句变成了:
strSQL = "SELECT * FROM users WHERE name = '1' OR '1'='1' and pw = '1' OR '1'='1';"
因为WHERE条件恒为真,这就相当于执行:
strSQL = "SELECT * FROM users;"
因此可以达到无账号密码亦可登录网站。如果恶意用户要是更坏一点,用户填入:
strSQL = "SELECT * FROM users;"
SQL语句变成了:
strSQL = "SELECT * FROM users WHERE name = 'any_value' and pw = ''; DROP TABLE users"
这样一来,虽然没有登录,但是数据表都被删除了。
然而使用PreparedStatement的参数化的查询可以阻止大部分的SQL注入。在使用参数化查询的情况下,数据库系统(eg:MySQL)不会将参数的内容视为SQL指令的一部分来处理,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有破坏性的指令,也不会被数据库所运行。
补充:避免SQL注入的第二种方式:
在组合SQL字符串的时候,先对所传入的参数做字符取代(将单引号字符取代为连续2个单引号字符,因为连续2个单引号字符在SQL数据库中会视为字符中的一个单引号字符,譬如:
strSQL = "SELECT * FROM users WHERE name = '" + userName + "';"
传入字符串:
userName = " 1' OR 1=1 "
把userName做字符替换后变成:
userName = " 1'' OR 1=1"
最后生成的SQL查询语句为:
strSQL = "SELECT * FROM users WHERE name = '1'' OR 1=1'
这样数据库就会去系统查找name为“1′ ‘ OR 1=1”的记录,而避免了SQL注入。
比起凌乱的字符串追加似的查询,PreparedStatement查询可读性更好、更安全。
最新文章
- nodeJS(express4.x)+vue(vue-cli)构建前后端分离详细教程(带跨域)
- SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新
- java封装学习
- Testing - 测试基础 - 理解
- AngularJS 中利用 Interceptors 来统一处理 HTTP 的错误(reproduce)
- Android应用程序模拟手机按键
- jquery 判断checkbox是否为空的三种方法
- Hadoop集群“WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable”解决办法
- COCOS2D-X 精灵创建随笔
- [妙味DOM]第五课:事件深入应用
- POJ2524:Ubiquitous Religions (并查集模板)
- vue搭建环境
- zookeeper初探
- 如何将Bitcoin比特币区块链数据导入关系数据库
- Kubernetes 服务入口管理与 Nginx Ingress Controller
- VMware下CentOS7设置网络以及修改系统语言
- [转] 在 Windows 中让任务栏时间显示“秒”
- PHP-Iterator迭代器(遍历)接口详讲
- 前端路由的两种模式: hash 模式和 history 模式
- util.promisify 的那些事儿