那为什么出现以上问题呢?这是程序代码层控制不当导致的。如果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_

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

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

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

  2. sql注入测试(3)---现象分析

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

  3. java web sql注入测试(4)--如何防止该类缺陷发生

    检查用户输入的合法性,确信输入的内容只包含合法的数据,数据检查应当在客户端和服务器端都执行之所以要执行服务器端验证,是为了弥补客户端验证机制脆弱的安全性.在客户端,攻击者完全有可能获得网页的源代码,修 ...

  4. java web sql注入测试(2)---实例测试

    以下篇幅,用一个简单的实例说明如何进行测试. 功能:根据用户NAME删除用户,采用的是SQL拼接的方式,核心代码部分如下: public static void deleteByName(String ...

  5. Java Web表达式注入

    原文:http://netsecurity.51cto.com/art/201407/444548.htm 0×00 引言 在2014年6月18日@终极修炼师曾发布这样一条微博: 链接的内容是一个名为 ...

  6. ref:一种新的攻击方法——Java Web表达式注入

    ref:https://blog.csdn.net/kk_gods/article/details/51840683 一种新的攻击方法——Java Web表达式注入 2016年07月06日 17:01 ...

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

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

  8. Java防止SQL注入的几个途径

    java防SQL注入,最简单的办法是杜绝SQL拼接,SQL注入攻击能得逞是因为在原有SQL语句中加入了新的逻辑,如果使用 PreparedStatement来代替Statement来执行SQL语句,其 ...

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

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

随机推荐

  1. start from here

    简单介绍下,小码农一只,工作两年左右,从事移动端游戏开发工作. 人类,精神正常,男,爱好游戏音乐足球美女,if(有妹子) 喜欢旅游;,取向正常. 很喜欢java,喜欢关注新技术, 应一些朋友的建议,今 ...

  2. 拷贝数据库和VS项目

    2个项目的相似度比较大,在另一个的基础上做修改,不想从头再来,把数据库和项目如何克隆一份呢? 数据库复制:(SQLSERVER2008) 任务-备份数据库 然后还原到新建的数据库名下即可 VS项目复制 ...

  3. magento多语言中文语言包

    语言包key:http://connect20.magentocommerce.com/community/Mage_Locale_zh_CN

  4. Given a binary tree containing digits from0-9only, each root-to-leaf path could represent a number. An example is the root-to-leaf path1->2->3which represents the number123. Find the total sum of a

    class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } public class ...

  5. LeetCode Single Number III

    原题链接在这里:https://leetcode.com/problems/single-number-iii/ 题目: Given an array of numbers nums, in whic ...

  6. SoapUI接口测试·第一个HTTP Request接口请求和断言

    一.新建SOAP项目 [File]-[New SOAP Project],在[Project Name]输入{工程名},点击[OK].   二.新建TestSuite 选中项目,右键选择[New Te ...

  7. linux修改hostname

    1.如果只是修改hostname可以通过如下命令 hostname newHostname 注意:这种修改方式只有当前有效,等服务器重启后hostname就会失效,回到原来的hostname. 2.如 ...

  8. Vue.2.0.5-混合

    基础 混合是一种灵活的分布式复用 Vue 组件的方式.混合对象可以包含任意组件选项.以组件使用混合对象时,所有混合对象的选项将被混入该组件本身的选项. 例子: // 定义一个混合对象 var myMi ...

  9. css元素position定位和z-index

    网页元素定位 1.注意点: 1)给元素设定高度要小心,除非给已知大小的图片设置高度,否则无法得知指定元素在页面上会有多高.此时最好通过padding等来控制高度. 2)对于同一个元素,不要讲float ...

  10. Fusioncharts使用说明

    背景 最近由于工作需要,再次接触到了Fusioncharts,但也有不足之处,现在官网上似乎是不支持flash的版本了,只能看到html5相关的javascript版本,无奈再次从网上搜索到了一些别人 ...