$sql='UPDATE pw_user SET `onlineip`=$onlineip WHERE `uid`=$winduid';
再看$onlineip是怎么来的:
if($_SERVER['HTTP_CLIENT_IP'])
$onlineip=$_SERVER['HTTP_CLIENT_IP'];
else if($_SERVER['HTTP_X_FORWARDED_FOR'])
$onlineip=$_SERVER['HTTP_X_FORWARDED_FOR'];
else
$onlineip=$_SERVER['REMOTE_ADDR'];
$onlineip =substrs($onlineip,16);
十六个字节,够提升权限的了吧?抓包提交HTTP_X_FORWARDED_FOR。
这类文章用于说明PHP的漏洞、PHP安全性不如ASP或JSP,那就说明你就是个人云亦云的外行!
这只能说明在处理SQL语句时一定要检查SQL语句中变量的真实情况罢了。
再次请编程人员记住:客户端返回的数据都是不可信的,一定要再三校验,尤其是处理SQL(尤其是update或set等更新数据库的语句)!
但是,连这样普通的一个判断用户真实IP的代码,都有可能被伪造,说明了其实潜在的危险还是蛮大的。
所以在SQL执行插入前,一定要用合适的方法先进行校验,而且SQL中变量两端加上引号!本例中如果变量加上引号,应该问题也会好一点。不过加上引号,恶意用户也能在$onlineip中加入引号以提前结束SQL的。这里显示应该用正则来检验/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/。
