2

好的,我知道这是错误的方法,我还没有实现 salt 和其他小的安全提示,但现在我需要了解这里的问题是什么,然后我可以为脚本实现其他安全功能,感谢您的帮助 :) 运行时这个,脚本返回登录错误,我可以理解为什么,我打印密码 $_POST['password'] 并且它在数据库上是相同的,但是当尝试打印 $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

4 回答 4

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

该语句检查if $col1isTRUE $col2 == $username is $passwordTRUE

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

考虑以下示例:

$username = $col1 = 'user';
$password = $col2 = 'pass';
var_dump($col1 && $col2 == $username && $password);

这返回bool(false)

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

if($col1 == $username && $col2 == $password) {
于 2013-10-31T13:27:29.167 回答
0

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

在 php 中,这意味着如果$col1and$col2具有除零以外的任何值,并且$usernameand$password也具有除 0 以外的值,那么就可以了

你需要创建类似的东西

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

如果您在数据库中保留 md5 哈希值,请使用

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

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

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

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

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

于 2013-10-31T13:26:26.797 回答
0

一些明显的问题:

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

header("位置 index2.php"); 标头必须在任何其他内容之前发送

header("位置 index2.php"); 定位后没有冒号

于 2013-10-31T13:28:41.420 回答
0

除了其他人在回答中指出的问题之外,您还混合了 过程mysqli 语句和面向对象的mysqli 语句。

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

更改mysqli_connect_errno()$mysqli->connect_errno

于 2013-10-31T13:31:15.253 回答