我试图了解我的代码出了什么问题。它是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>
请帮助我。谢谢。
答案 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 ,正确的身份验证和授权也不例外。你不应该推出自己的安全代码。