——此文章摘自《完全手册PHP网络开发详解》定价
¥
特价
¥
详细>>http://track
linktech
cn/?m_id=dangdang&a_id=A
&l=
&l_type
=
width=
height=
border=
nosave>
SELECT * FROM posts WHERE postid = and (select length(adminname) from admin
limit )>
就这样通过对数据库字段长度的逻辑判断获得了存储管理员账号和密码的表名和列名下一步就可以通过对管理员账号和密码的每个字符的ASCII码的判断来获得管理员账号了例如当前管理员的账号为admin在浏览器上访问http:///bugs/egphp?id= and (select ascii(substr(adminname)) from admin limit )=可以使网页正常显示这是因为当前管理员账号为admin通过使用ascii函数和substr函数来获取第一个字母的ASCII码为 当SQL中的逻辑成立时页面就可以正常地显示了
漏洞防护措施
前面所述的攻击方法虽然很烦琐但是只要有充足的时间完全可以通过前面所示的PHP代码来获取管理员的账号和密码并对网站数据进行修改解决这一问题的方法很简单就是对通过地址栏传入的参数的值进行判断或者格式化处理如以下代码所示
<?php
$id = (int)$_GET[id]; //通过对id参数进行数据类型转换过滤掉非法SQL字符
$sql = SELECT * FROM posts WHERE postid = $id;//定义SQL
echo SQL: $sql<br>; //输出SQL
mysql_connect(localhost root); //连接服务器
mysql_select_db(guestbook); //连接数据库
$rs = mysql_query($sql); //执行SQL
if(mysql_numrows($rs)) //判断是否存在记录
{
$row_rs = mysql_fetch_assoc($rs);
echo TOPIC: $row_rs[topic]<br>;
}
else//如果记录不存在则输出错误信息
{
echo Record not found!;
}
?>
上面的代码首先将传入的参数的值转换为整型数据然后再放入SQL语句中执行这一简单的举措可以将地址栏中的非数字字符全部过滤掉大大增强了系统的安全性
right>[http://developcsaicn/web/htm>] []