键入错误的用户名时没有任何反应。我的代码中有什么问题?

时间:2017-03-07 01:23:42

标签: php mysql

我试图了解我的代码出了什么问题。它是cp的登录过程。在编写正确的用户名时,您确实得到了正确的结果(只有用户名,仅用于该测试)。但是当你没有做任何事情时,你什么都得不到 - 我没有编程去做任何事情。

非常绝望,试图彻夜解决这个问题。请帮我。 这是代码。

计算:

if(isset($ _ POST [' connection_made'])){//是否已建立连接?使用隐藏的输入

$form_user = forms_filter($_POST['form_user']); // filter any tags or any unwanted actions first
$form_pass = forms_filter($_POST['form_pass']); // filter any tags or any unwanted actions first

if (strlen($form_user) > 5 AND strlen($form_user) < 16 AND strlen($form_pass) > 5 AND strlen($form_pass) < 16) {
        if (login_blank_filter($form_user, $form_pass) == true) { // are those values length shorter than the minimal value or longer? 

            $user_name = $form_user;
            $raw_password = $form_pass;
            $user_pass = password_hash($raw_password, PASSWORD_DEFAULT); // generating a hashed and salted password 

                $cp_validate_login = mysqli_query($data_connection, "SELECT * FROM `admins` WHERE `username` = '$user_name' ");
                if (!$cp_validate_login) { die('error: ' . mysql_error()); }

                while ($admin_row = mysqli_fetch_array($cp_validate_login)) {

                    if (mysqli_num_rows($cp_validate_login) == 1) {
                        echo "you made it.";
                        echo mysqli_num_rows($cp_validate_login);
                    }
                    else {
                        echo "not yet there.";
                        echo mysqli_num_rows($cp_validate_login);
                    }

                }
        }
        else {
            header('Location: index.php?login_status=2');
        }
}

}

形式:

        <?php 
    if (isset($_GET['login_status'])) {
        switch ($_GET['login_status']) {

            case 1:
            echo "wrong username or password";
            break;      

            case 2:
            echo "the inputs has to be filled";
            break;

            case 3:
            echo "username\passwords are too short or too long";
            break;

            default:
            echo "unknown error";
        }
    }
    else {
        echo "welcome. log in to the control panel please";
    }
    ?>
    </div>

    <form name="loginform" method="post" action="index.php" onSubmit="return validateBlank()">
    <input type="hidden" name="connection_made" value="">

    <div class="login_layout">

        <div class="login_right_layout">
        user:
        </div>

        <div class="login_left_layout">
        <input class="login_input" name="form_user" type="text">
        </div>

        <div class="login_right_layout">
        password:
        </div>

        <div class="login_left_layout">
        <input class="login_input" name="form_pass" type="password">
        </div>

    </div>

    <input type="submit" value="כניסה" class="login_submit">
    </form>


</center>

请帮助我。谢谢。

1 个答案:

答案 0 :(得分:0)

首先,您对SQL injection持开放态度。您需要使用预准备语句,而不是将变量连接到查询中。请参阅How can I prevent SQL injection in PHP?

其次,您的代码失败,因为如果用户名无效,您永远不会进入while循环。也就是说,如果您键入伪造的用户名,则永远不会满足此条件:

while ($admin_row = mysqli_fetch_array($cp_validate_login))

因此,您的if / else逻辑永远不会被执行。

这里的解决方案是而不是来尝试改进现有代码。它可以阻止您正在执行的操作并使用现有的身份验证(登录)库。安全性 hard ,正确的身份验证和授权也不例外。你不应该推出自己的安全代码。