如果你是做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查询可读性更好、更安全。

最新文章

  1. nodeJS(express4.x)+vue(vue-cli)构建前后端分离详细教程(带跨域)
  2. SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新
  3. java封装学习
  4. Testing - 测试基础 - 理解
  5. AngularJS 中利用 Interceptors 来统一处理 HTTP 的错误(reproduce)
  6. Android应用程序模拟手机按键
  7. jquery 判断checkbox是否为空的三种方法
  8. Hadoop集群“WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable”解决办法
  9. COCOS2D-X 精灵创建随笔
  10. [妙味DOM]第五课:事件深入应用
  11. POJ2524:Ubiquitous Religions (并查集模板)
  12. vue搭建环境
  13. zookeeper初探
  14. 如何将Bitcoin比特币区块链数据导入关系数据库
  15. Kubernetes 服务入口管理与 Nginx Ingress Controller
  16. VMware下CentOS7设置网络以及修改系统语言
  17. [转] 在 Windows 中让任务栏时间显示“秒”
  18. PHP-Iterator迭代器(遍历)接口详讲
  19. 前端路由的两种模式: hash 模式和 history 模式
  20. util.promisify 的那些事儿

热门文章

  1. android学习点滴一:android环境的搭建
  2. Go中函数作为值、类型传递。
  3. 建立JNI层的本地对象,并与JAVA层交互方法
  4. 自定义Swap
  5. 基于Unity 5的次世代卡通渲染技术 -- Unite 2017 米哈游总监贺甲分享实录
  6. 洛谷P2854 [USACO06DEC]牛的过山车Cow Roller Coaster
  7. jsp网站访问次数统计
  8. python——字符编码
  9. IBM WebSphere MQ
  10. 《SQL 进阶教程》 case:在 UPDATE 语句里进行条件分支