1

我正在尝试制作一个安全、自定义的用户登录系统,但它目前不起作用。这个想法是创建一个具有安全、加密密码的用户。但是,当使用正确的密码时,它不会登录到该站点。

使用密码时的输出123456789jp

$6$j7Rd68RhKNx.6ccH$9lvRDdks.jx4hk7.YQ0hpvzPE22h/BZQ/9yXiwTMBV1Kx2xr2gbIZZJxYjeLrA41nL2WGjmt.FMQi877uOXrP1

相关功能:

// function register_user()
function bruger_opret_siden(){
            if ($stmt = $this->mysqli->prepare('SELECT NULL FROM `bruger` WHERE `brugernavn` = ?'))
            {
                $stmt->bind_param('s', $brugernavn);
                $brugernavn = $_POST["brugernavn"];
                $stmt->execute();
                $stmt->store_result();
                $count = $stmt->num_rows;
                $stmt->close();
                if($count > 0)
                {
                    $user_found = 1;
                }
            }
            if(!isset($user_found))
            {
                //Check if the user exists.

                if(!isset($errors))
                {
                    $pb = null;

                    include 'function/class.upload.php';
                    $handle = new Upload($_FILES["file"]);

                    if($handle->uploaded)
                    {
                        //trims to next request         
                    }

                 $password = $_POST["pass"];
                 $algorithm = '$6$'; //<--- This means the SHA 512
                 $salt = $this->generateSalt(16); //<--- SHA 512 uses a 16-character salt

                 $hash = crypt($password, $algorithm . $salt);

                if ($stmt = $this->mysqli->prepare('INSERT INTO `bruger` 
                (`rank`, `email`, `brugernavn`, `password`, `profilbillede`, `profilbillede_godkendt`, `navn`, `efternavn`, `alder_d`, `alder_m`, `alder_aar`, `status`, `kon`, `seksualitet`, `land_by`, `hojde`) 
                VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'))
                {

                    $stmt->bind_param('issssisssssiiisi', $rank, $email, $brugernavn, $password, $profilbillede, $pb_godkendt, $navn, $efternavn, $alder_d, $alder_m, $alder_aar, $kon, $seksualitet, $partnerstatus, $land_by, $hojde);
                    $rank = '1';
                    $pb_godkendt = '1';
                    $email = $_POST["email"];
                    $brugernavn = $_POST["brugernavn"];//C
                    $password = $hash;//C
                    $profilbillede = $pb;//C
                    $navn = $_POST["navn"];
                    $efternavn = $_POST["efternavn"];
                    $alder_d = $_POST["alder_d"];
                    $alder_m = $_POST["alder_m"];
                    $alder_aar = $_POST["alder_aar"];
                    $kon = $_POST["kon"];
                    $seksualitet = $_POST["seksualitet"];
                    $partnerstatus = $_POST["partnerstatus"];
                    $land_by = $_POST["land_by"];
                    $hojde = $_POST["hojde"];

                    $stmt->execute();
                    $stmt->close();

                    echo "ok";

                    }
                    else
                    {
                        // There was an error 
                        echo 'error: ' . $mysqli->error;
                    }
                }
            }
            else
            {
                echo "<li id=\"check_not\">Dette brugernavn er optaget!!</li>";
            }
    }

从密码和盐中生成哈希以注册用户的代码:

function generateSalt($length) {
         $alphabet = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
         $alphabet_length = strlen($alphabet);
         $salt = '';
         for ($i = 0; $i < $length; $i++) {
             $salt .= $alphabet[rand(0, $alphabet_length - 1)];
         }
         return $salt;
     }

显示用户信息的两个功能。

$pass = $mebe->generateSalt();
                $users = $mebe->bruger_opret_siden();

以下函数包含问题;它不会让用户登录。虽然没有产生错误,但它不起作用。

function godkendt_login()
    {
        if ($stmt = $this->mysqli->prepare("SELECT `id`, `brugernavn`, `rank`, `profilbillede`, `profilbillede_godkendt` FROM `bruger` WHERE `brugernavn` = ? AND `password` = ?"))
        {
            $stmt->bind_param('ss', $brugernavn, $password);
            $brugernavn = $_POST["brugernavn"];
            $password = sha1($_POST["pass"]);
            $stmt->execute();
            $stmt->store_result();
            $stmt->bind_result($id, $brugernavn, $rank, $profilbillede, $profilbillede_godkendt);
            $stmt->fetch();
            $count = $stmt->num_rows;
            $stmt->close();

            if($count > 0)
            {
                $_SESSION["logged_in"] = true;
                $_SESSION["id"] = $id;
                $_SESSION["profilbillede"] = $profilbillede;
                $_SESSION["brugernavn"] = $brugernavn;
                $_SESSION["rank"] = $rank;
                $_SESSION["profilbillede_godkendt"] = $profilbillede_godkendt;

                if($_SESSION["logged_in"] == true)
                {
                    echo "ok";
                }
                else
                {
                    // Sorry, please try again.
                                    echo "Desværre prøve igen."
                }
            }
            else
            {
                          echo "Skrive et password eller brugernavn"
            }
        }
    }

日志文件/inc文件:

<?php
    /*
     * // Grant the administrative privilige to show the content.
     * Giver admin adgang til se indhold på siden.
     */
    if(isset($_SESSION["rank"]) && $_SESSION["rank"] > 0) {
        $bruger = $mebe->brugerindhold_side();
    }


    /*
     * // Grant normal access to the page.
     * Hvis ingen af dem så få de bare adgang sådan her..
     */
    else{
    ?>
<form name="login" method="post" action="#">
    <h1>Log ind</h1>
    <p>Brugernavn</p><input type="text" name="brugernavn"/>
    <p>Password</p><input type="password" name="pass"/>
    <br />
    <input type="submit" name="Log_ind" value="Log ind" id="login">
    <?php
    if(isset($_POST["Log_ind"]))
    {
    $login = $mebe->godkendt_login();
    }
    ?>
</form>
<?php
    }
?>
4

1 回答 1

2

好的,由于语言差异,我无法完全掌握您的代码。盐应该是可重复的值。从我收集的内容来看,您的似乎是@随机生成的。

如果是这样,则哈希不会相加,因此检查失败。为哈希使用一个常量值,不要将它存储在数据库中

例如:

<?php

     function generateHash($in)
     {
         $salt = "Th1s1sAS4lt";
         return md5(sha1($in) . $salt);
     }
?>

此外,任何帖子值都应检查,因为它是由用户输入的,可能包含非法字符或有害代码。请注意以下事项:

<?php
    // Note that the input contains SQL.
    // bemærke, at de input indeholder SQL.                 
    $_POST['passwd'] = "'p@ssword' OR 'a' = 'a'";

    if (tilmeld_dig())
    {
        // Log the user in.
        // brugeren er logget på
    }


    function tilmeld_dig()
    {
        $sql = "SELECT brugernavn from tbl_brugere WHERE adgangskode = " . $_POST['passwd'];

            // Execute the database command. 
        $res// = Database kommando udføre
        if ($res)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
?>

在上面的示例中,无论密码如何,用户都已登录,因为注入的 SQL 命令将始终为真。

虽然这是一个粗略的例子,但请查看: http ://translate.google.com/translate?hl=nl&sl=en&tl=da&prev=_dd&u=http%3A%2F%2Fwww.unixwiz.net%2Ftechtips%2Fsql-injection .html

我试图用一些丹麦语评论来支持你,因为这在安全系统中很重要。你在正确的轨道上,但我建议你看看我的建议。

此外,这是未经测试的代码,但或多或​​少是如何工作的。

于 2012-11-19T23:08:13.187 回答