我是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注入。
答案 0 :(得分:0)
如果是OO,则使用$link->real_escape_string($_POST['email'])
。在您的示例中,您使用mysqli_reql_escape_string
程序方式。
我明白了:
<script>alert("Here is an alert");</script>
而不是我正确看到的所有堰和alt东西。
对于第二部分,我认为你错了 real_escape_string
和html_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实体,即。 <
已转换为<