0

我有一个网站,我将用户名和哈希密码存储在一个表中。我正在尝试将此信息(用户名和哈希密码)与从我的登录站点传递的登录信息进行比较。不幸的是,这一直在崩溃。如果有人能指出我做错了什么的正确方向,我将不胜感激。下面是我用来检查登录的代码。这可能很简单,因为我对 php 还是很陌生。

<?php

$myServer = "server.domain.com";
$myUser = "readaccess"; 
$myPass = "password"; 
$myDB = "database";

        $dbhandle = mssql_connect($myServer, $myUser, $myPass)
            or die("Couldn't connect to SQL Server on $myServer");          

        $selected = mssql_select_db($myDB, $dbhandle)
            or die("Couldn't open database $myDB");

// username and password sent from form 
    $myusername=$_POST['myusername']; 
    $mypassword=$_POST['mypassword'];

//declare the SQL statement that will query the database
    $query = "SELECT password, salt ";
        $query. = "FROM dbo.members ";
        $query. = "WHERE username = '$myusername' ";

        $result = mssql_query($query)
            or die('A error occured: ' . mssql_get_last_message());

// SQL_num_row is counting table row
    $count=mssql_num_rows($result);         
    if($count) < 1) //no such user exists
    {
           header('Location: main_login.php');
    }

    $userData = mssql_fetch_array($result, MSSQL_ASSOC);
    $hash = hash('sha256', $userData['salt'] . hash('sha256', $mypassword) );

    if($hash != $userData['password']) //incorrect password
        {
           header('Location: main_login.php');
    }
    else {
    header('Location: index.php');
    }
  ?>
4

1 回答 1

0

我认为问题是这条线

$result = mssql_query($query)
        or die('A error occured: ' . mssql_get_last_message());

检查失败的正确方法是

$result = mssql_query($query, $dbhandle);
if(!$result)
    die('A error occured: ' . mssql_get_last_message());

请注意,这也适用于 mssql_connect 和 mssql_select_db 语句。请注意,您需要将数据库资源提供给 mssql_query 函数。

.=此外,如果您使用它们之间没有空格,大多数人会发现它更具可读性。我认为它不会产生解析错误,但是将空格排除在操作数之外是很有意义的。$counter+ +;(即使合法,你也不会这样做。)

请注意询问未来的问题,请始终包含您看到的任何错误消息,如果它引用行号,请在代码示例中指出该行。在这种情况下,我认为您的问题与散列或 sql 无关,因为它完全是解析/语法错误。

于 2012-05-04T19:20:58.437 回答