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查询可读性更好、更安全。

  • 相关阅读:
    3.1 创建模型-实体属性
    3. 创建模型
    2.1 DbContext
    2. EF Core 如何显示执行的SQL语句
    1.1 为现有数据库生成实体模型
    1. EF Core 概述
    【2020-08-01】人生十三信条
    【一句日历】2020年8月
    【2020-07-31】一个像我一样精力充沛的孩子
    【2020-07-30】强大内心是自己的义务
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3212577.html
Copyright © 2011-2022 走看看