在我的网站上,我有一个用户登录系统,当他们登录时,他们被带到他们的个人资料页面,这是他们的uid吃的自然神论。问题是,没有什么可以阻止用户只是更改uid并转到别人的个人资料并采取行动。为了阻止这种情况,我实现了一个URL / MySQL系统,如果用户的uid不是URL中的uid,它们将被重定向到自己的配置文件。这里的问题是,在配置文件中有一些表单可以更改URL,这样做会删除uid查询,从而导致页面(因为缺少uid)将您带到您的配置文件并忽略表单输入。
代码是:
<?php
mysql_connect ('x', 'x', 'x');
mysql_select_db ('x');
if(isset($_COOKIE['wd_un'])) {
$un = $_COOKIE['wd_un'];
$pass = $_COOKIE['wd_pass'];
$cook = "SELECT * FROM x WHERE username = '$un' AND password = '$pass' limit 1";
$cookr = mysql_query($cook) or die (mysql_error());
if(mysql_num_rows($cookr) == 0) {
header ("Location: index.php");
}
else {
$urluid = mysql_real_escape_string($_GET['uid']);
$uidcheck = "SELECT * FROM x WHERE username = '$un' AND password = '$pass'";
$uidcheckq = mysql_query($uidcheck) or die (mysql_error());
while($rcu = mysql_fetch_assoc($uidcheckq)) {
$dbuid = $rcu['uid'];
if($urluid != $dbuid) {
header ("location: home.php?uid=$dbuid");
}
else {
}
}
}
}
mysql_close();
?>
有解决方法吗?
答案 0 :(得分:5)
你在这里遇到的代码块很不好。
首先,绝对不要将用户的密码存储在cookie中。 您应该只在cookie中存储会话ID,然后将其余的会话数据存储在数据库的会话表中,该会话表包含用户的ID以及您可能希望基本访问的任何其他内容...密码不应该也可以在这张表中。
现在,您可以安全地使用URL中的user_id,因为交叉引用会让人们离开。
在加载时,您当然会交叉引用基于您的cookie ID拉取的会话表中的mysql结果。如果它们不匹配,显然会启动它们。
至于您的表单重定向,您需要重新构建您处理发布的方式。您可以使您的个人资料页面始终只提取与您的Cookie中的会话ID相关的个人资料。这将删除对URL的依赖并完全解决这个问题。
另外 - 请查看mysql_real_escape_string()以清理您的输入。盲目接受mysql查询的cookie信息是非常危险的。除非你确实打算在你的网站上留下巨大的注入孔。
答案 1 :(得分:1)
您应该使用Cookie ID来识别用户,而不是从URL中提取用户。如果cookieID与UserID不匹配,则重定向到他们自己的配置文件。
基本上,永远不要使用url为私有数据传递用户ID。始终引用cookie。
在您描述的可用性问题之上,仅依赖URL字符串来识别用户是一个巨大的安全漏洞。