zoukankan      html  css  js  c++  java
  • SQL注入

    如果你是做Java web应用开发的,那么必须熟悉那声名狼藉的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查询可读性更好、更安全。

  • 相关阅读:
    我的浏览器收藏夹分类
    我的浏览器收藏夹分类
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 315 计算右侧小于当前元素的个数
    Java实现 LeetCode 315 计算右侧小于当前元素的个数
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3212577.html
Copyright © 2011-2022 走看看