Php 如何修复此登录功能

Php 如何修复此登录功能,php,session,cookies,login,passwords,Php,Session,Cookies,Login,Passwords,我的PHP代码中有以下两个函数: function admin_checker($username,$password) { $username=remove_extra_in_string($username); $password=remove_extra_in_string($password); $q='select * from `admin` where `username`="'.$username.'" and `password`="'.$passwor

我的PHP代码中有以下两个函数:

function admin_checker($username,$password)
{
    $username=remove_extra_in_string($username);
    $password=remove_extra_in_string($password);
    $q='select * from `admin` where `username`="'.$username.'" and `password`="'.$password.'"';
    $result=@mysqli_query($conn, $q);
    $_COOKIE['username'] = $result["username"];
    $_COOKIE['password'] = $result["password"];
    if(@mysqli_num_rows($result)==1)
        return 1;
    else
        return 0;
}

function remove_extra_in_string($string)
{
    $extra=array('\'','"','`','/','*',';',' ','--');
    $string=str_replace($extra,'',$string);
    return $string;
}
然后通过以下方式进行检查:

if(admin_checker($_COOKIE['username'],$_COOKIE['password'])==1)
{ echo "ok"; } else { echo "not ok"; }

但不知怎的,它没有通过,我不知道我在这里做错了什么?

首先也是最重要的一点:永远不要将密码存储为纯文本,永远不要将用户数据保存在COOKIE中。 下一件事-不要使用自己的函数remove\u extra\u in_string(),使用内置的mysqli\u real\u escape\u string或更好-使用准备好的语句:

这种情况是,如果您以纯文本形式存储密码,您可能会有更多具有相同密码和用户名的记录,并且它将返回值!=1所以这将是错误的


它也可能失败,因为您在调用admin_checker()时没有设置COOKIES,所以$username和$password等于null。

1:您可以接受SQL注入2:不要在COOKIES中存储密码3:您正在抑制mysqli_*函数的错误-您希望显示这些错误。4:你应该使用
password\u-verify
password\u-hash
来验证这种类型的密码不要存储纯文本密码!请使用PHP来处理密码安全性。如果您使用的PHP版本低于5.5,则可以使用
密码\u hash()
。在散列之前,不需要对它们执行任何操作或使用任何其他清理机制。这样做会更改密码并导致不必要的额外编码。停止抑制错误,看在上帝的份上,不要将此代码部署到生产环境中。该代码具有过时教程和非常糟糕的博客文章中的所有建议标记。(请看穿[至少部分])谢谢你的信息!我将尝试使用mysqli_real_escape_字符串而不是我的remove_extra_in_字符串,密码由第$password=md5行($password)保护;和Cookie由行session_start()设置;现在可以了吗?只需使用预先准备好的语句,而不是像那样进行任何形式的转义。不要使用
md5()
。使用
password\u hash()
password\u verify()
@Qirel Ok。。。太好了,谢谢@好吧,不是真的,对不起。使用密码\u hash()和密码\u verify()。我个人使用BCRYPT对密码进行哈希运算。此外,当用户插入其凭证时,通过POST请求获取凭证,并将其作为参数插入到admin_checker中:admin_checker($_POST['username'],$_POST['password']),然后使用准备好的语句进行查询。@Guydege我前面评论的最后一部分:要正确设置cookie,您需要通过正确指定所有标记来设置它们+我建议通过为它们创建特定的哈希来对它们进行签名(您每次都会比较),以确保它们是由您设置的,并且仅适用于您的网站。