批量in查询中可能会导致的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语句,尽量使用拼接,减少数据库的打开与关闭。

时间: 2024-10-29 19:05:32

批量in查询中可能会导致的sql注入问题的相关文章

批量 kill mysql 中运行时间长的sql

转自:思齐-批量 kill mysql 中运行时间长的sql 以下内容来自mysql手册: 13.5.5.3. KILL语法KILL [CONNECTION | QUERY] thread_id每个与mysqld的连接都在一个独立的线程里运行,您可以使用SHOW PROCESSLIST语句查看哪些线程正在运行,并使用KILL thread_id语句终止一个线程. KILL允许自选的CONNECTION或QUERY修改符: · KILL CONNECTION与不含修改符的KILL一样:它会终止与给

PHP中该怎样防止SQL注入?

因为用户的输入可能是这样的: ? 1 value'); DROP TABLE table;-- 那么SQL查询将变成如下: ? 1 INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--') 应该采取哪些有效的方法来防止SQL注入? 最佳回答(来自Theo): 使用预处理语句和参数化查询.预处理语句和参数分别发送到数据库服务器进行解析,参数将会被当作普通字符处理.这种方式使得攻击者无法注入恶意的SQL. 你有两种选择

PHP中该怎样防止SQL注入

因为用户的输入可能是这样的: 1 value'); DROP TABLE table;-- 那么SQL查询将变成如下: 1 INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--') 应该采取哪些有效的方法来防止SQL注入? 最佳回答(来自Theo): 使用预处理语句和参数化查询.预处理语句和参数分别发送到数据库服务器进行解析,参数将会被当作普通字符处理.这种方式使得攻击者无法注入恶意的SQL. 你有两种选择来实现该

JAVA中过滤特殊字符预防SQL注入

package cn.com.hbivt.util; public class StringUtils { //过滤通过页面表单提交的字符 private static String[][] FilterChars={{"<","<"},{">",">"},{" "," "},{"\"","""},{&q

c#执行sql语句里面带有like查询的时候如何防止sql注入

#region/// 过滤html,js,css代码       /// <summary>       /// 过滤html,js,css代码       /// </summary>       /// <param name="html">参数传入</param>       /// <returns></returns>       public static string CheckStr(string

防御SQL注入的方法总结

这篇文章主要讲解了防御SQL注入的方法,介绍了什么是注入,注入的原因是什么,以及如何防御,需要的朋友可以参考下 SQL 注入是一类危害极大的攻击形式.虽然危害很大,但是防御却远远没有XSS那么困难. SQL 注入可以参见:https://en.wikipedia.org/wiki/SQL_injection SQL 注入漏洞存在的原因,就是拼接 SQL 参数.也就是将用于输入的查询参数,直接拼接在 SQL 语句中,导致了SQL 注入漏洞. 1. 演示下经典的SQL注入 我们看到:select i

SQL 注入防御方法总结

SQL 注入是一类危害极大的攻击形式.虽然危害很大,但是防御却远远没有XSS那么困难. SQL 注入可以参见:https://en.wikipedia.org/wiki/SQL_injection SQL 注入漏洞存在的原因,就是拼接 SQL 参数.也就是将用于输入的查询参数,直接拼接在 SQL 语句中,导致了SQL 注入漏洞. 1. 演示下经典的SQL注入 我们看到:select id,no from user where id=2; 如果该语句是通过sql字符串拼接得到的,比如: Strin

关于SQL注入与防注入

SQL 注入漏洞存在的原因,就是拼接 SQL 参数.也就是将用于输入的查询参数,直接拼接在 SQL 语句中,导致了SQL 注入漏洞. 简单来说,就是别人可以通过你的语法漏洞向你的数据库随便添加数据 解决办法: 采用sql语句预编译和绑定变量,是防御sql注入的最佳方法 String sql = "select id, no from user where id=?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setIn

37. SQL -- 页分裂如何解决,在查询中强制使用索引

页分裂: 创建聚集索引时,表格内的数据会按照索引的顺序存储在数据库的数据页面中,当新的数据行插入到数据表中,或更新表中的数据时,SQLServer 必须刷新数据在数据库中的存储位置,这样,就导致索引页中的数据存储方式改变,当页中数据已满的情况下,就将会创建一个新页,并将原有页中的一半数据放入新页中,以挪出空间给新的记录行使用.注:当页分裂的次数较多时,会影响效率. 导致页分裂原因: 当一个数据页达到了8K容量,如果此时发生插入或更新数据的操作,将导致页的分裂(又名页拆分): 有聚集索引的情况下: