那为什么出现以上问题呢?这是程序代码层控制不当导致的。如果web前端对输入数据控制严格,会对数据库进行操作的字符串,在客户端做敏感字符转义处理,或者在操作数据库的dao层,使用动态参数的sql,不使用拼接方式的sql,都可以防止该类问题的发生。

一般情况,如果测试人员了解dao层的具体设计,如果使用的就是非拼接方式的,基本是可以拦截大部分这些存在问题的sql了。而如果使用的是拼接方式,就可以好好的设计测试用例,进行测试了。

那又为什么非拼接方式就可以有效的防止SQL注入测试呢?

修改上部分核心代码块,采用动态sql(预编译sql方式):

String hql="delete from Department where name=?";

Query query = session.createQuery(hql);

query.setString(0, name);

同样输入的代码存在问题:

可是结果却没有删除。为什么呢?

因为在setString方法中实现了对字符串中敏感字符的转义。Jdk提供PreparedStatemen接口,在mysql的jar包中,PreparedStatement实现了jdk中的PreparedStatement,里面的setString方法如下:

  1. public void setString(int parameterIndex, String x) throws SQLException {
  2. // if the passed string is null, then set this column to null
  3. if (x == null) {
  4. setNull(parameterIndex, Types.CHAR);
  5. else {
  6. StringBuffer buf = new StringBuffer((int) (x.length() * 1.1));
  7. buf.append('\'');
  8. int stringLength = x.length();
  9. //
  10. // Note: buf.append(char) is _faster_ than
  11. // appending in blocks, because the block
  12. // append requires a System.arraycopy()....
  13. // go figure...
  14. //
  15. for (int i = 0; i < stringLength; ++i) {
  16. char c = x.charAt(i);
  17. switch (c) {
  18. case 0: /* Must be escaped for 'mysql' */
  19. buf.append('\\');
  20. buf.append('0');
  21. break;
  22. case '\n': /* Must be escaped for logs */
  23. buf.append('\\');
  24. buf.append('n');
  25. break;
  26. case '\r':
  27. buf.append('\\');
  28. buf.append('r');
  29. break;
  30. case '\\':
  31. buf.append('\\');
  32. buf.append('\\');
  33. break;
  34. case '\'':
  35. buf.append('\\');
  36. buf.append('\'');
  37. break;
  38. case '"': /* Better safe than sorry */
  39. if (this.usingAnsiMode) {
  40. buf.append('\\');
  41. }
  42. buf.append('"');
  43. break;
  44. case '\032': /* This gives problems on Win32 */
  45. buf.append('\\');
  46. buf.append('Z');
  47. break;
  48. default:
  49. buf.append(c);
  50. }
  51. }
  52. buf.append('\'');
  53. String parameterAsString = buf.toString();
  54. byte[] parameterAsBytes = null;
  55. if (!this.isLoadDataQuery) {
  56. parameterAsBytes = StringUtils.getBytes(parameterAsString,
  57. this.charConverter, this.charEncoding, this.connection
  58. .getServerCharacterEncoding(), this.connection
  59. .parserKnowsUnicode());
  60. else {
  61. // Send with platform character encoding
  62. parameterAsBytes = parameterAsString.getBytes();
  63. }
  64. setInternal(parameterIndex, parameterAsBytes);
  65. }
  66. }

Hql进行动态参数绑定也存在很多种其他方法:按参数名称绑定,按参数位置绑定, setParameter()方法等等。http://baike.baidu.com/link?url=NKt6I-Gk0HnyFRWyZ0_ZuDe0pz_aDqVul-VDJZCDCGl9K5LsBghBfxhPVJmZh9qmBKtXgY2EqAqK1oQUNK2Su_

sql注入测试(3)---现象分析的更多相关文章

  1. java web sql注入测试(3)---现象分析

    那为什么出现以上问题呢?这是程序代码层控制不当导致的.如果web前端对输入数据控制严格,会对数据库进行操作的字符串,在客户端做敏感字符转义处理,或者在操作数据库的dao层,使用动态参数的sql,不使用 ...

  2. java web sql注入测试(1)---概念概述

    在进行java web 测试时,经常会忽略的测试种类就是sql注入测试,这类缺陷造成的原因是开发技术在这方面欠缺的表现,虽然不常见,但一旦有这类缺陷,就很因此对运营的数据造成很多不必要的损失,所以,还 ...

  3. SQL注入测试平台 SQLol -1. 简介与安装

    最近下载了SQLol测试了一下,感觉挺好玩的,做一下记录. SQLol是一个可配置得SQL注入测试平台,它包含了一系列的挑战任务,让你在挑战中测试和学习SQL注入语句,SQLol还是比较有创意的项目. ...

  4. sql注入测试(1)---概念概述

    在进行java web 测试时,经常会忽略的测试种类就是sql注入测试,这类缺陷造成的原因是开发技术在这方面欠缺的表现,虽然不常见,但一旦有这类缺陷,就很因此对运营的数据造成很多不必要的损失,所以,还 ...

  5. SQL注入原理及代码分析(二)

    前言 上一篇文章中,对union注入.报错注入.布尔盲注等进行了分析,接下来这篇文章,会对堆叠注入.宽字节注入.cookie注入等进行分析.第一篇文章地址:SQL注入原理及代码分析(一) 如果想要了解 ...

  6. SQL注入测试平台 SQLol -2.SELECT注入测试

    前面,我们已经安装好了SQLol,打开http://localhost/sql/,首先跳转到http://localhost/sql/select.php,我们先从select模块进行测试. 一条完成 ...

  7. Sql注入测试--Sqlmap

    慕课网sqlmap学习笔记: 一.SQL注入 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 例如 (1)在url上 ...

  8. 通过BurpSuite和sqlmap配合对dvwa进行sql注入测试和用户名密码暴力破解

    0x1 工具和环境介绍 dvwa:渗透测试环境 BurpSuite:强大的WEB安全测试工具 sqlmap:强大的sql注入工具 以上工具和环境都在kali linux上安装和配置. 0x2 步骤说明 ...

  9. SQL注入原理及代码分析(一)

    前言 我们都知道,学安全,懂SQL注入是重中之重,因为即使是现在SQL注入漏洞依然存在,只是相对于之前现在挖SQL注入变的困难了.而且知识点比较多,所以在这里总结一下.通过构造有缺陷的代码,来理解常见 ...

随机推荐

  1. H2O框架简介

    H2O框架简介H2O是开源的,分布式的,基于内存的,可扩展的机器学习和预测分析框架,适合在企业环境中构建大规模机器学习模型. H2O核心代码使用Java编写,数据和模型通过分布式 Key/Value ...

  2. vue - 设置全局html背景

    需求 有时候有些组件需要全局设置body背景,有些不需要在组件中设置就行了 解决思路 1. 全局设置可以是html,body,这里大家可以试一下,这两个只要其中一个设置了background,另一个的 ...

  3. STL函数适配器

    一:适配器简介 C++中有三类适配器,分别是容器适配器,迭代器适配器和函数适配器,这里主要介绍函数适配器. (一)函数适配器简介 STL中已经定义了大量的函数对象,但是有时候需要对函数返回值进行进一步 ...

  4. 【419】C语言语句

    判断语句 C 语言提供了以下类型的判断语句.点击链接查看每个语句的细节. 语句 描述 if 语句 一个 if 语句 由一个布尔表达式后跟一个或多个语句组成. if...else 语句 一个 if 语句 ...

  5. navigationBarTitleText

    想修改整个程序的导航栏,在app.json 文件 修改 "window": { "backgroundTextStyle": "light" ...

  6. C# Newtonsoft.Json JObject 操作

    C# Newtonsoft.Json JObject 操作举例 JArray j = new JArray(); JObject obj = new JObject( ") ); JObje ...

  7. 【Leetcode_easy】703. Kth Largest Element in a Stream

    problem 703. Kth Largest Element in a Stream 题意: solution1: priority_queue这个类型没有看明白... class KthLarg ...

  8. winform_textbox控件只能输入数字

    //实现只限制输入数字事件 private void txtShowNum_KeyPress(object sender, KeyPressEventArgs e) { e.Handled = tru ...

  9. 基于Visual Studio Code搭建Vue开发环境

    安装node.js最新版 这里安装的是8.11.4版   image.png 更新npm至最新版 安装node.js后, npm默认版本为: 6.1.0   image.png 使用npm insta ...

  10. Andrew Ng机器学习课程17(2)

    Andrew Ng机器学习课程17(2) 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:主要介绍了利用value iteration和policy i ...