好的,我知道这是错误的方式,我没有实施盐和其他小安全提示 但现在我需要了解这里的问题是什么,然后我可以为脚本实现其他安全功能,谢谢你的帮助:) 当运行这个,脚本返回登录错误,我可以理解为什么,我打印密码$ _POST ['密码']并且它在数据库上是相同的但是当尝试打印$ col2(密码从数据库获取)时什么都不返回。 这是代码:
<?php
$mysqli = new mysqli("localhost", "root", "*******", "test");
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* prepare statement */
if ($stmt = $mysqli->prepare("SELECT username, password FROM users WHERE username=? AND password=?")) {
$stmt->bind_param("ss" , $username, $password);
$stmt->execute();
/* bind variables to prepared statement */
$stmt->bind_result($col1, $col2);
$stmt->store_result();
/* fetch values */
while ($stmt->fetch()) {
printf("%s %s\n", $col1, $col2);
}
if($col1 && $col2 == $username && $password){
$_SESSION['Admin']; //test - not to be implemented
session_start(); //Test - not to be implemented
header("location index2.php");
}else{echo "Login Error";}
/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();
?>
答案 0 :(得分:2)
if($col1 && $col2 == $username && $password){
此语句检查$col1
TRUE
和 $col2 == $username
$password
TRUE
是否$username = $col1 = 'user';
$password = $col2 = 'pass';
var_dump($col1 && $col2 == $username && $password);
这种情况永远不会成立,您的脚本将始终显示该错误消息。
考虑以下示例:
bool(false)
返回if($col1 == $username && $col2 == $password) {
。
因此,要解决此问题,您可以按如下方式更改代码:
{{1}}
答案 1 :(得分:0)
if($col1 && $col2 == $username && $password)
这是什么? :)
在php中,这意味着如果$col1
和$col2
的值不是零,而$username
和$password
的值也不是0,那么就可以了
你需要创建像
这样的东西 if($col1 == $username && $col2 == $password)
如果你在db use中使用md5哈希
if($col1 == $username && $col2 == md5($password))
或者在具有md5功能的mysql中执行此操作。
我注意到您在printf("%s %s\n", $col1, $col2);
之后开始会话,这会导致headers already sent
。
$_SESSION['Admin'];
这也会引起注意,因为这个变量是未定义的
另一个问题是header()函数。在此功能之前,您无法打印任何内容,因为它还会导致“已发送标题”。
答案 2 :(得分:0)
一些明显的问题:
在session_start();必须在任何$ _SESSION变量之前使用
header(“location index2.php”);标题必须在任何其他内容之前发送
header(“location index2.php”);位置后没有冒号
答案 3 :(得分:0)
除了其他人在答案中注意到的问题之外,您还混合了 程序 mysqli语句和 面向对象 mysqli语句。
从初始化new mysqli()
开始,您必须遵循面向对象的语法。
将mysqli_connect_errno()
更改为$mysqli->connect_errno
。