Java防止SQL注入

SQL 注入简介:
        SQL注入是最常见的攻击方式之一,它不是利用操作系统或其它系统的漏洞来实现攻击的,而是程序员因为没有做好判断,被不法用户钻了SQL的空子,下面我们先来看下什么是SQL注入:

比如在一个登陆界面,要求用户输入用户名和密码:

用户名:     ' or 1=1 --

密     码:

点登陆,如若没有做特殊处理,而只是一条带条件的查询语句如:

String sql="select * from users where username='"+userName+"' and password='"+password+"' "

那么这个非法用户就很得意的登陆进去了.(当然现在的有些语言的数据库API已经处理了这些问题)

这是为什么呢?我们来看看这条语句,将用户输入的数据替换后得到这样一条语句:

select * from users where username='' or 1=1 --' and password=''

为了更明白些,可以将其复制到SQL分析器中,将会发现,这条语句会将数据库的数据全部读出来,为什么呢?

很简单,看到条件后面 username='' or 1=1 用户名等于 '' 或 1=1 那么这个条件一定会成功,然后后面加两个-,这意味着什么?

   没错,注释,它将后面的语句注释,让他们不起作用,这样就可以顺利的把数据库中的数据读取出来了。

这还是比较温柔的,如果是执行 
        select * from users where username='' ;DROP Database    (DB Name) --' and password=''

.......其他的您可以自己想象。。。

那么我们怎么来处理这种情况呢?下面我以java为列给大家两种简单的方法:

第一种采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setString方法传值即可:
        String sql= "select * from users where username=? and password=?;
        PreparedStatement preState = conn.prepareStatement(sql);
        preState.setString(1, userName);
        preState.setString(2, password);
        ResultSet rs = preState.executeQuery();
        ...

第二种是采用正则表达式将包含有 单引号('),分号(;) 和 注释符号(--)的语句给替换掉来防止SQL注入
        public static String TransactSQLInjection(String str)
        {
              return str.replaceAll(".*([';]+|(--)+).*", " ");

// 我认为 应该是return str.replaceAll("([';])+|(--)+","");

}

userName=TransactSQLInjection(userName);
        password=TransactSQLInjection(password);

String sql="select * from users where username='"+userName+"' and password='"+password+"' "
        Statement sta = conn.createStatement();
        ResultSet rs = sta.executeQuery(sql);

[转]开发中如何解决SQL注入的问题的更多相关文章

  1. MyBatis是如何解决Sql注入的

    转:[转]mybatis如何防止sql注入 java中预处理PrepareStatement为什么能起到防止SQL注入的作用??!! 一.SQL注入 sql注入大家都不陌生,是一种常见的攻击方式,攻击 ...

  2. IBatis.Net使用总结(一)-- IBatis解决SQL注入(#与$的区别)

    IBatis解决SQL注入(#与$的区别) 在IBatis中,我们使用SqlMap进行Sql查询时,需要引用参数,在参数引用中可以使用两种占位符#和$.这两种占位符有什么区别呢? (1):#***#, ...

  3. PreparedStatement解决sql注入问题

    总结 PreparedStatement解决sql注入问题 :sql中使用?做占位符 2.得到PreparedStatement对象 PreparedStatement pst=conn.prepar ...

  4. 使用过滤器解决SQL注入和跨站点脚本编制

    1 SQL注入.盲注 1.1 SQL注入.盲注概述 Web 应用程序通常在后端使用数据库,以与企业数据仓库交互.查询数据库事实上的标准语言是 SQL(各大数据库供应商都有自己的不同版本).Web 应用 ...

  5. 解决 SQL 注入的另类方法

    本文是翻译,版权归原作者所有 原文地址(original source):https://bitcoinrevolt.wordpress.com/2016/03/08/solving-the-prob ...

  6. Java开发工程师(Web方向) - 03.数据库开发 - 第3章.SQL注入与防范

    第3章--SQL注入与防范 SQL注入与防范 经常遇到的问题:数据安全问题,尤其是sql注入导致的数据库的安全漏洞 国内著名漏洞曝光平台:WooYun.org 数据库泄露的风险:用户信息.交易信息的泄 ...

  7. MySQL_(Java)使用preparestatement解决SQL注入的问题

    MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC创建用户名和密码校验查询方法 传送门 MySQL数据库中的数据,数据库名garysql,表名gar ...

  8. JDBC_08_解决SQL注入问题 (登录和注册)

    解决SQL注入问题 只要用户提供的信息不参与sql语句的编译过程,那么尽管用户输入的信息中含有sql关键字那么也不会起作用了 要想使用户提供信息不参与sql语句的编译过程,那么必须使用 java.sq ...

  9. Android开发中如何解决加载大图片时内存溢出的问题

    Android开发中如何解决加载大图片时内存溢出的问题    在Android开发过程中,我们经常会遇到加载的图片过大导致内存溢出的问题,其实类似这样的问题已经屡见不鲜了,下面将一些好的解决方案分享给 ...

随机推荐

  1. 洛谷 P3586 [POI2015]LOG

    P3586 [POI2015]LOG 题目描述 维护一个长度为n的序列,一开始都是0,支持以下两种操作:1.U k a 将序列中第k个数修改为a.2.Z c s 在这个序列上,每次选出c个正数,并将它 ...

  2. socketserver,threading

    一,socketserver  #server import socketserver class Myserver(socketserver.BaseRequestHandler): def han ...

  3. web安全问题-cookie

    web安全问题 cookie 1.cookies只能设置过期 不能删除 <script> now.toGMTString() => 事件可以用来设置cookie document.c ...

  4. P1969 积木大赛

    题意:给你一段序列,一次操作:[l,r]内所有数+1 初始序列全为0 现在给你最后序列,问最少操作几次能达到这样的序列 蒟蒻表示秒想到------差分啊 每次差分必有一个+1,一个-1 把差分数组求出 ...

  5. 二分+最小生成树【bzoj2654】: tree

    2654: tree 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. 二分答案,然后跑最小生成树判断. 注意优先跑白色边. code: ...

  6. log4j配置文件及java调用 每个级别输出到不同的文件

    #配置根Logger log4j.rootLogger = DEBUG , RollingFile,CONSOLE #文件大小达到一定尺寸的时候创建一个新的文件 log4j.appender.Roll ...

  7. A Simple Problem with Integers BZOJ3212 线段树

    You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of op ...

  8. Mybatis学习笔记(二) —— mybatis入门程序

    一.mybatis下载 mybaits的代码由github.com管理,下载地址:https://github.com/mybatis/mybatis-3/releases 下载完后的目录结构: 二. ...

  9. sublime中正则替换

    匹配 <header></header>  ,  “.” 是匹配任意 非 换行 符号 而  \s\S 匹配任何符号 匹配div class为navbar 的 div <d ...

  10. 1065. A+B and C (64bit) (20)

    Given three integers A, B and C in [-263, 263], you are supposed to tell whether A+B > C. Input S ...