在我的网站上,我有一个用户登录系统,当他们登录时,他们被带到他们的个人资料页面,这是他们的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();
?>
Run Code Online (Sandbox Code Playgroud)
有工作吗?
你在这里的代码块充满了难度.
首先,绝对不要将用户的密码存储在cookie中.您应该只在cookie中存储会话ID,然后将其余的会话数据存储在数据库的会话表中,该会话表包含用户的ID以及您可能希望基本访问的任何其他内容...密码不应该也可以在这张桌子上.
现在,您可以安全地使用URL中的user_id,因为交叉引用会阻止人们离开.
在加载时,您当然会交叉引用基于您的cookie ID拉取的会话表中的mysql结果.如果它们不匹配,显然会引导它们.
至于您的表单重定向,您需要重新构建您处理发布的方式.您可以使您的个人资料页面始终只提取与您的Cookie中的会话ID相关的个人资料.这将删除对URL的依赖并完全解决此问题.
另外 - 请查看mysql_real_escape_string()以清理您的输入.盲目接受mysql查询的cookie信息是非常危险的.除非你的确打算在你的网站上留下巨大的注入孔.