帮忙解决php程序漏洞

wchun 2005-07-14 07:13:39
近来服务器被攻击,使用的应该是SQL注入攻击。
/sort.php?sortid=1 and 1=2 union select password from user
这样一来,密码就被搞出来了,后悔的地方就在于本人的密码没有加密。

向兄弟们求教,怎么样才能避免这个类型的攻击?
似乎可以先判断sortid是否为整形数字,不知道怎么搞定,请帮忙!
...全文
160 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2005-07-15
  • 打赏
  • 举报
回复
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”
这才是个关键,你只要从这里切断传入的串。此类攻击就都不能奏效了
草山湖 2005-07-15
  • 打赏
  • 举报
回复
取ID后强制转换也可以

(int)$_GET['id'];
「已注销」 2005-07-15
  • 打赏
  • 举报
回复
to heiyeshuwu(黑夜路人) :
有没有对每种过滤掉的字符可能产生的危险做一下说明阿?每种都给个例子嘛!~:)
「已注销」 2005-07-15
  • 打赏
  • 举报
回复
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'

明白它们的用处了吧?
「已注销」 2005-07-15
  • 打赏
  • 举报
回复
另外,不知道有人看过那个“宠物中心”的论坛插件没有,不知道那个是谁写的哈,批一下先:物品属性值居然通过页面post(数据库里有的东西为什么要这样做呢。。。再省数据库资源消耗也不能这样省阿。。。)

呵呵,建议大家养成好习惯,嘿嘿。

关于数据库性能有很多好方法的,内存表是不错的选择,
当然如果有其他语言的那种把常用的数据扔到内存中常驻就更好了:)

考虑问题应该从正常的渠道找到合理的方法,而不是像“宠物中心”那种自作聪明。。。呵呵,说过了,希望对新人有点点帮助。
  • 打赏
  • 举报
回复
可以采用:单引号,再加上替换用户传入的单引号(或double它)!
「已注销」 2005-07-15
  • 打赏
  • 举报
回复
另外,register_globals = Off 也能增加安全性,建议使用,嘿嘿,

太灵活了不好,
有时候会让优势变成劣势的。

适当的严谨一点会让我们减少很多麻烦。呵呵
  • 打赏
  • 举报
回复
单单加单引号是不行的!
人家可以通过注入单引号来攻击你!

我不清楚addslashes()的原理,谁能解释一下?
是不是自动给用户传入的字符都加上/ ?
有什么意义呢?
「已注销」 2005-07-15
  • 打赏
  • 举报
回复
to all:
‘君子兰’和‘杜牧’说的接近正确,‘Evilfile(0x208WM)’说出了另外一半。

php.ini 中设置 magic_quotes_gpc = On 自动进行过滤,然后写sql语句的时候养成在值得外面加单引号的习惯。这样就避免了sql注入,而且也不用在程序中判断了。
当然,如果你需要设置magic_quotes_gpc = Off,那么在程序中给变量做 addslashes 处理就行了,即
addslashes($_GET['sortid'])。

好啦,相信我说清楚了,呵呵
wen8u8 2005-07-15
  • 打赏
  • 举报
回复
搜索一下"php防注"有个安全天使的,比较详细的说。
  • 打赏
  • 举报
回复
http://blog.csdn.net/heiyeshuwu/archive/2005/06/14/394225.aspx
Meteorlet 2005-07-15
  • 打赏
  • 举报
回复
真奇怪,sortid=1 and 1=2 union select password from user这里面有单引号吗?
怎么还有人答非所问, ice_berg16(寻梦的稻草人) 正解
wchun 2005-07-15
  • 打赏
  • 举报
回复
真诚感谢上面所有的兄弟!
谢谢你们! 真是受益非浅!

结贴 给分~
大白菜芯 2005-07-15
  • 打赏
  • 举报
回复
给你个函数.提前过滤就可以了

function stripslashes_array($array) {

while (list($k,$v) = each($array)) {
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 哈.好用不好用,你自己看了!!
  • 打赏
  • 举报
回复
对不起,上面说错了,应该是把全局变量关闭掉:
1. 打开 register_global = on

应该是:register_global = off

呵呵,写on顺手了,全部写了。。。 -_-#
  • 打赏
  • 举报
回复
其实一般 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.htm

http://www.4ngel.net
  • 打赏
  • 举报
回复
其实防注入没有那么复杂,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 (英文的,但是很强)
ice_berg16 2005-07-14
  • 打赏
  • 举报
回复
id(is_int($_GET['sortid']) && $_GET['sortid']>0)
your code...
Evilfile 2005-07-14
  • 打赏
  • 举报
回复
SQL里把sortid加单引号
zairwolf 2005-07-14
  • 打赏
  • 举报
回复
ID是否为数字.怎么弄

is_int
加载更多回复(5)

21,891

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧