美文网首页
004.防止SQL注入工具类[非预处理版]

004.防止SQL注入工具类[非预处理版]

作者: 胖先森 | 来源:发表于2017-05-31 10:13 被阅读0次

在一期,二期阶段,有一些同学,对于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 语句之前对其中的特殊字符进行转义处理。
结果如下:

SELECT COUNT(userId) FROM t_user WHERE userName='1'' or ''1''=''1' AND password ='123456'

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

import org.apache.commons.lang.StringEscapeUtils;  
public class EscapeString {  
    public static void main(String[] args) throws Exception {  
        String str = "中国";  
        System.out.println("用escapeJava方法转义之后的字符串为:"+StringEscapeUtils.escapeJava(str));  
        System.out.println("用unescapeJava方法反转义之后的字符串为:"+StringEscapeUtils.unescapeJava(StringEscapeUtils.escapeJava(str)));  
          
        System.out.println("用escapeHtml方法转义之后的字符串为:"+StringEscapeUtils.escapeHtml(str));  
        System.out.println("用unescapeHtml方法反转义之后的字符串为:"+StringEscapeUtils.unescapeHtml(StringEscapeUtils.escapeHtml(str)));  
          
        System.out.println("用escapeXml方法转义之后的字符串为:"+StringEscapeUtils.escapeXml(str));  
        System.out.println("用unescapeXml方法反转义之后的字符串为:"+StringEscapeUtils.unescapeXml(StringEscapeUtils.escapeXml(str)));  
          
        System.out.println("用escapeJavaScript方法转义之后的字符串为:"+StringEscapeUtils.escapeJavaScript(str));  
        System.out.println("用unescapeJavaScript方法反转义之后的字符串为:"+StringEscapeUtils.unescapeJavaScript(StringEscapeUtils.escapeJavaScript(str)));  
        /**输出结果如下: 
         用escapeJava方法转义之后的字符串为:/u4E2D/u56FD/u5171/u4EA7/u515A 
        用unescapeJava方法反转义之后的字符串为:中国
        用escapeHtml方法转义之后的字符串为:中国
        用unescapeHtml方法反转义之后的字符串为:中国
        用escapeXml方法转义之后的字符串为:中国
        用unescapeXml方法反转义之后的字符串为:中国
        用escapeJavaScript方法转义之后的字符串为:/u4E2D/u56FD/u5171/u4EA7/u515A 
        用unescapeJavaScript方法反转义之后的字符串为:中国*/  
    }  
} 

参考的API文档:
https://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/package-summary.html

相关文章

  • 004.防止SQL注入工具类[非预处理版]

    在一期,二期阶段,有一些同学,对于SQL语句总是使用字符串的拼接,这是一个比较坏的毛病,这样非常影响我们的程序的安...

  • PHP面试题总结

    一.cookie与session的区别 二.php如何防止SQL注入 使用预处理语句和参数化查询。预处理语句和参数...

  • BUUCTF-Web-随便注(三种解题思路)

    知识点:SQL注入-堆叠注入,sql预处理语句,巧用contact()函数绕过 堆叠注入原理: 在SQL中,分号(...

  • idea搭建 mybatis框架

    {}方式能够很大程度防止sql注入,${}方式无法防止Sql注入。 SELECT deptno,dname,loc...

  • php面试题

    防止SQL注入简单回答:防止——利用即有的应用、功能,将(恶意)SQL命令发送到到后台数据库引擎。 防止SQL注入...

  • MySQL pdo预处理防止sql注入

    PDO执行预处理: 预处理的语法 服务器发送一条sql给mysql服务器,mysql服务器会解析这条sql。 服务...

  • sql注入风险

    SQL注入攻防入门详解 如何从根本上防止 SQL 注入 教您使用参数化SQL语句 参数化查询为什么能够防止SQL注...

  • Mybatis如何防止SQL注入

    Mybatis如何防止SQL注入 什么是SQL注入 sql注入是一种代码注入技术,将恶意的sql插入到被执行的字段...

  • JDBC进阶 & BeanUtils组件简介

    预编译sql处理(防止sql注入) Statement : 执行SQL命令CallableStatement : ...

  • 6.mysql安全性

    SQL语句应该考虑哪些安全性? Sql查询的安全方案【就是考察sql注入】 1.使用预处理语句,防Sql注入 【p...

网友评论

      本文标题:004.防止SQL注入工具类[非预处理版]

      本文链接:https://www.haomeiwen.com/subject/zmvdfxtx.html