首页 > 解决方案 > 在 PHP 中使用符号 char 查询用户名

问题描述

当前存储在数据库中的用户名包括任何字符和符号。用户可以输入他们想要的任何用户名(是的,这是我的错,因为之前没有为用户名设置规则)。

当我想根据带有任何字符和符号的用户名显示所有配置文件详细信息时,这会成为一个问题。

例如:

用户名:Friends & Co Ent.

我从 href 获取用户名,如下所示:

<td><a href="profile_detail.php?user=<?php echo $rec['username'];?>" class="btn btn-primary">View</a></td>

并根据这样的查询显示配置文件:

$user =$_GET['user'];

$user_detail = "SELECT * FROM user_detail WHERE username = '$user'";
$result = mysqli_query($con,$user_detail);
$rec = mysqli_fetch_array($result);

//display user name

<div class="form-group">
 <label for="exampleFormControlInput1">Name</label>
  <input type="text" class="form-control" id="user_name" name="user_name" value="<?=$rec['user_name']?>" readonly>
</div>

该表单不显示有关用户的任何详细信息。我已经创建了“on the go”解决方案,即查询WHERE username LIKE '$user%'

对于最佳解决方案还有其他建议吗?

标签: phpsql

解决方案


包含“奇怪”字符的用户名不是问题。用户名可以包含任何可能的字符。

但是,您的代码存在 3 个严重问题。

  1. SQL注入。

    为了防止 SQL 注入,您必须确保始终参数化您的 SQL 值。如果您使用的是 mysqli(我建议改用 PDO),那么您的代码将如下所示:

     $stmt = $con->prepare('SELECT * FROM user_detail WHERE username = ?');
     $stmt->bind_param('s', $user);
     $stmt->execute();
     $rec = $stmt->get_result()->fetch_array();
    
  2. XSS(跨站点脚本)

    您必须记住,HTML 上下文中的任何输出都应该通过htmlentities()

     <div class="form-group">
     <label for="exampleFormControlInput1">Name</label>
     <input type="text" class="form-control" id="user_name" name="user_name" value="<?= htmlentities($rec['username']) ?>" readonly>
     </div>
    
  3. URL 查询字符串必须正确转义。

    要创建 URL 查询字符串,请使用http_build_query()

     <?php
     $url_query_string = http_build_query(['user'=>$rec['username']]);
     ?>
     <td><a href="profile_detail.php?<?= htmlentities($url_query_string) ?>" class="btn btn-primary">View</a></td>
    

推荐阅读