首页 | 程式人生 | 原创下载 | 技术文档 | 留言我们 | 关于我们

Finish SQL Injection

作者: phanrider        2007-05-24

对于SQL Injection,网络上的攻击方法已是多如牛毛,数也是数得过来的,就那么多吧,之所以这么流行的原因,大多数和急功近利的老板有关,强迫程序员按期完成项目,写出一些烂代码。当然一些不负责任的教科书以及一些唯书是从的程序员也逃脱不了干系。
好吧,转入正题......
怎么终结它,SQL Injection当然需要足够多的长度实行SQL代码,对于客户端的数据绝不能拿来就用,永远只相信你自己,首先要对发送过来的数据,根据实际需要设定长度限制。其次对于关键特殊符号的过滤与转换。

关于数字型
方法一:
首选转换成数字,再代入查询
$id = intval($_POST['id']);
$query="SELECT * FROM mytest WHERE id='$id'";

方法二:
其实还有更好的办法,比较烦锁,首先直接查询到最大ID是多少
$id = intval($_POST['id']);
对于数字型的长度也可判断一下
if ( strlen( $id ) >= 6 ) echo "error";
取出表中的最大id的值
$maxquery = 'SELECT count(*) FROM mytest';
然后得到$maxid
if ( $id > $maxid ) echo "error";
else
{
for ( $count = 1; $count <= $maxid; $count ++ )
{
if ( $id == $count )
{
$count1 = $count
//把我们自己的$count1代入查询语句
$query = "SELECT * FROM mytest WHERE id=$count1";
}
}
}

if ( $count1 == "") echo "error";
下面再执行真正的查询语句
...
最终我们不会把post过来的id代入SQL的。


关于字符串
$search = $_POST['search'];
//转换引号
$search = str_replace( "'", "&#39;", $search );
//加入反斜线
$search = stripslashes($search);
//转换用户输入的反斜线
$search = preg_replace( "/\\\/", "&#092;", $search );
//其它转换等等
$search = ...;
//最后限制输入字符串的长度
if ( strlen( $search ) >= 10 ) echo "error";
更学究的可以写个可正反转换的函数,存入数据库的内容为加密后的内容,对$search必须加密后才能与库中内空比对,进行搜索。


关于登录验证
方法一:
大多数是用md5函数加密post过来的username和password
$username = md5( $_POST["username"] );
$password = md5( $_POST["password"] );
当然我们也可以在登录页面用javascript进行md5加密username和password,再在后台直接判断,这样可以防止在网络上明码传送用户名和密码。

方法二:
$username = $_POST["username"];
对post过来的$username进行必要的字符过滤,当然你可以加入更多需要过滤的
if (eregi("[<%/$\>(),#|;]+", $username])) echo "error";
也可以验证只允许通过的字符串
if (eregi("[^[a-z]]", $username)) echo "error"

其实攻与防是一个事物的两个对立面,这里的终结未必就能真实终结,没听说过死而复生吗?

记住

破坏一座大楼永远比建设它更容易。


→返回←

红蜻蜓工作室版权所有
Copyright © 1999-2025 Reddragonfly & Studio All Rights Reserved.
如有任何问题及建议请留言红蜻蜓工作室