首页 > 解决方案 > 回显消息用反斜杠替换空格

问题描述

为什么我收到错误消息 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!";
        }
    }
?>

标签: phphtmlsql

解决方案


它不是用反斜杠替换空格。反斜杠实际上取消或否定了特殊字符 - 在这种情况下,您的单引号 ( ')。当您调用mysqli_real_escape_string时,它会插入这些反斜杠以否定 中的任何单引号$username,这使得查询将它们读取为引号文字,而不是关闭字符串。

这样想:如果它没有反斜杠,您的查询将读取为

WHERE name = '' OR '1'='1'

这是 SQL 注入,因此通过调用转义函数,它实质上将查询转换为

WHERE name = " ' OR '1' = '1 "

这样,单引号就不会关闭原始引号,而是简单地读取为'字符。

如果要输出原始名称,可以将其存储为变量,然后在需要时调用它,或者使用$_POST['firstname'].


推荐阅读