有关replaceAll的性能问题

logon29 2009-11-20 09:36:35
给网站做了个防sql注入的函数,对所有提交的页面参数进行过滤,函数如下:

public static String getParaStr(String s) {
if (s == null)
return "";
else{
String regx = "([\\s\b])+(select|update|insert|delete){1}([\\s\b]+)";//省略了部分关键字
s = s.replaceAll(regx,"");
return s.toString()
.replaceAll("=", "=")
.replaceAll("\\+", "+")
.replaceAll("--", "——")
.replaceAll("\\*", "×")
.replaceAll("'", "‘")
.replaceAll("\"", "“")
.replaceAll("\\(", "(")
.replaceAll("\\)", ")")
.replaceAll("<", "〈")
.replaceAll(">", "〉")
.replaceAll(";", ";")
.replaceAll(":", "∶")
.replaceAll("\\?","?");
}
}

这个函数会被频繁调用,是否对内存的消耗很大?特别是在高并发的时候?
一般一个网站(企业网站)的每秒并发量会在多少以上?
...全文
1185 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
logon29 2009-11-23
  • 打赏
  • 举报
回复
唉,我搞错了。
关键字部分是不能替换一个,因为用了空字符串去替换,存在我说的两个关键字被替换成一个的情况。
符号替换了后,应该说大部分不存在我说的这种情况,不过,单引号可能你要另外考虑。
logon29 2009-11-20
  • 打赏
  • 举报
回复
知道预编译可以处理这个问题,关键是本来就是组装sql字符串的,改为预编译的成本太大了。
justinavril 2009-11-20
  • 打赏
  • 举报
回复
防注入需要把所有的都替换掉么?感觉没必要。许多字符是需要配合在一起使用的。另外,能不能在替换之前先判读一下?
zhouyongyang 2009-11-20
  • 打赏
  • 举报
回复
楼主这是多此一举了,,预编译能防止SQL注入,,,
hardycheng 2009-11-20
  • 打赏
  • 举报
回复
预编译不是能防止sql注入吗?
phyerbarte 2009-11-20
  • 打赏
  • 举报
回复
这个效率损耗肯定是有的,但是不会太大。看你服务器的能力了,还有html页面数据量。
goodmrning 2009-11-20
  • 打赏
  • 举报
回复
up!
logon29 2009-11-20
  • 打赏
  • 举报
回复
同学们,这不是单字替换啊。。。
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 logon29 的回复:]
如果只替换一个,那么他连续输入两个符号,替换后不就剩下一个了。

所以说有必要用replaceAll的。
[/Quote]

输入两个符号,替换后怎么会变成一个呢?replace(char, char) 好像没这功能吧?
  • 打赏
  • 举报
回复
单字符替换请使用 String#replace(char, char) 这个方法!
panhaichun 2009-11-20
  • 打赏
  • 举报
回复
效率高不高看参数s有多长。



另外:用PrepareStatement执行sql,基本不存在sql注入问题,无需过滤
zfangla 2009-11-20
  • 打赏
  • 举报
回复
对内存消耗是不大的, 但效率低, 也就是时间消耗大, 比如你使用了10个replaceAll, 就要消耗10 * Q的时间. 既然都是单字符替换, 还不如自己来写替换方法, 消耗时间只需要Q.
阿_布 2009-11-20
  • 打赏
  • 举报
回复
换成replace效率会好一点。
wifewifewife 2009-11-20
  • 打赏
  • 举报
回复
logon29 2009-11-20
  • 打赏
  • 举报
回复
如果只替换一个,那么他连续输入两个符号,替换后不就剩下一个了。

所以说有必要用replaceAll的。
whut0802 2009-11-20
  • 打赏
  • 举报
回复
学习
hbgzg3006 2009-11-20
  • 打赏
  • 举报
回复
replaceAll("\\*", "×"),这个只是替换*为×,ps:由于是正则*需要转义,也就成了\\*了
……
healer_kx 2009-11-20
  • 打赏
  • 举报
回复
你替换的字符可真多啊,想诸如真难。。。
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 logon29 的回复:]
同学们,这不是单字替换啊。。。
[/Quote]

.replaceAll("\\*", "×")
.replaceAll("'", "‘")
.replaceAll("\"", "“")
.replaceAll("\\(", "(")
.replaceAll("\\)", ")")
.replaceAll("<", "〈")
.replaceAll(">", "〉")
.replaceAll(";", ";")
.replaceAll(":", "∶")
.replaceAll("\\?","?");


你这不是单字替换,那是什么?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧