【引用】java处理SQL特殊字符转义 防止sql注入

摘要:
网络中有大量讲解SQL注入的文章,感兴趣的读者可以搜索相关的资料深入研究。虽然SQL注入的后果很严重,但是只要对动态构造的SQL语句的变量进行特殊字符转义处理,就可以避免这一问题的发生了。所以除非必要,一般建议通过PreparedStatement参数绑定的方式构造动态SQL语句,因为这种方式可以避免SQL注入的潜在安全问题。为了防止他人使用特殊SQL字符破坏SQL的语句结构或植入恶意操作,必须在变量拼接到SQL语句之前对其中的特殊字符进行转义处理。

SQL特殊字符转义

应 该说,您即使没有处理 HTML 或 JavaScript 的特殊字符,也不会带来灾难性的后果,但是如果不在动态构造 SQL 语句时对变量中特殊字符进行处理,将可能导致程序漏洞、数据盗取、数据破坏等严重的安全问题。网络中有大量讲解 SQL 注入的文章,感兴趣的读者可以搜索相关的资料深入研究。

虽然 SQL 注入的后果很严重,但是只要对动态构造的 SQL 语句的变量进行特殊字符转义处理,就可以避免这一问题的发生了。来看一个存在安全漏洞的经典例子:

SELECT COUNT(userId) 
FROM t_user
WHERE userName='"+userName+"' AND password ='"+password+"';

以上 SQL 语句根据返回的结果数判断用户提供的登录信息是否正确,如果 userName 变量不经过特殊字符转义处理就直接合并到 SQL 语句中,黑客就可以通过将 userName 设置为 “1' or '1'='1”绕过用户名/密码的检查直接进入系统了。

所 以除非必要,一般建议通过 PreparedStatement 参数绑定的方式构造动态 SQL 语句,因为这种方式可以避免 SQL 注入的潜在安全问题。但是往往很难在应用中完全避免通过拼接字符串构造动态 SQL 语句的方式。为了防止他人使用特殊 SQL 字符破坏 SQL 的语句结构或植入恶意操作,必须在变量拼接到 SQL 语句之前对其中的特殊字符进行转义处理。Spring 并没有提供相应的工具类,您可以通过 jakarta commons lang 通用类包中(spring/lib/jakarta-commons/commons-lang.jar)的 StringEscapeUtils 完成这一工作:


清单 4. SqlEscapeExample

package com.baobaotao.escape;
import org.apache.commons.lang.StringEscapeUtils;
public class SqlEscapeExample {
public static void main(String[] args) {
String userName = "1' or '1'='1";
String password = "123456";
userName = StringEscapeUtils.escapeSql(userName);
password = StringEscapeUtils.escapeSql(password);
String sql = "SELECT COUNT(userId) FROM t_user WHERE userName='"
+ userName + "' AND password ='" + password + "'";
System.out.println(sql);
}
}

事 实上, StringEscapeUtils 不但提供了 SQL 特殊字符转义处理的功能,还提供了 HTML、XML、JavaScript、Java 特殊字符的转义和还原的方法。如果您不介意引入 jakarta commons lang 类包,我们更推荐您使用 StringEscapeUtils 工具类完成特殊字符转义处理的工作。

免责声明:文章转载自《【引用】java处理SQL特殊字符转义 防止sql注入》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Unity里面的自动寻路(一)html5 动态修改TITLE标题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java转义字符处理——“\”替换为“/”

replaceAll("\\", "/"); 例如 //获取项目路径,并将转换为/File directory = new File(""); String courseFile = directory.getCanonicalPath().replaceAll("\\", "/"); 注意String a="a\b" 打印出来后变成a...

Resttemplateget带特殊字符调用 异常处理总结

Resttemplateget带特殊字符调用 异常处理总结 Resttemplate设置Accept RestTemplate restTemplate = new RestTemplate(); HttpHeaders httpHeaders = new HttpHeaders(); List<MediaType> acceptableMed...

PHP的json_encode()函数的引号

PHP的json_encode()函数的引号 (1)数组的索引和值都使用双引号 $a = ["id"=>1,"age"=>12,"name"=>"张三"];var_dump(json_encode($a));//结果:string(39) "{"id":1,"age":12,"name":"u5f20u4e09"}"; (2)数组的索引...

现在主流的开源java连接池

现在主流的开源java连接池: 在Java中开源的数据库连接池有以下几种 :1, C3P0 C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate[1]一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。C3P0:http://sourceforge....

解决PHP json_encode() 编码字符中包含<>时,转化为\u003E\u003C

一、PHP json_encode里面经常用到的 JSON_UNESCAPED_UNICODE和JSON_UNESCAPED_SLASHES php格式化json的函数 json_encode($value,$options) 其中有2个比较常用到的参数 JSON_UNESCAPED_UNICODE(中文不转为unicode ,对应的数字 256) J...

前端处理特殊字符的方法

js中 urlencode编码 encodeURIComponent(编码的具体内容) 解码 decodeURIComponent(解码码的具体内容) 原理:对URL的组成部分进行个别编码,而不用于对整个URL进行编码    let ds=encodeURIComponent("kkddd+")    特殊字符的处理完毕之后,后端需要...