Php 用户名和密码中的UTF-8

Php 用户名和密码中的UTF-8,php,html,Php,Html,社交网站是否应该允许用户名和密码使用UTF-8?我对PHP真的很陌生,我想知道这些事情。我现在正在创建一个小测试项目,我已经将排序规则设置为utf8\u general\u ci和set NAMES utf8。所有内容都被正确插入和显示,并带有“ÄÄÖ”等字符。但是如果用户名或密码包含这些字符,您将无法登录。为什么? <?php if(isset($_POST['loginBtn'])){ //variables $username = mb_strtolower(strip_tags(

社交网站是否应该允许用户名和密码使用UTF-8?我对PHP真的很陌生,我想知道这些事情。我现在正在创建一个小测试项目,我已经将排序规则设置为
utf8\u general\u ci
set NAMES utf8
。所有内容都被正确插入和显示,并带有“ÄÄÖ”等字符。但是如果用户名或密码包含这些字符,您将无法登录。为什么?

<?php
if(isset($_POST['loginBtn'])){
//variables 
$username = mb_strtolower(strip_tags(addslashes($_POST['username'])));
$password = strip_tags(addslashes($_POST['password']));
    if(empty($username) || empty($password)){
    $statusM = "Var god och fyll i båda fälten!";   
    }else{
        //$password = hash("sha512", $password);
        include("db.php");
            //the db.php contains the character set and collation set

        $sql = 'SELECT username, password FROM users WHERE username=:username AND password=:password';  
        $stmt = $db->prepare($sql);
        $stmt->bindParam(":username", $username);
        $stmt->bindParam(":password", $password);
        $stmt->execute();
        if(!$stmt->rowCount() > 0){
        $statusM = "Antingen fel lösenord eller användarnamn!"; 
        }else{

        $sql = 'SELECT * FROM users WHERE username=:username AND password=:password';
        $stmt = $db->prepare($sql);     
        $stmt->bindParam(":username", $username);
        $stmt->bindParam(":password", $password);
        $stmt->execute();
        $stmt->setFetchMode(PDO::FETCH_ASSOC);
        $row = $stmt->fetch();

        session_start();
        $_SESSION['school'] = $row['school'];
        $_SESSION['firstname'] = $row['firstname'];
        $_SESSION['lastname'] = $row['lastname'];
        $_SESSION['username'] = $row['username'];
        $_SESSION['password'] = $row['password'];
        $_SESSION['email'] = $row['email'];
        header("Location: member_home.php");
        exit();
        }
    }
}
?>


注意,这是我当前的代码,尚未完成,该站点是瑞典语的。Unicode UTF-8有多种方式编码某些字符(主要是重音字符)。例如,Å可以是U+00C5,但也可以描述为字母A后跟U+030A(意思是“在前一个字符的顶部放置一个环”)。我注意到MySQL倾向于使用后一种编码来存储内容。但是您可能在SQL字符串中使用了前面的Unicode UTF-8编码,然后比较将不匹配(因为同一个字符有两种不同的Unicode UTF-8编码)。在MySQL中进行比较时,这是一个非常恼人的问题。所以,您需要做的是规范化Unicode UTF-8,以确保它始终以相同的方式编码字符。在比较字符串之前,请查看PHP文档中用于规范化Unicode UTF-8的
Normalizer::normalize
示例代码:

当然应该,但是如果没有看到您的代码,我们就无法说明它为什么不适合您,是吗?当然,它允许用户增加密码字符范围,从而提高安全性。1。切勿使用
addslashes
2。当使用准备好的语句3时,您不需要
strip\u标签<当
$\u POST['username']
设置为4时,仍然无法设置code>$\u POST['password']
$\u POST['password']
。仅用SHA512散列密码是不够的;始终使用“好的”,谢谢你的提示!顺便问一下,你为什么要两次获取相同的信息?首先,你们只需要一个用户名和密码,你们立即扔掉那个些信息,然后你们又需要所有的信息:这是相当冗余的代码。你们在这里有点糊涂了:UTF-8是一种特殊的编码,用更抽象的Unicode编码成字节。UTF-8对每个Unicode码点只有一种编码方式。然而,Unicode本身可能有多种编码特定“用户感知字符”的方法,比如重音字母,这就是标准化的原因。IMSoP:好的,谢谢!所以,如果我搜索并将“UTF-8”替换为“Unicode”?;),我的答案会更正确是的,而且还要更改“encoding”一词,在这里您使用它来表示不同的Unicode代码点集,因为它在这个上下文中有特定的和不同的含义。我也不确定MySQL是否会偏向于分解变量,而不是存储您提供的任何内容,除非可能是在从非Unicode表示转换时!