我应该如何在数据库中存储注释,以便我可以在页面上有效地将它们显示为html文本?

时间:2011-07-03 06:53:54

标签: asp.net html database security xss

我有一个表格,其中使用在文本区域中输入多行文本。 有些行也可以有html标记。假设一行是粗体。

我应该如何在我的数据库中保存文本? 我应该像这样存放它们吗?

This is a greap post
<br/>
I love this type of findings.
<br/>
<br/>
Thanks for sharing

或者喜欢这个?

This is a greap post
&lt;br/&gt;
I love this type of findings.
&lt;br/&gt;
&lt;br/&gt;
Thanks for sharing

编辑期间: 我必须在输入时显示文字。换行将被新行替换 这样使用看到有一个换行符。 Textarea不会破坏br标记

显示期间: 我必须渲染文本,使其在页面上显示如下:

This is a greap post

I love this type of findings.


Thanks for sharing

我想知道存储可以在其中添加标记的文本的最简洁方法。

感谢您的帮助

3 个答案:

答案 0 :(得分:2)

由于您要输出HTML,因此您必须将输入以原始格式存储在数据库中。但是只有一个问题。你永远不应该信任输入,因为所有输入都是邪恶的,特别是在这种情况下,因为输入时直接输出HTML,就会出现跨站点脚本(XSS)攻击的可能性。

你基本上有两个选择:

  1. 使用HTML清理程序,您可以删除所有不安全的标记。 Microsoft AntiXss toolkit附带一个好的消毒剂。

  2. 对输入进行编码并解码已知安全的结果部分,例如:

  3. string[] safeList = { "<br/>", "<b>", "</b>", "<i>", "</i>" };
    
    public static string EncodeInputWithSafeList(string unsafeInput)
    {
        // First: encode the complete input.
        string safeInput = Encoder.HtmlEncode(unsafeInput);
    
        // Next: decode each tag that is known to be safe.
        foreach (string safeTag in safeList)
        {
            string encodedTag = Encoder.HtmlEncode(safeTag, false);
            safeInput = safeInput.Replace(encodedTag, safeTag);
        }
    
        return safeInput;
    }
    

    注意:该示例使用Microsoft AntiXss toolkit中的Encoder类。

    现在问题变成了,我们应该在什么时候清理它。通常,您应该在将输出发送到客户端之前对输出进行编码,而不是将其存储在数据库中,因为它取决于输出类型(HTML,PDF,JSON)如何编码数据。这是因为如果编码器中存在错误,则无法修复它,因为数据已经编码。

    在这种情况下,它有点棘手,因为输入是HTML而不仅仅是文本。我会说清理是你手头仍然想做的事情,因为这样可以防止错误的输入进入你的数据库。 EncodeInputWithSafeList方法有点棘手,因为它既是消毒剂又是编码器。当我们在进入数据库之前运行它时,它会在我们更改安全列表时阻止输出更改。这既可以是好事也可以是坏事,但我会说,当您将新标签添加到安全列表时,您不希望旧数据突然改变。所以在这种情况下,我会使用输入编码,而不是输出编码。

    当您使用输入编码时,请以这样的方式命名数据库列,以便我们清楚地处理已清理的编码数据。

答案 1 :(得分:0)

在保存数据之前尝试htmlentities($str, ENT_QUOTES);,在将数据提取到浏览器之前,先从数据库中获取html_entity_decode($str)

答案 2 :(得分:0)

将其保存到您的数据库,如下所示:

<p>This is a greap post
<br/>
I love this type of findings.
<br/>
<br/>
Thanks for sharing</p>

会工作..