Php 用户名和密码中的UTF-8
社交网站是否应该允许用户名和密码使用UTF-8?我对PHP真的很陌生,我想知道这些事情。我现在正在创建一个小测试项目,我已经将排序规则设置为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(
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表示转换时!