关于通用用户名 不用想办法屏蔽,,只要把PHP的版本换成最新的就成了。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 找到解决办法了一个值得注意的安全问题 关键词:PHP 本文要特别感谢网友SUKER,^_^ -------------------------------------------------------------------------------- 本文只举一个MySQL登陆验证的例子,通过这个例子,我希望大家能够特别注意一点:在作系统 的时候,请不要忽略程序中的安全渥洞. MySQL表结构: create table login(user varchar(20) not null primary key,pass varchar(50)); insert into login values('test',password('test')); 具有安全渥洞的程序如下(login.php): <? if($login){ $con = mysql_connect("localhost","test","") or die("无法连接服务器"); $sql = "select * from login where user='$user' and pass=password('$pass')"; $rst = mysql_db_query("test",$sql,$con) or die("$sql出错"); if(mysql_num_rows($rst)==1) echo "验证成功"; else echo "验证失败"; mysql_free_result($rst); mysql_close($con); } else{ echo "<html>".chr(13); echo "<body>".chr(13); echo "<form action=\"$PHP_SELF\" method=\"POST\">".chr(13); echo "用户名:<input type=\"text\" name=\"user\"><br>".chr(13); echo "密 码:<input type=\"password\" name=\"pass\"><br>".chr(13); echo "<input type=\"submit\" name=\"login\" value=\"验证\">".chr(13); echo "</form>".chr(13); echo "</body>".chr(13); echo "</html>".chr(13); } ?> 程序看起来完全没有错误,但是当您作了下面的测试的时候,您就会知道了: 用户名:any' or '1'='1' or ('2'='2 密 码:any')) or ('3'='3 当您的PHP配置文件中的magic_quotes_gpc为Off的时候,输出是"验证成功",也就是说不需要 知道用户名和密码就可以通过验证了,这不是很可怕吗?其实您分析一下这时产生的$sql就知 道了: select * from login where user='any' or '1'='1' or ('2'='2' and pass=password('any')) or ('3'='3') 有两种解决方法(推荐第2种): 1. 直接将PHP配置文件中的magic_quotes_gpc设成On 2. 写一个函数gpc2sql,所有从GET/POST/Cookie中来的并且用在SQL中的变量都用这个函数 先作处理: <? function gpc2sql($str){ if(get_magic_quotes_gpc()==1) return $str; else return addslashes($str); } ?> 当然这就说到了另外一个问题,任何一个查询字符串,如果要查询的串里面有" or ' or \这三个符号则先要用addslashes来处理,这里也是运用这个原理来填补漏洞的。 不是登陆验证的问题,而是登陆的这种验证思路使用户名和密码必然成为sql语言的一部分。我想asp也会有这样的问题吧? 真希望有达人来说说sql攻击啊。 ASP有这种情况,用两个OR就可登录,在PHP中你可以做两次判断$r = myslq_fetch_row($result)if(!($name ==$r[0])){ if(($pass == $r[1])){ echo"用户名不正确";}if(!($pass == $r[1])){ .................以下大同小异了.................}这样在验证时只有在数据库中相应的值才可以测试通过吧。 不允许空格和引号,那么你是怎么做的呢? 谢谢yaoxuefeng(锋雨者) 。 我主要是想看看大家讨论一下原来那个asp板有个sql攻击的帖子怎么找不见了啊。 关于PHP中require_once和获取目标文件目录的问题 php表单提交,更新一字段多字符 郁闷啊~上传帝国CMS首页和栏目可以打开,但是管理员登录页面就是打不开/e/文件夹里面的全都打不开 用php如何取得来源于google的中文关键字 如何让apache解析<?...>符号内的内容 怎样获得JS链接的网页地址? 谁帮改个正则? PHP 4.3.2正式发布 欢迎加入 自由网络 http://www.freweb.net/ 新手请教云服务器搭建 如何通过文本框的onchange事件刷新其他文本框的值 删除UBB代码
一个值得注意的安全问题 关键词:PHP 本文要特别感谢网友SUKER,^_^
-------------------------------------------------------------------------------- 本文只举一个MySQL登陆验证的例子,通过这个例子,我希望大家能够特别注意一点:在作系统
的时候,请不要忽略程序中的安全渥洞. MySQL表结构:
create table login(user varchar(20) not null primary key,pass varchar(50));
insert into login values('test',password('test')); 具有安全渥洞的程序如下(login.php):
<?
if($login){
$con = mysql_connect("localhost","test","") or die("无法连接服务器"); $sql = "select * from login where user='$user' and pass=password('$pass')";
$rst = mysql_db_query("test",$sql,$con) or die("$sql出错");
if(mysql_num_rows($rst)==1) echo "验证成功";
else echo "验证失败";
mysql_free_result($rst); mysql_close($con);
}
else{
echo "<html>".chr(13);
echo "<body>".chr(13);
echo "<form action=\"$PHP_SELF\" method=\"POST\">".chr(13);
echo "用户名:<input type=\"text\" name=\"user\"><br>".chr(13);
echo "密 码:<input type=\"password\" name=\"pass\"><br>".chr(13);
echo "<input type=\"submit\" name=\"login\" value=\"验证\">".chr(13);
echo "</form>".chr(13);
echo "</body>".chr(13);
echo "</html>".chr(13);
}
?> 程序看起来完全没有错误,但是当您作了下面的测试的时候,您就会知道了:
用户名:any' or '1'='1' or ('2'='2
密 码:any')) or ('3'='3
当您的PHP配置文件中的magic_quotes_gpc为Off的时候,输出是"验证成功",也就是说不需要
知道用户名和密码就可以通过验证了,这不是很可怕吗?其实您分析一下这时产生的$sql就知
道了:
select * from login where user='any' or '1'='1' or ('2'='2' and pass=password('any')) or ('3'='3') 有两种解决方法(推荐第2种):
1. 直接将PHP配置文件中的magic_quotes_gpc设成On
2. 写一个函数gpc2sql,所有从GET/POST/Cookie中来的并且用在SQL中的变量都用这个函数
先作处理:
<?
function gpc2sql($str){
if(get_magic_quotes_gpc()==1) return $str;
else return addslashes($str);
}
?>
我想asp也会有这样的问题吧?
$r = myslq_fetch_row($result)
if(!($name ==$r[0]))
{
if(($pass == $r[1]))
{
echo"用户名不正确";
}
if(!($pass == $r[1]))
{
.................以下大同小异了
.................
}
这样在验证时只有在数据库中相应的值才可以测试通过吧。
谢谢yaoxuefeng(锋雨者) 。
原来那个asp板有个sql攻击的帖子怎么找不见了啊。