为什么感觉在实际的测试中ORDER BY注入的比例变高了

栏目: 数据库 · 发布时间: 7年前

内容简介:为什么感觉在实际的测试中ORDER BY注入的比例变高了

之前去阿里先知大会的时候, 在听greg.wu的议题的时候, 听到他提了一下他挖order by注入的比例占所有注入比例的20-30%(如果没记错的话)

为什么感觉在实际的测试中ORDER BY注入的比例变高了

自己在各种测试的过程中,发现的order by注入也确实不少, 每次看到order,sort之类的参数都会有点小兴奋。

那为什么在现在 sql 注入越来越少的情况下,order by注入的比例还不低呢。

我感觉是因为常见的查询,直接自己预编译或者用框架里的一些方法就能防止掉注入。

但是order by time这种 排序 是不能通过直接预编译来搞的,

因为如果直接像 java 里的preparestement来预编译,

order by ?, setString(1,”time”);

最后的sql语句就变成了order by “time”, 对一个字符串排序是没有效果的,所以一些人就又直接把order拼接之类的导致了注入。

而且order by 这种排序在程序中却用得不少, 因为有时候要根据用户的要求来排序, 就像网上商城那种即可以用销量来对商品进行排序,也可以用价格之类的来排序, 这时候就得根据用户传递进来的值来进行相应的排序.

那么一般是如何来防止ORDER BY注入的呢。

如果不利用框架来防止的话,我见过比较常用的两种是

1:从数据库中查询出来要排序的表中的所有列, 或者就是指定的几个列名,如果用户传递的sort变量不在允许的范围内的话,再把sort变量重置一下。

$sort = $_GET['sort'];
if(!in_array($sort,array('time','price'))){
    $sort = 'time';
}

2:还见得比较多的一种就是用户直接传的是数字, 不过以下这种写法,千万别忘啦default,没default的话,又注入咯。

$sort = $_GET['sort'];
switch($sort){
    case 1:
        $sort = 'time';
        break;
    case 2:
        $sort = 'price';
        break;
    default:
        $sort = 'time'; 
        break;
    }

至于框架对于order by的防御, 有一些框架有防御, 部分没有。

我见过的两种框架防御order by注入的

一种是判断用户传递的是不是实体类的属性(hibernate),

为什么感觉在实际的测试中ORDER BY注入的比例变高了

为什么感觉在实际的测试中ORDER BY注入的比例变高了

如果order的参数不是实体类里的属性就直接报错了。

为什么感觉在实际的测试中ORDER BY注入的比例变高了

还有一种就是 用户传递进去的字符串, 给你强行加上 ` ,再对用户传递进来的字符串清掉 , 或者对`转义


以上所述就是小编给大家介绍的《为什么感觉在实际的测试中ORDER BY注入的比例变高了》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Designing with Web Standards (2nd Edition)

Designing with Web Standards (2nd Edition)

Jeffrey Zeldman / Peachpit Press / 2006-07-06 / USD 44.99

Best-selling author, designer, and web standards evangelist Jeffrey Zeldman has updated his classic, industry-shaking guidebook. This new edition--now in full color--covers improvements in best prac......一起来看看 《Designing with Web Standards (2nd Edition)》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

MD5 加密
MD5 加密

MD5 加密工具