to lanyd(山雨欲来风满楼): addslashes()或者php配置中的那个所做的是同样的, 就比如:你的get 变量是 1' and 1=2 union select password from user where 2!='1 那么如果不过滤得话, 你的sql语句可能是 select 。。where sortid='1' and 1=2 union select password from user where 2!='1',那么就会被注入了。 而通过上面2种方法过滤得话,你得到的sql语句是 select 。。where sortid='1\' and 1=2 union select password from user where 2!=\'1'明白它们的用处了吧?
to heiyeshuwu(黑夜路人) : 有没有对每种过滤掉的字符可能产生的危险做一下说明阿?每种都给个例子嘛!~:)
取ID后强制转换也可以(int)$_GET['id'];
sort.php?sortid=1 and 1=2 union select password from user具体情况要具体分析 对于你的这种情况,最简单的方法就是 $_GET$GET['sortid'] = intval($GET['sortid']);这个攻击的原理是: 首先使你原有的查询失败 .... where sortid=1 and 1=2 由于1=2永远不会成立,所以你原有的查询就没有结果了 然后他附加了自己的查询 select password from user 来取得你user表中的内容 注意那个“union” 这才是个关键,你只要从这里切断传入的串。此类攻击就都不能奏效了
其实防注入没有那么复杂,php不像asp 一般如果是整形的数据,建议获取的时候都intval一下,字符串的一般都转义一下就全部OK。 具体如下:1. 打开 register_global = on 2. 打开 magic_quotes_gpc = On 3. 打开 safe_mode = On 4. 过滤变量,不管是get方式还是post方式的数据一律过滤,记得有个强人说过:不要相信任何用户提交的数据。 整型数据获取的时候一般都intval一下,如:$int_var = intval($int_var) 字符串get方式的,一般可以过滤的方式,比如象我使用正则匹配的方式,不过不是特别好,一般转义一下就可以了。 5. 初始化你的变量建议参考以下文章: http://blog.csdn.net/heiyeshuwu/archive/2005/06/14/394225.aspx (我写的,不强) http://blog.csdn.net/heiyeshuwu/archive/2005/07/14/424814.aspx (英文的,但是很强)
其实一般 magic_quotes_gpc = On 了,字符串的代码也起不了作用,对了,还有一个忘记说了,最好在你的sql里面都加上单引号,比如: 整型变量:$sql = "SELECT * FROM tbl_name WHERE tid = '$id' "; 字符串变量:$sql = "SELECT * FROM tbl_name WHERE title = '$title' ";那样的话,注入的时候就会出错了,呵呵另外,还建议你参考下,安全天使的文章,里面很多关于如何注入的,知道攻了,就知道怎么防了: http://www.4ngel.net/article/36.htm http://www.4ngel.net/article/30.htmhttp://www.4ngel.net
your code...
if (is_string($v)) {
$array[$k] = stripslashes($v);
} else if (is_array($v)) {
$array[$k] = $this->stripslashes_array($v);
}
}
return $array; }
$_GET =str_replace("'","",stripslashes_array($_GET));
$_POST =str_replace("'","",stripslashes_array($_POST));
$_COOKIE =str_replace("'","",stripslashes_array($_COOKIE));
你把它放在程序开始.格式化所有GET POST COOKIE 哈.好用不好用,你自己看了!!
怎么还有人答非所问, ice_berg16(寻梦的稻草人) 正解
‘君子兰’和‘杜牧’说的接近正确,‘Evilfile(0x208WM)’说出了另外一半。php.ini 中设置 magic_quotes_gpc = On 自动进行过滤,然后写sql语句的时候养成在值得外面加单引号的习惯。这样就避免了sql注入,而且也不用在程序中判断了。
当然,如果你需要设置magic_quotes_gpc = Off,那么在程序中给变量做 addslashes 处理就行了,即
addslashes($_GET['sortid'])。好啦,相信我说清楚了,呵呵
人家可以通过注入单引号来攻击你!我不清楚addslashes()的原理,谁能解释一下?
是不是自动给用户传入的字符都加上/ ?
有什么意义呢?
有时候会让优势变成劣势的。适当的严谨一点会让我们减少很多麻烦。呵呵
当然如果有其他语言的那种把常用的数据扔到内存中常驻就更好了:)考虑问题应该从正常的渠道找到合理的方法,而不是像“宠物中心”那种自作聪明呵呵,说过了,希望对新人有点点帮助。
addslashes()或者php配置中的那个所做的是同样的,
就比如:你的get 变量是 1' and 1=2 union select password from user where 2!='1
那么如果不过滤得话, 你的sql语句可能是 select 。。where sortid='1' and 1=2 union select password from user where 2!='1',那么就会被注入了。
而通过上面2种方法过滤得话,你得到的sql语句是
select 。。where sortid='1\' and 1=2 union select password from user where 2!=\'1'明白它们的用处了吧?
有没有对每种过滤掉的字符可能产生的危险做一下说明阿?每种都给个例子嘛!~:)
对于你的这种情况,最简单的方法就是
$_GET$GET['sortid'] = intval($GET['sortid']);这个攻击的原理是:
首先使你原有的查询失败
.... where sortid=1 and 1=2
由于1=2永远不会成立,所以你原有的查询就没有结果了
然后他附加了自己的查询
select password from user
来取得你user表中的内容
注意那个“union”
这才是个关键,你只要从这里切断传入的串。此类攻击就都不能奏效了
一般如果是整形的数据,建议获取的时候都intval一下,字符串的一般都转义一下就全部OK。
具体如下:1. 打开 register_global = on
2. 打开 magic_quotes_gpc = On
3. 打开 safe_mode = On
4. 过滤变量,不管是get方式还是post方式的数据一律过滤,记得有个强人说过:不要相信任何用户提交的数据。
整型数据获取的时候一般都intval一下,如:$int_var = intval($int_var)
字符串get方式的,一般可以过滤的方式,比如象我使用正则匹配的方式,不过不是特别好,一般转义一下就可以了。
5. 初始化你的变量建议参考以下文章:
http://blog.csdn.net/heiyeshuwu/archive/2005/06/14/394225.aspx (我写的,不强)
http://blog.csdn.net/heiyeshuwu/archive/2005/07/14/424814.aspx (英文的,但是很强)
整型变量:$sql = "SELECT * FROM tbl_name WHERE tid = '$id' ";
字符串变量:$sql = "SELECT * FROM tbl_name WHERE title = '$title' ";那样的话,注入的时候就会出错了,呵呵另外,还建议你参考下,安全天使的文章,里面很多关于如何注入的,知道攻了,就知道怎么防了:
http://www.4ngel.net/article/36.htm
http://www.4ngel.net/article/30.htmhttp://www.4ngel.net
1. 打开 register_global = on应该是:register_global = off呵呵,写on顺手了,全部写了 -_-#