想象一下博客或cms系统(PHP和MySQL)。我想让用户在textarea中输入一些文本并将其保存到数据库中。数据库中字段的类型是TEXT。
我想保留换行符并稍后打印。我知道我可以使用PHP的nl2br
- 函数执行此操作,但是如何保护此字符串免受SQL注入攻击(让我们假设我不能使用预准备语句)。如果我在其上使用mysql_real_escape_string
,则不再显示换行符。
$text = 'one line
another line';
$text = mysql_real_escape_string($text);
/* save to db, fetch it some time later */
echo nl2br($text); /* output: one line\r\nanotherline */
答案 0 :(得分:9)
mysql_real_escape_string
没有删除换行符,转义它们。
在存储字符串时应该可以正常转义字符串,并在数据输出时应用nl2br
(可能与htmlspecialchars()
结合使用以防止用户输入原始HTML) STRONG>。这是最好的方式。
答案 1 :(得分:1)
mysqli_real_escape_string
将使用\r\n
替换回车,因此您需要使用str_replace()
取回回车。但是,它仍然无法在您的浏览器/电子邮件客户端中显示。这就是nl2br()
发挥作用的地方:
$text = 'one line
another line';
echo nl2br(str_replace("\\r\\n","
", mysqli_real_escape_string($dbc, $text )));
代码经过测试,您可以使用它。
答案 2 :(得分:-2)
如果我在它上面使用mysql_real_escape_string,它就不再显示换行符了。
你不是看到"\n"
文字代替换行符吗?
如果是这样,你的代码做了一些讨厌的事情,很可能你两次逃避你的数据
或者,从数据库获取数据后,你不做mysql_real_escape_string()吗?
无论如何,你必须做一些调试 - 调查,看看每个阶段的数据会发生什么。只需打印$ _POST ['textarea_name'],SQL查询等。
看看你失去休息时间并找出罪犯的那一刻
注意:
mysql_real_escape_string不保护任何攻击。它逃脱了分界线
nl2br不保留任何东西。它为换行符添加了一个HTML标记。