2012-04-03 151 views
-5

我现在在我的智慧结束。这里是我想知道的,我如何检查用户在我的登录页面(仅由用户名和登录名)提供的信息与我在数据库中的信息?我已经可以做到这一点,但现在我的问题是我已经确定的两件事情。 1)如果所提供的信息与存储在我的数据库中的信息相比较时是真的,那么我想引导用户到不同的页面(我假设我的HTML中的ACTION方法会照顾到这一点)。但如果输入是错误的,那么我需要迭代登录页面,以便他们可以重新输入他们的详细信息。上述php登录验证

if ($p===$p1) 
{ 
    header("Location:success.php"); 
} 
else 
{ 
    header("Location:fail.php"); 
} 

是我的代码以$ p是密码字段的形式和$ P1是从数据库中值的值。此代码现在发生的情况是,即使密码甚至用户名不匹配,用户仍然可以访问成员页面。我已经能够确定问题在于“标题”方法。但即使我交换了两个用户仍然导向到success.php。如果你不明白我的问题的症结所在,我恳请你不要忽视它只是问我,我会提供更多的信息。抱歉,但我不能似乎能够得到

+0

什么是输出,当你''echo' $ p'和'$ p1'?他们真的是文字吗?他们是平等的吗?另外:我在你的问题中读到,'$ p1'是数据库开始的密码,与用户输入的密码相比 - 这是不好的!未加密存储的密码(在直接与用户输入进行比较时必须存在)是一个安全问题。为什么不重构它,以便根据用户标识和密码从数据库获取用户记录。如果您获得记录,则登录成功。 – 2012-04-03 13:56:23

+0

如何处理一些示例代码? – 2012-04-03 13:56:28

+0

是的,我做得到的记录,我第一次使用SQL从数据库中获取数据之前,我在我正在比较变量结束这样比较,我的问题是与“头”和三联“=” – Riddle 2012-04-03 14:31:24

回答

2

你打算在这里不会阻止用户访问“成员”的网页是什么 - 但是它应该确定用户在提交密码后发送到哪个页面。如果后者不是这种情况,那么代码中的其他地方会出现问题。

但正如我所说,如果你想防止未经授权的用户访问某些网页,那么最简单的解决办法是设置一个标志,在会议的认证,例如

session_start(); 

if ($_POST['password']===stored_password($_POST['username'])) { 
    $_SESSION['authenticated']=$_POST['username']; 
    header("Location:success.php"); 
    exit; 
} else { 
    header("Location:fail.php"); 
    exit; 
} 

然后在每一个顶部和每一个认证页面:

session_start(); 
if (!$_SESSION['authenticated']) { 
    header("Location:fail.php"); 
    exit; 
} 

(注意头(后明确退出 '位置:...');)

一旦你有这样的舔,那么你可以开始考虑重新认证会话ID以防止会话固定/劫持问题,并将用户密码存储为散列以防止泄露问题。

+0

谢谢,这个也可以,但是我遇到了一个错误,在我的浏览器上显示**致命错误:打电话给undefined函数stored_pa​​ssword()在C:\网站\ MySite \ logincheck.php **当我将您的第二个代码添加到我的身份验证页面,但没有最后一点的代码我确实进入下一页 – Riddle 2012-04-03 14:37:39

+0

函数“stored_pa​​ssword() “不是默认的php函数。我假设symcbean意味着你应该创建一个函数,通过引用用户名来返回用户密码。 – alphanyx 2012-04-03 15:04:16

+0

好吧,如果我排除“stored_pa​​ssword()”函数,那么它一切正常,但现在我的问题是,当我添加你的第二个代码块到页面的顶部,如果登录成功,然后用户被发送到fail.php。所以我要出去肢体,并假设'如果'条件有问题,因为一切都没有它的工作......有没有办法解决这个问题?请帮忙 – Riddle 2012-04-04 07:20:42

3

你用这个,如果以检查的元素是相同的

if ($p===$p1) { 

你说的$ p是您的帖子变量和$ P1是数据从数据库...

我不是很确定,因为我没有看到你的脚本很多,但我会期望,如果问题总是如此,因为你使用三个=字符“===”与三个等号你检查变量类型。

两个变量是从类型“阵列”(据我期望的那样)所以你的问题总是像这样

if (array === array) { 

,这是总是如此。

你应该指定你的问题。

if ($p['password'] == $p['password']) { 

或任何你想检查。

摘要:据我可以在你的短代码见我希望,这个问题是特里普尔等号

编辑:

你应该改变你的登录。 最好的方法是通过sql检查用户信息是否正确。

示例: $ sql =“选择ID从用户WHERE名称='”。 $ p ['name']。 “'和密码= MD5($ p ['password'])”

然后执行sql。您也可以使用计数(*)来检查登录信息是否正确。如果它不正确,那么不应该从数据库返回。

+1

的== =运算符也会比较变量的值,而不仅仅是类型。即1 === 2将返回错误 – 2012-04-03 13:55:35

+0

谢谢你的工作 – Riddle 2012-04-03 14:02:57

+0

是啊,刚刚发生我..只要它的工作,但Mr_Chimp是正确的。 ===运算符比较值和 – alphanyx 2012-04-03 14:04:29

0

试试这个:

var_dump($p); 
var_dump($p1); 

它不会解决你的问题,但它会告诉你什么是存储在变量,它们是什么类型的变量。

你期待什么样的价值观?