MYSQLi real escape函数显示换行和回车符号

3
我有一个文本区域,当我尝试通过MYSQLi的real_escape函数和nl2br进行转义和清理,并简单输出时,结果很奇怪。
我的PHP代码:
 <?php
 $db = new mysqli('localhost', 'user', 'pass', 'demo');

 if($db->connect_errno > 0){
 die('Unable to connect to database [' . $db->connect_error . ']');
 }

 $postText = nl2br($db->escape_string($_POST['posting']));
  ?>

这段文字的翻译是:“奇怪的输出是:”。
 i love this\r\n\r\nand this is gonna be funn.,

奇怪的是,如果我只使用 nl2br 而不用 real_escape,输出结果还是正确的,但很明显我不能信任用户的输入。请帮忙解决。

你打算如何处理 $_POST['posting'] - Ja͢ck
我必须将此插入数据库中。 - coder101
2个回答

2
只有在输出将用于SQL查询时才应用SQL转义。
  • 如果需要将值输出到页面上,则使用htmlspecialchars()htmlentities()
  • 如果将在JavaScript文字中使用它,请使用json_encode()
  • 等等。
简而言之,每个上下文都有自己的转义方式;不要混淆它们。
此外,在将其写入数据库时不要使用nl2br();而是在从数据库中获取后应用它。

根据你所说的,我推断在同一个脚本中,我应该转义输入,插入到数据库中,然后当我在脚本末尾必须要回显它时,我应该使用 htmlspecialchars()nl2br() 的组合。我必须遵循这些步骤,因为所有操作都是通过 Ajax 请求完成的。 - coder101
@coder101 是的,听起来没错;不过不要将转义应用到同一个变量上;创建一个变量来保存数据库转义值,另一个变量来保存 HTML 转义值。换句话说,保留原始值。 - Ja͢ck

0

是的,它可以。

这个函数的输出不是为了打印出来,而是仅用于格式化SQL字符串字面值。

请注意,这个函数也不是用来“清理”任何输入的。请点击此处查看详情

所以,你不应该同时使用这两个函数。

  • 使用escape_string来格式化你要动态插入查询的SQL字符串。
  • 只有在将文本打印到HTML页面时才使用nl2br。

根据你在评论中的问题,应该没有情况下,你需要立即打印出你的字符串。

因为在每次POST请求后,你的PHP应该通过Location:头告诉浏览器重新加载页面。在重新加载后,你可以从数据库中读取数据并打印出来。


我必须转义字符串,将其插入数据库并在响应中回显该字符串,所有这些都在一个脚本中完成。您是在建议,即使我应该在DB中插入转义后的字符串,但应该仅使用nl2br显示或者应该使用last insert_id从db中选择并显示输出。 - coder101
那并不是这种情况,因为我是通过Ajax请求来完成所有操作的,所以根本不需要重新加载。 - coder101

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接