0

这很简单,我的网站上有一个文本区域帖子,如果我输入:

line 1
line 2
line 3

进入它,它输出:

line 1nline 2nline 3

我的插入代码是:

    $status = strip_tags(stripslashes(htmlentities(mysql_real_escape_string($_POST['status']))));
    $uid = strip_tags(stripslashes(htmlentities(mysql_real_escape_string($_POST['uid']))));

    //more stuff

        $sid = rndTxt(16);
        $status = nl2br($status);
        if (!get_magic_quotes_gpc()) {
            $status = addslashes($status);
        }


    $insert = mysql_query("INSERT INTO mingle_status (uid,sid,status,`timestamp`) VALUES ('$uid','$sid','$status',now())") or
    print mysql_error();

和我的输出代码:

while($st = mysql_fetch_assoc($statussql)) {
    $status = stripslashes($st['status']);
    $sid = $st['sid'];
    $td = $st['timestamp'];
?>
<div id="n">
<div id="statuses" class="<?php echo $sid; ?>">
<p><?php echo $status; ?></p>
<div id="statuscomadd" style="background:#E0E0E0;">
<a href="ld.php?uid=<?php $uid; ?>&pid=<?php echo $sid;?>&method=like">Like</a> <a href="ld.php?uid=<?php $uid; ?>&pid=<?php echo $sid;?>&method=dislike">Dislike</a><a href="#" id="time"><?php echo time_since($td) . " ago"; ?></a>
</div>  
</div>

任何帮助将不胜感激!:)

4

3 回答 3

2

您不需要nl2br()在插入时使用,您必须在以 html 显示时使用它

并且必须stripslashes在插入之前删除

于 2012-06-25T09:24:18.330 回答
1

插入时只需mysql_real_escape_string()对值执行 a 即可。您只想更改数据(例如,htmlentities()当您要显示它时使用)。

还请考虑停止mysql_*对新代码使用函数。它们不再被维护并且社区已经开始了弃用过程。看到红框了吗?相反,您应该了解准备好的语句并使用PDOMySQLi。如果你不能决定,这篇文章将有助于选择。如果你想学习,这里有一个很好的 PDO 教程

另一件事:你真的需要htmlentities()吗?因为 imo 更好的解决方案是使用htmlspecialchars(). 否则所有html 实体都将被替换。

此外,我认为您不需要使用strip_tags(),因为您已经在采取htmlspecialchars()措施保护您免受 XSS 攻击。

现在对你来说问题是因为你正在使用stripslashes()打破\n换行符。我想你可以放弃那些add/stripslashes

于 2012-06-25T09:31:03.620 回答
0

您使用strip_tags(stripslashes(htmlentities(mysql_real_escape_string())));which 从\n.

只需使用mysql_real_escape_string(), 或htmlentities( ,ENT_QUOTES)用于 HTML。

此外,如果可能的话,可以使用 UTF-8 编码而htmlspecialchars()不是htmlentities(). htmlentities()转换具有 HTML 表示的每个字符,同时htmlspecialchars()仅转换必要的字符。无需转换所有内容。请参阅:htmlentities 与 htmlspecialchars

于 2012-06-25T09:25:19.410 回答