php - 回显消息用反斜杠替换空格
问题描述
为什么我收到错误消息 No users with name \' or \'1\'=\'1! 当我在输入中输入 ' 或 '1'='1 时?我知道我的程序阻止了 SQL 注入尝试,但为什么它用反斜杠替换空格?add_pregmatch.php
<?php
include_once 'includes/db_connect.php';
$firstname = '';
$errors = array('firstname'=>'', 'email'=>'');
if(isset($_POST['submit'])){
// check name
if(empty($_POST['firstname'])){
$errors['firstname'] = 'Enter a name! <br />';
} else {
$firstname = $_POST['firstname'];
if(!preg_match('/^[a-zA-Z]+$/', $firstname)){
$errors['firstname'] = 'Name can only be letters! <br />';
}
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title>SCIENCE FAIR</title>
<link rel="stylesheet" href="style.css">
<section class ="container grey-text">
<form class="white" action="addpreg_match.php" method="POST">
<tr>
<label>First Name:</label>
<td><input type="text" name="firstname" placeholder="First Name"></td></br>
<?php echo $errors['firstname']; ?>
</tr>
<div class="center">
<td colspan="2"><input type="submit" name="submit" value="Submit"></td>
</div>
</form>
</section>
</html>
<?php
if(isset($_POST['submit'])) {
$firstname = mysqli_real_escape_string($conn, $_POST['firstname']);
$sql = "SELECT * FROM users WHERE name = '$firstname'";
$result = mysqli_query($conn, $sql);
$queryResult = mysqli_num_rows($result);
if ($queryResult > 0) {
while ($row = mysqli_fetch_assoc($result)) {
echo "<div>
<p>".$row['name']."<p>
<p>".$row['email']."<p>
</div>";
}
} else {
echo "No users with name $firstname!";
}
}
?>
解决方案
它不是用反斜杠替换空格。反斜杠实际上取消或否定了特殊字符 - 在这种情况下,您的单引号 ( '
)。当您调用mysqli_real_escape_string
时,它会插入这些反斜杠以否定 中的任何单引号$username
,这使得查询将它们读取为引号文字,而不是关闭字符串。
这样想:如果它没有反斜杠,您的查询将读取为
WHERE name = '' OR '1'='1'
这是 SQL 注入,因此通过调用转义函数,它实质上将查询转换为
WHERE name = " ' OR '1' = '1 "
这样,单引号就不会关闭原始引号,而是简单地读取为'
字符。
如果要输出原始名称,可以将其存储为变量,然后在需要时调用它,或者使用$_POST['firstname']
.
推荐阅读
- javascript - 打字稿枚举作为静态对象属性
- flutter - 没有为“QuerySnapshot”类型定义吸气剂“文档”
- wso2 - 如何对 wso2 IS 或 apim 实施 XXE 或 XSS 攻击的预防
- c# - .Net 中的多个 Parallel.ForEach 循环
- docker - 如何在 tensorflow docker 镜像上安装特定版本
- sql-server - 如果数据是从表中更新的,则数据应插入到 SQL Server 2017 中的另一个表中
- android - Android写入csv文件,Uri.fromFile返回NullPointerException
- django - 删除 Django admin 多对多字段中的添加按钮
- css - 如何使下拉内容100%?
- python - NameError:名称“字符”未定义