【问题标题】:undefined POST and is my bcrypt system good? [closed]未定义的 POST 和我的 bcrypt 系统好吗? [关闭]
【发布时间】:2013-01-08 06:13:31
【问题描述】:

所以我一直在寻找互联网来加密我的密码,我从 youtube 上得到了这个代码,我不确定这是否是我需要的,因为这是我第一次做这样的事情。 而且我收到一个错误,说用户、密码和邮件是未定义的,但在我使用的函数和上面的 if 语句中你的工作正常。这段代码正在进行中,我还没有在 if 语句中添加 salting 和 crypt 函数。 下面是代码:

<?php require_once("session.php");?>
<?php require_once("connect.php");?>
<?php
if(isset($_POST["createUser"]) && isset($_POST["user"], $_POST["pass"], $_POST["mail"])){
    createUser ($_POST["user"], $_POST["pass"], $_POST["mail"]);
} 
else if(isset($_POST["userGames"])){
    userGamesUpdate ($_POST("selectedGameId"));
}
else if(isset($_POST["userLogin"])){
    login ($_POST["user"], $_POST["pass"]);
}
else if (!isset ($_POST)){
    echo "error";
}

?>
<?php 

$lenght = 21;
function random_string($lenght){

    $charset = array_merge˙(range("a", "z"), range("A", "Z"), range("0", "9"));
    shuffle($charset);
    global $randozoz;
    $randozoz = array_slice($charset, 0, $lenght);
    return implode("", $randozoz);

}
$username = $_POST["user"];
$password = $_POST["pass"];
$email = $_POST["mail"];

function prevent($wha) {

    $wha = stripslashes($wha);
    $wha = mysql_real_escape_string($wha);
    return $wha;
}

prevent($username);
prevent($password);
prevent($email);

$str = substr($username, 0, 6);
$salt = "$2a$12$".$randozoz."".$str."$";

//register
function createUser ($username, $password, $email ){
    //Get from form


    $hashedPassword = crypt($password); 
    //Submit to database
    //make query
    $query = ("INSERT INTO users ( username , email , hashPass ) VALUES ( '$username' , '$email' , '$hashedPassword')");
    //use query
    if (mysql_query($query)) {
        //userMade.php
        $query = ("SELECT id FROM users WHERE username = '{$username}'");
        $userId = mysql_fetch_array($query);
        $_SESSION["userId"] = $userId;
        $_SESSION["username"] = $username; 
        header("Location: ../userMade.php");
        exit;
    } else {
        echo "<p>".mysql_error()."</p>";
    }
}

function login ($username, $password){

    $hashedPassword = sha1($password); 
    //Submit to database
    //make query
    $query = ("SELECT id, username FROM users WHERE username = '{$username}' AND hashPass = '{$hashedPassword}'");
    $result_set = mysql_query($query);

    if (mysql_num_rows($result_set) == 1) {
        //frontpage, session
        //$userFound = mysql_fetch_array($result_set);
        $foundUser = mysql_fetch_array($result_set); 
        $_SESSION["userId"] = $foundUser["id"];
        $_SESSION["username"] = $foundUser["username"];
        header("Location: ../frontpage.php");
        exit;
    } else {
        $message = "Your username and/or password is wrong! Please try again.";
    }
}
?>

登录系统未与 crypt 和 salting 系统集成。但是我做盐腌对吗?

这里有一些来自这个系统的随机密码:

$1$gc5.pn/.$txhBJZBDG3xgraJYIYY0I1
$1$8e0.vX3.$RfFLRT/iE.MXfws2fnz30.

并且错误部分显示了我试图防止 SQL 注入的地方,该系统也可以工作吗?老实说,我真的不明白。

【问题讨论】:

  • 根据您获得的哈希值,这是使用MD5,而不是bcrypt。此外,您在一个地方使用sha1,在另一个地方使用crypt。这些不是一回事。
  • 再看一遍,这里有很多问题,我什至不确定从哪里开始..
  • 为什么不直接使用密码库?
  • 第二个问题的答案是!你不能只是组成自己的字符串,你需要使用 bcrypt 才能使用 bcrypt。
  • @Eric Petroelje sh1 用于登录系统,正如我在文本中所说的那样没有完成。

标签: php post sql-injection salt crypt


【解决方案1】:

你的代码充满了不好的东西,很难找到开始的地方。它甚至无法正常工作。

但是要回答你关于 bcrypt 的问题:不,你做错了。为了让每个人都更容易使用密码散列,从 PHP 5.5 开始将提供一个 PHP 散列 API。

因为 PHP 5.5 仍处于开发阶段,所以有一个兼容性库可将这些功能向后移植到最新的 PHP 版本 5.4 并向下移植到 5.3.7。早期的 PHP 在其 bcrypt 实现中存在安全问题。

下载这个库:https://github.com/ircmaxell/password_compat

【讨论】:

  • 我使用了你给我的库,它返回的密码是这样的:$2y$10$16GV.bFJjsNdCzkuA.pNm.CyeqreAzxAeKVnJKncFnRiuvIGhp4.S
  • @user1642320 - 这是密码哈希,看起来没问题,$2y 代表 BCrypt,$10 是成本因子,接下来的 22 个字符是随机盐。您可以将此值存储在数据库中。
猜你喜欢
  • 2011-08-30
  • 1970-01-01
  • 2011-04-02
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 2010-11-17
  • 2010-09-21
相关资源
最近更新 更多