欢迎投稿

今日深度:

批量in查询中可能会导致的sql注入问题,sql注入

批量in查询中可能会导致的sql注入问题,sql注入


有时间我们在使用in或者or进行查询时,为了加快速度,可能会经常这样来使用sql之间的拼接,然后直接导入到一个in中,这种查询实际上性能上还是可以的,

例如如下:

update keyword set stats=? where taskid in ('"+CollUtil.toString(list, "','")+"') "
当然这个in里面包含的是一些列的数据()但是如果这些数据中包含一些sql比较敏感的关键词或者符号就会出现sql注入,例如如果in查询中出现一个关键词为(百度'  )这个单引号在sql中就是比较敏感的字符,这就会导致你的这条语句执行失败。如果我们在写代码时如果不注意这些问题,就会引起一些黑客们的攻击,例如:如果某个黑客搞个语句,里面含有MySQL识别的注释符号,然后黑客通过拼接好后 直接执行一个delete操作,那么你的数据库系统就这样完蛋了。


实际上面对这些问题,我们最好不要通过自己排除的方式来,因为很可能出现我们意想不到的情况出现,所以我们在进行无论查询或者更改插入之类的操作时,最好使用问号表达式,这样能够防注入。


但是如果有些特殊情况下,我们的系统使我们内部使用,我们也可以是适当的使用in或者or查询,但是我们在in()这个括号里面要注意数量问题,这个问题因不同的版本in中包含的量估计都是不一样的。我们最好可以通过一些算法来控制这个量,最好是自己做一下压力测试,看看到底你的in中能够包含多大的数据量,当然我曾经做过压力测试,in里面可以包含16W多,当时我是包含了64个字长的英语字母和汉字,在进行操作时,可能会因为字段的长度不同,速度肯定都会不同。

 int size = ids.size();  
        int loopNum = (size%1000==0)?(size/1000):(size/1000 + 1);  
        if(size==0){  
            return;  
        }  
        for(int cp=1;cp<=loopNum;cp++){  
            int beginRecord = (cp - 1) * 1000;  
            int endRecord = cp*1000;  
            if(endRecord >= size){  
                endRecord = size;  
            }  
            // 分批进行任务获取  
            List<String> list = ids.subList(beginRecord, endRecord);  

当然我这只是一个分组算法的实例,我们平常在使用这种性能不是太好的查询是也要注意分组进行,如果不这样,MySQL可能会报一些packet过大的异常或者请检查你的版本异常,如果你发现你的sql语句没有问题,这时你就该应该注意到这个问题了。


还有一点,我们在一个函数中进行写sql语句时,如果一条sql能够搞定,我们也尽量不要使用第二条,因为数据库的打开与关闭是非常耗时的操作,所以我们在使用编程语言进行写程序时,要尽量使用我们工具类中给我们提供的一些类,例如:

  StringBuffer buffer = new StringBuffer();  
            buffer.append("update keyword set stats=? ");  
            paramsList.add(stats);  
            if(stats==Stats.pend.getCode()){  
                buffer.append(",pend=? ");  
                paramsList.add(new Date());  
            }  
            buffer.append("  where taskid in ('"+CollectionUtil.toString(list, "','")+"') ");
这样如果在满足2条sql语句的情况下,实际上1条sql就直接搞定了。这样还能够增加代码执行的速度。特别是数据量特别大的情况下,更要减少一个函数中的sql语句,尽量使用拼接,减少数据库的打开与关闭。


实现模糊查询并可以防止sql注入的方法有什,急救

//定义变量
String txt_editor=ultraTextEditor4.Text;
StringBuilder str_where = new StringBuilder();
str_where.Append(" AND ");
str_where.Append(SqlFactory .CreateWhereExpression (CtbClass1.IC_ORG_NAME ,WhereExpression.LIKE,"'%"+ @txt_editor +"%'").BuildSql());
 

SQL注入问题

通用的asp防注入程序.杜绝SQL注入隐患.提升网站安全

一般的http请求不外乎 get 和 post,所以只要我们在文件中过滤所有post或者get请求中的参数信息中非法字符即可,所以我们实现http 请求信息过滤就可以判断是是否受到sql注入攻击。
IIS传递给asp.dll的get请求是是以字符串的形式,当传递给Request.QueryString数据后,asp解析器会分析Request.QueryString的信息,然后根据"&",分出各个数组内的数据所以get的拦截如下:
首先我们定义请求中不能包含如下字符
'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|xp_cmdshell
各个字符用"|"隔开,,然后我们判断的得到的Request.QueryString
具体代码如下

程序代码:

Dim sql_injdata
SQL_injdata = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|xp_cmdshell"
SQL_inj = split(SQL_Injdata,"|")

If Request.QueryString<>"" Then
For Each SQL_Get In Request.QueryString
For SQL_Data=0 To Ubound(SQL_inj)
If InStr(Request.QueryString(SQL_Get),Sql_Inj(Sql_DATA))>0 Then
Response.Write("<script language=""javascript"" type=""text/javascript"">alert(""提交的信息中包含非法字符!"");</script>")
Response.End()
End If
Next
Next
End If

这样我们就实现了get请求的注入的拦截,但是我们还要过滤post请求,所以我们还得继续考虑request.form,这个也是以数组形式存在的,,我们只需要再进一次循环判断即可。代码如下

程序代码:
If Request.Form<>"" Then
For Each SQL_Get In Request.Form
For SQL_Data=0 To Ubound(SQL_inj)
If InStr(Request.QueryString(SQL_Get),Sql_Inj(Sql_DATA))>0 Then
Response.Write(&......余下全文>>
 

www.htsjk.Com true http://www.htsjk.com/shujukunews/3506.html NewsArticle 批量in查询中可能会导致的sql注入问题,sql注入 有时间我们在使用in或者or进行查询时,为了加快速度,可能会经常这样来使用sql之间的拼接,然后直接导入到一个in中,这种查询实际上...
评论暂时关闭