mysqli面向对象的真正的转义字符串

时间:2016-08-27 13:43:17

标签: php mysqli

我是Mysqli和PHP的新手,想要学习使用面向对象的代码而不是程序代码。然而,我正在努力将mysqli_real_escape_string转换为面向对象的方式。在下面的代码中,我使用了程序代码,因为我不知道如何使用面向对象的方式,Google搜索没有提供我正在寻找的答案。

$sql = "SELECT email FROM `users` WHERE email = '".mysqli_real_escape_string($link, $_POST['email'])."'LIMIT 1";

        $result = $link->query($sql);

    if($result->num_rows > 0) {

        echo "The email " .$_POST['email']. " is already taken";

    } else {

        echo $_POST['email'];
    }


}

在现实世界中,我会对输入字段进行某种验证,但出于学习目的,我没有验证。话虽这么说,如果有人要去注册页面,他们可以使用SQL注入。我试图在检查电子邮件地址是否存在的代码中防止这种情况。根据我的阅读,mysqli_real_escape_string用于防止SQL注入,并使用类似htmlspecialchars的东西来防止XSS。我试图在这个特定的例子中阻止SQL注入。

2 个答案:

答案 0 :(得分:0)

如果是OO,则使用$link->real_escape_string($_POST['email'])。在您的示例中,您使用mysqli_reql_escape_string程序方式。

  

我明白了:

     

<script>alert("Here is an alert");</script>

     

而不是我正确看到的所有堰和alt东西

对于第二部分,我认为你错了 real_escape_stringhtml_special_chars
mysqli_real_escape_string 不会将实体转换为,对不起html_special_chars

SQL不需要将特殊字符转换为实体。您不能期望 mysqli_real_escape_string返回编码实体。

简而言之,需要为mysql查询编码的实体。只有可以“伤害”查询的mysql特殊字符

答案 1 :(得分:0)

mysqli_real_escape_string只是意味着在数据库查询中安全地使用来自用户空间的字符串(称为SQL注入攻击)。在您的情况下,电子邮件(即js代码)正确插入数据库。你甚至可以使用&#39;而不是&#34;现在没有得到Mysql错误。

但您要做的是在HTML网站中显示来自用户空间的数据,这需要进行另一种不同的修改以防止跨站点脚本:https://secure.php.net/manual/de/function.htmlentities.php

<强> TL; DR:

mysqli_real_escape_string(或其等效的OOP)转义导致数据库查询出现问题的字符'成为\'

htmlentities将字符更改为相应的html实体,即。 <已转换为&lt;