精华内容
下载资源
问答
  • Java防SQL注入

    2018-05-31 10:34:00
    SQL 注入简介: SQL注入是最常见的攻击方式之一,它不是利用操作系统或其它系统的漏洞来实现攻击的,而是程序员因为没有做好判断,被不法用户钻了SQL的空子,下面我们先来看下什么是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.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。2.永远不要...

    我们知道,我们的程序如果扩展性不好,很可能被sql注入,我们可以通过集中方法在避免。

    1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和

    双"-"进行转换等。

    2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。

    3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

    4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。

    5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装

    6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。

    2:我们在java中设置变量值的时候,使用?来代替变量,而不是采用如 inserti into test values(test,'1',''2')这种的。

    3:我们可以通过过滤器来操作,我们看下面的web.xml加入的代码:

    preventIntoScriptFilter

    com.questionnaire.common.filter.PreventIntoScriptFilter

    preventIntoScriptFilter

    *.view

    然后我们通过一个filter来实现:

    java代码如下:

    package com.questionnaire.common.filter;

    import java.io.IOException;

    import java.util.regex.Matcher;

    import java.util.regex.Pattern;

    import javax.servlet.Filter;

    import javax.servlet.FilterChain;

    import javax.servlet.FilterConfig;

    import javax.servlet.ServletException;

    import javax.servlet.ServletRequest;

    import javax.servlet.ServletResponse;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    import org.apache.commons.logging.Log;

    import org.apache.commons.logging.LogFactory;

    public class PreventIntoScriptFilter implements Filter {

    private static Log log = LogFactory.getLog(PreventIntoScriptFilter.class);

    @Override

    public void destroy() {

    }

    @SuppressWarnings("deprecation")

    @Override

    public void doFilter(ServletRequest servletRequest,

    ServletResponse servletResponse, FilterChain chain)

    throws IOException, ServletException {

    HttpServletRequest request = (HttpServletRequest) servletRequest;

    HttpServletResponse response = (HttpServletResponse) servletResponse;

    try {

    String s = request.getQueryString();

    if (s != null) {

    // System.out.println("+++++++++++++++++++++++" + s);

    Pattern pattern = Pattern

    .compile("(?i)[|;$@'\"<>()+,\\\\#]|%7C|%3B|%24|%40|%27|%22|%3C|%3E|%28|%29|%2B|%2C|%5C|%23");

    Matcher matcher = pattern.matcher(s);

    if (matcher.find()) {

    String s3 = s

    .replaceAll(

    "(?i)[|;$@'\"<>()+,\\\\#]|%7C|%3B|%24|%40|%27|%22|%3C|%3E|%28|%29|%2B|%2C|%5C|%23",

    "");

    // System.out.println("+++++++++++++++++++++++" + s3);

    response.sendRedirect(request.getRequestURL() + "?" + s3);

    }

    }

    } catch (Exception e) {

    log.error("PreventIntoScriptFilter 出错了:" + e);

    }

    chain.doFilter(request, response);

    }

    @Override

    public void init(FilterConfig filterConfig) throws ServletException {

    }

    }

    这样我们就可以避免了

    展开全文
  • JAVA防sql注入

    2011-10-12 09:30:19
    package com.baihe.common; /**  * 防sql注入  * @author 刘德超 2011-08-01  */ public class StringUtil {  public StringUtil() {  }
     
    

    package com.baihe.common;
    /**
     * 防sql注入
     * @author 刘德超 2011-08-01
     */
    public class StringUtil {

        public StringUtil() {
        }

        public static String replace(String str, String substr, String restr) {
            String[] tmp = split(str, substr);
            String returnstr = null;
            if (tmp.length != 0) {
                returnstr = tmp[0];
                for (int i = 0; i < tmp.length - 1; i++)
                    returnstr = isNullAsEmpty(returnstr) + restr + tmp[i + 1];
            }
            return isNullAsEmpty(returnstr);
        }

        public static String[] split(String source, String div) {
            int arynum = 0, intIdx = 0, intIdex = 0, div_length = div.length();
            if (source.compareTo("") != 0) {
                if (source.indexOf(div) != -1) {
                    intIdx = source.indexOf(div);
                    for (int intCount = 1;; intCount++) {
                        if (source.indexOf(div, intIdx + div_length) != -1) {
                            intIdx = source.indexOf(div, intIdx + div_length);
                            arynum = intCount;
                        } else {
                            arynum += 2;
                            break;
                        }
                    }
                } else
                    arynum = 1;
            } else
                arynum = 0;

            intIdx = 0;
            intIdex = 0;
            String[] returnStr = new String[arynum];

            if (source.compareTo("") != 0) {

                if (source.indexOf(div) != -1) {

                    intIdx = (int) source.indexOf(div);
                    returnStr[0] = (String) source.substring(0, intIdx);

                    for (int intCount = 1;; intCount++) {
                        if (source.indexOf(div, intIdx + div_length) != -1) {
                            intIdex = (int) source
                                    .indexOf(div, intIdx + div_length);

                            returnStr[intCount] = (String) source.substring(intIdx
                                    + div_length, intIdex);

                            intIdx = (int) source.indexOf(div, intIdx + div_length);
                        } else {
                            returnStr[intCount] = (String) source.substring(intIdx
                                    + div_length, source.length());
                            break;
                        }
                    }
                } else {
                    returnStr[0] = (String) source.substring(0, source.length());
                    return returnStr;
                }
            } else {
                return returnStr;
            }
            return returnStr;
        }

        public static boolean sql_inj(String str) {
            String inj_str = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";
            String inj_stra[] = split(inj_str, "|");
            for (int i = 0; i < inj_stra.length; i++) {
                if (str.indexOf(inj_stra[i]) >= 0) {
                    return true;
                }
            }
            return false;
        }

        private static String isNullAsEmpty(String str) {
            String returnstr = null;
            if (str == null)
                returnstr = "";
            else
                returnstr = str;
            return returnstr;
        }

        public static void main(String[] args) {
            System.out.println(sql_inj("admin;"));
        }
    }

    展开全文
  • //: 防止一般SQL注入// 调用方法:PreventInfusion.sqlInfusion(str);public class PreventInfusion {private static final String inj_str = "'@and@exec@insert@select@delete@update@count@*@%@chr@mid@master@...

    //: 防止一般SQL注入

    //  调用方法:PreventInfusion.sqlInfusion(str);

    public class PreventInfusion {

    private static final String inj_str = "'@and@exec@insert@select@delete@update@count@*@%@chr@mid@master@truncate@char@declare@;@or@lock table@grant@drop@ascii@-@+@,";

    private static String strReplace(String str, String restr) {

    return str.replace(restr, "");

    }

    private static String dealNull(String str) {

    String returnstr = null;

    if (str == null)

    returnstr = "";

    else

    returnstr = str;

    return returnstr;

    }

    public static String sqlInfusion(String str) {

    String inj_stra[] = inj_str.split("@");

    str = dealNull(str);

    str = str.toLowerCase();

    for (int i = 0; i < inj_stra.length; i++) {

    if (str.indexOf(inj_stra[i]) >= 0) {

    str = strReplace(str, inj_stra[i]);

    }

    }

    return str;

    }

    public static void main(String[] args) {

    System.out.println(sqlInfusion(""));

    System.out.println(sqlInfusion("null"));

    System.out.println(sqlInfusion(null));

    System.out.println(sqlInfusion("'adm'in,SELEct;"));

    }

    }

    展开全文
  • Java 防SQL注入方法

    千次阅读 2017-06-21 10:38:39
    Java 防SQL注入方法
  • SQL 注入简介:SQL注入是最常见的攻击方式之一,它不是利用操作系统或其它系统的漏洞来实现攻击的,而是程序员因为没有做好判断,被不法用户钻了SQL的空子,下面我们先来看下什么是SQL注入:比如在一个登陆界面,要求用户...
  • java 防sql注入

    2010-10-27 21:29:42
     //: 防止一般SQL注入 // 调用方法:PreventInfusion.sqlInfusion(str); public class PreventInfusion { private static final String inj_str = "'@and@exec@insert@select@delete...
  • SQL 注入簡介: SQL注入是最常見的攻擊方式之一,它不是利用操作系統或其它系統的漏洞來實現攻擊的,而是程序員因為沒有做好判斷,被不法用戶鑽了SQL的空子,下面我們先來看下什么是SQL注入:比如在一個登陸界面,要求用戶...
  • java防sql注入攻击过滤器

    热门讨论 2011-08-09 17:28:20
    java防sql注入攻击过滤器 filter
  • 前沿在现有的框架中sql注入已经做得很好了,我们需要做的就是尽量不要使用sql拼接调用java sql注入原因以及预防方案(易理解)1. SQL注入1.1 原理SQL注入是通过客户端的输入把SQL命令注入到一个应用的数据库中,从而...
  • SQL 注入简介:SQL注入是最常见的攻击方式之一,它不是利用操作系统或其它系统的漏洞来实现攻击的,而是程序员因为没有做好判断,被不法用户钻了SQL的空子,下面我们先来看下什么是SQL注入:比如在一个登陆界面,要求用户...
  • public final static String filterSQLInjection(String s) {if (s == null || "".equals(s)) {return "";}try {s = s.trim().replaceAll("?[s,S][c,C][r,R][i,I][p,P][t,T]>?", "");//scripts = s.trim().replac...
  • import java.sql.*;import user.entity.User;/** *//*** 用户数据访问层* @author http://www.my400800.cn*@version 1.0*日期2010 01 12*/public class UserDAO {/** *//*** 根据用户名和密码查找用户,找到了返回 ...
  • 我在做网站的时候有一个需要在不同的插入时间改变查询的逻辑结构,这个时候用PreparedStatement就...这样我们任意拼接我们的sql语句还可以防止sql注入的困扰。平时我都是用Hibernate进行操作,但有时我多表查询是Hibe...
  • 这里的防sql注入的过滤器可以对普通get/post请求进行参数过滤,也可以对post+application/json等请求进行参数过滤。该过滤器使用了请求的包装类,具体参考我的上一篇文章https://www.jianshu.com/p/579558b6dc63,...
  • 最近看到很多人的网站都被注入js,被iframe之类的。非常多。本人曾接手过一个比较大的网站,被人家***了,要我收拾残局。。2.其次,用麦咖啡自定义策略,即使网站程序有漏洞,别人也很难在文件上写入代码了。参考...
  • 2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。4.不要把机密信息直接存放,加密或者...
  • Java 防SQL注入过滤器代码

    万次阅读 2018-01-14 18:55:22
    所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,达到一定的非法用途。 解决办法 1、配置WEB-INF/web.xml web-app&...
  • 传参数前rankid=URLEncoder.encode(rankid, "UTF-8 ");...防SQL注入:在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Sta...
  • java 防sql注入代码

    2009-05-11 16:30:36
    很强大的防SQL注入,针对JAVA系统 方便使用,作为过滤器使用。
  • import javax.servlet..../*** 防SQL注入工具类* 把SQL关键字替换为空字符串* @author zhao* @since 2015.7.23*/public class AntiSqlInjection {public final static String regex = "'|%|--|and|or|not|use|in...
  • 前言浅谈SQL注入:所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,达到一定的非法用途。解决办法1、配置WEB-INF/web.xmlindex....
  • 慕仙森PreparedStatement是可行的,因为它们使SQL注入成为不可能。下面是一个简单的示例,将用户的输入作为参数:publicinsertUser(Stringname,Stringemail){Connectionconn=null;PreparedStatementstmt=null;try{...
  • 引入common-lang-2.4.jar中一个方便做转义的工具类,主要是为了防止sql注入,xss注入攻击的功能官方参考文档StringEscapeUtils.unescapeHtml(sname)1.escapeSql 提供sql转移功能,防止sql注入攻击,例如典型的万能...
  • Richard..6您需要以下代码.乍一看,这可能看起来像我编写的任何旧代码.但是,我所做的是查看... java.然后,我仔细查看了setString(int par...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 566
精华内容 226
关键字:

java防sql注入

java 订阅