【发布时间】:2015-09-16 20:15:00
【问题描述】:
这是我的代码: --registered.php -- 此文件将新用户的用户名和密码发送到数据库
<?php include "config.php"; ?>
<?php
$username = $_POST['username'];
$email = $_POST['email'];
$mypassword = $_POST['password'];
$defaultrank = "user";
$password=password_hash($mypassword, PASSWORD_BCRYPT);
?>
<?php if(isset($_REQUEST['submit'])) { ?>
<?php
$sql = "INSERT INTO usr (username, password, email, rank)
VALUES ('$username', '$password', '$email', '$defaultrank')";
if ($conn->query($sql) === TRUE) { ?>
<meta http-equiv="refresh" content="0; url=register.php#registrationsuccess" />
<?php }
else{ ?>
<meta http-equiv="refresh" content="0; url=register.php#registrationfailed" />
<?php } ?>
<?php $conn->close(); ?>
<?php } ?>
-- redir.php -- 这会将登录信息发送到数据库进行验证
<link rel="stylesheet" href="css/font-awesome.min.css">
<?php
session_start();
ob_start();
$host="localhost";
$user="root";
$pass="root";
$db="usr";
$tbl="usr";
mysql_connect("$host", "$user", "$pass")or die("cannot connect");
mysql_select_db("$db")or die("cannot select DB");
include 'registered.php';
$myusername=$_POST['myusername'];
$user = $myusername;
$mypassword=$_POST['mypassword'];
$pass = $mypassword;
// $password=md5($mypassword);
$hashAndSalt = password_hash($password, PASSWORD_BCRYPT);
$savemyusername = $myusername;
$savemypassword = $mypassword;
$myusername = stripslashes($myusername);
$mypassword = stripslashes($mypassword);
$myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);
$sql="SELECT * FROM $tbl WHERE username='$myusername' and password='password_verify($password, $hashAndSalt)'";
$result=mysql_query($sql);
$count=mysql_num_rows($result);
if($count==1){
// Sessions //
$_SESSION["pass"] = $pass;
$_SESSION["user"] = $user;
// END //
echo <<<EOF
<meta http-equiv="refresh" content="0; url=membersarea.php" />
EOF;
}
else { ?>
<meta http-equiv="refresh" content="0; url=login.php#loginfailed" />
<?php
}
ob_end_flush();
?>
登录系统可以在 md5 下正常工作 此外,registered.php 中的数据也被发送到数据库,它只是验证问题所在的数据
【问题讨论】:
-
这些是一些可爱的sql injection attack 漏洞。您是否打算让您的登录系统完全无用且容易被绕过?
-
密码散列和 20 世纪 MySQL API 的讽刺组合。
-
顺便说一句
password='password_verify($password, $hashAndSalt)'让你失望了 - 将预期的函数用作字符串文字。 -
仅供参考:MD5 生成的字符串长度为 32 个字符。密码哈希 60。
-
Marc 这将被修复