那为什么出现以上问题呢?这是程序代码层控制不当导致的。如果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. oracle之按表名查询表字段结构

    工作中查看oracle表结构, 1,pl/sql或其他开发工具可以输入表名然后ctr+点击表名就可以看见表结构: 2,表字段过多,如果给第三方截图看比较麻烦,得截好几次,容易看眼花,可以查询如下sql ...

  2. ML_Homework_Porject_1_KMeans

    第一次机器学习的作业完成了,按照先前做实作的习惯来写一下总结和思考. 作业要求:对COIL20,Yale_32x32,data_batch_1(Cifar)三个数据集,分别运用KMeans对其中的图片 ...

  3. T-MAX—项目系统设计与数据库设计

    团队作业第四次-项目系统设计与数据库设计 这个作业属于哪个课程 2019秋福大软件工程实践Z班 这个作业要求在哪里 团队作业第四次-项目系统设计与数据库设计 团队名称 T-MAX 这个作业的目标 在开 ...

  4. mysql 实现同一个sql查询 分页数据 和总记录数

    $get_sql = "SELECT sql_calc_found_rows field1,field2 FROM table WHERE name = '1' order by add_t ...

  5. Mac地址转换成long长整型

    Mac地址转换成long长整型 using System;using System.Collections.Generic;using System.IO;using System.Text;usin ...

  6. 阿里巴巴高可用技术专家襄玲:压测环境的设计和搭建 PTS - 襄玲 云栖社区 今天

    阿里巴巴高可用技术专家襄玲:压测环境的设计和搭建 PTS - 襄玲 云栖社区 今天

  7. PCA与LDA

  8. osg 3ds模型加载与操作

    QString item1 = QString::fromStdString(groupParam->getChild(k)->getName()); QStandardItem* ite ...

  9. Qt编写数据导出到Excel及Pdf和打印数据

    一.前言 用Qt开发已经九年了,期间用Qt做过不少的项目,在各种项目中有个功能很常用,尤其是涉及到数据记录存储的项目,那就是需要对查询的数据进行导出到Excel,或者导出到Pdf文件,或者直接打印查询 ...

  10. Apache配置优化之开启KeepAlive

    在HTTP 1.0中和Apache服务器的一次连接只能发出一次HTTP请求,而KeepAlive参数支持HTTP 1.1版本的一次连接,多次传输功能,这样就可以在一次连接中发出多个HTTP请求.从而避 ...