php - 在 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%'
对于最佳解决方案还有其他建议吗?
解决方案
包含“奇怪”字符的用户名不是问题。用户名可以包含任何可能的字符。
但是,您的代码存在 3 个严重问题。
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();
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>
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>
推荐阅读
- python-3.x - 如何在 QTabwidget 中保存文件?
- reactjs - 构建项目以部署 Spring 和 React 后无法使用直接 url 访问页面
- if-statement - 带有 IF Google 表格的 ArrayFormula
- python - 如何在OpenCV中用另一个RGB值替换某个RGB值的所有像素
- python - 在 Windows 上为 Idle Python 安装库
- batch-file - 有没有办法使用 Anaconda 提示符运行批处理文件
- angular - 将对象从 Angular8 发送到 Spring Boot
- python - 如何为多个文本文件创建词频矩阵?
- android - recyclerview jetpack 错误 - 按两次后退按钮以转到上一个片段
- angular - 当应用程序处于前台时,Angular 8 firebase 推送通知不起作用