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

  • 相关阅读:
    Luogu P4205 [NOI2005]智慧珠游戏
    Luogu P3321 [SDOI2015]序列统计
    Luogu P2056 [ZJOI2007]捉迷藏
    Luogu P5168 xtq玩魔塔
    2019年一月刷题列表
    [转载]我们都是行走在镜面边缘的人
    [武汉加油] CF830C Bamboo Partition
    [武汉加油] [NOI Online 提高组]最小环
    [武汉加油] luogu P6178 【模板】Matrix-Tree 定理
    [武汉加油] bzoj 5099: [POI2018]Pionek 几何+双指针
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3212577.html
Copyright © 2011-2022 走看看