使用mysqli_real_escape_string()将数据写入mysql但没有&

时间:2016-10-19 21:29:52

标签: php mysqli

我使用下面的代码,但字符"&"不会被插入到数据库中,当我从其他页面复制/粘贴一些文本并将其放入数据库时​​文本结束,例如在文本的中间,不知道为什么,我也尝试了addslashes()和htmlspecialchars( )或htmlentities()。

我读过mysqli_real_escape_string()是针对XSS附着的SQL注入攻击和htmlspecialchars(),我是否还应该将它们组合起来?

$beschreibung = mysqli_real_escape_string($db, $_POST['beschreibung']);   

2 个答案:

答案 0 :(得分:0)

SQL注入仅仅是格式不正确的查询。你正在做的还不够,现在停下来。进入使用准备好的陈述的做法..

$Connection = new mysqli("server","user","password","db");
$Query = $Connection->prepare("SELECT Email FROM test_tbl WHERE username=?");
$Query->bind_param('s',$_POST['ObjectContainingUsernameFromPost']);
$Query->execute();
$Query->bind_result($Email);
$Query->fetch();
$Query->close();

上面是使用预准备语句的一个非常基本的例子。它可以快速轻松地格式化您的查询。

我最好猜测发生了什么,我假设你只是使用标准:

$Query = mysqli_query("SELECT * FROM test_tbl WHERE Username=".$_POST['User']);

由于此查询格式不正确,因此您的文本块中可能会包含引号,这些引号会关闭查询字符串。然后,PHP将把所有内容都解释为发送到SQL服务器的命令

答案 1 :(得分:0)

如果您知道自己在做什么,只要在sql中用单引号括起数据,就可以自己逃避indata并将转义数据添加到查询中。一个例子:

$db = mysqli_connect("localhost","my_user","my_password","my_db");
$beschreibung = mysqli_real_escape_string($db, $_POST['beschreibung']);
$results = mysqli_query(
    $db,
    sprintf("INSERT INTO foo (beschreibung) VALUES ('%s')", $beschreibung)
);

为了获得可预测的结果,我建议您在整个应用程序中使用完全相同的字符编码,例如UTF-8。