PHP和Mysqli中的登录错误脚本

时间:2013-10-31 13:23:04

标签: php login mysqli

好的,我知道这是错误的方式,我没有实施盐和其他小安全提示 但现在我需要了解这里的问题是什么,然后我可以为脚本实现其他安全功能,谢谢你的帮助:) 当运行这个,脚本返回登录错误,我可以理解为什么,我打印密码$ _POST ['密码']并且它在数据库上是相同的但是当尝试打印$ col2(密码从数据库获取)时什么都不返回。 这是代码:

<?php

$mysqli = new mysqli("localhost", "root", "*******", "test");
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
/* prepare statement */
if ($stmt = $mysqli->prepare("SELECT username, password FROM users WHERE username=? AND password=?")) {
    $stmt->bind_param("ss" , $username, $password);
    $stmt->execute();
    /* bind variables to prepared statement */
    $stmt->bind_result($col1, $col2);
    $stmt->store_result();
    /* fetch values */
    while ($stmt->fetch()) {
        printf("%s %s\n", $col1, $col2);
    }

    if($col1 && $col2 == $username && $password){
    $_SESSION['Admin']; //test - not to be implemented
    session_start(); //Test - not to be implemented
    header("location index2.php");
    }else{echo "Login Error";} 
    /* close statement */
    $stmt->close();
}
/* close connection */
$mysqli->close();
?>

4 个答案:

答案 0 :(得分:2)

if($col1 && $col2 == $username && $password){

此语句检查$col1 TRUE $col2 == $username $password TRUE是否$username = $col1 = 'user'; $password = $col2 = 'pass'; var_dump($col1 && $col2 == $username && $password);

这种情况永远不会成立,您的脚本将始终显示该错误消息。

考虑以下示例:

bool(false)

返回if($col1 == $username && $col2 == $password) {

因此,要解决此问题,您可以按如下方式更改代码:

{{1}}

答案 1 :(得分:0)

if($col1 && $col2 == $username && $password)这是什么? :)

在php中,这意味着如果$col1$col2的值不是零,而$username$password的值也不是0,那么就可以了

你需要创建像

这样的东西

if($col1 == $username && $col2 == $password)

如果你在db use中使用md5哈希

if($col1 == $username && $col2 == md5($password))

或者在具有md5功能的mysql中执行此操作。

我注意到您在printf("%s %s\n", $col1, $col2);之后开始会话,这会导致headers already sent

$_SESSION['Admin'];这也会引起注意,因为这个变量是未定义的

另一个问题是header()函数。在此功能之前,您无法打印任何内容,因为它还会导致“已发送标题”。

答案 2 :(得分:0)

一些明显的问题:

  

在session_start();必须在任何$ _SESSION变量之前使用

     

header(“location index2.php”);标题必须在任何其他内容之前发送

     

header(“location index2.php”);位置后没有冒号

答案 3 :(得分:0)

除了其他人在答案中注意到的问题之外,您还混合了 程序 mysqli语句和 面向对象 mysqli语句。

从初始化new mysqli()开始,您必须遵循面向对象的语法。

mysqli_connect_errno()更改为$mysqli->connect_errno