【问题标题】:UTF-8 in username and password [duplicate]用户名和密码中的 UTF-8 [重复]
【发布时间】:2014-03-08 17:31:11
【问题描述】:

社交网站是否应允许在用户名和密码中使用 UTF-8?我对 PHP 真的很陌生,我想知道这样的事情。我现在正在创建一个小测试项目,并将排序规则设置为utf8_general_ciSET 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();
        }
    }
}
?>

注意,这是我当前的代码,尚未完成,并且该网站是瑞典语。

【问题讨论】:

  • 当然应该,但是没有看到你的代码,我们不能说为什么它不适合你
  • 应该吗?当然,它允许您的用户增加密码字符范围,从而提高安全性。
  • 1. 从不使用addslashes 2. 使用准备好的语句时不需要strip_tags 3. 当$_POST['loginBtn'] 设置时,$_POST['username']$_POST['password'] 仍然可以不设置 4. 仅散列使用 SHA512 的密码是不够的;始终使用strong password hashing algorithm
  • 好的,谢谢你的提示!
  • 顺便说一句,你为什么要两次获取相同的信息?首先,您只要求输入用户名和密码,然后立即丢弃该信息,然后再次要求所有信息:这是非常多余的代码。

标签: php html


【解决方案1】:

Unicode UTF-8 有多种编码某些字符(主要是重音字符)的方法。例如,Å 可以是 U+00C5,但也可以描述为字母 A 后跟 U+030A(意思是“在前一个字符上放一个环”)。我注意到 MySQL 倾向于使用后一种编码来存储东西。但是你可能在很 SQL 字符串中有以前的 Unicode UTF-8 编码,然后比较就会不匹配(因为两个不同的 Unicode UTF-8 编码的相同的字符)。在 MySQL 中进行比较时,这是一个非常烦人的问题。因此,您需要做的是规范化您的 Unicode UTF-8,以确保它始终以相同的方式编码字符。在比较字符串之前,请查看Normalizer::normalize 的 PHP 文档中的示例代码,以规范化您的 Unicode UTF-8http://www.php.net/manual/en/normalizer.normalize.php

【讨论】:

  • 您在这里有点搞混了:UTF-8 是一种特殊的编码,可以转换为更抽象的 Unicode 字节。 UTF-8 对每个 Unicode 代码点只有一种编码方式。但是,Unicode 本身可能有多种编码特定“用户感知字符”的方式,例如重音字母,这就是规范化的用武之地。
  • IMSoP:好的,谢谢!那么,如果我将“UTF-8”搜索替换为“Unicode”,我的答案会更正确吗? ;)
  • 是的,并且还将您使用它的“编码”一词更改为表示不同的 Unicode 代码点集,因为它在这种情况下具有特定和不同的含义。我也不确定 MySQL 是否会对分解的变体有任何偏见,而不是存储你给它的任何东西,除非可能是从非 Unicode 表示转换时。
  • 好的,我试试这个,谢谢!
猜你喜欢
  • 2016-07-25
  • 2015-03-10
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
  • 2013-05-07
  • 2016-12-23
  • 2018-09-07
  • 1970-01-01
相关资源
最近更新 更多