将用户限制在他们的个人资料页

时间:2012-01-26 23:16:38

标签: php mysql

在我的网站上,我有一个用户登录系统,当他们登录时,他们被带到他们的个人资料页面,这是他们的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();
?>

有解决方法吗?

2 个答案:

答案 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字符串来识别用户是一个巨大的安全漏洞。