【问题标题】:How should I store comments in database so that I can efficiently display them on page as html text?我应该如何将评论存储在数据库中,以便我可以在页面上有效地将它们显示为 html 文本?
【发布时间】:2011-07-03 06:53:54
【问题描述】:

我有一个表单,使用在文本区域中输入多行文本。 有些行也可以有 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

我想知道存储可以在其中包含标记的文本的最简洁方式。

感谢您的帮助

【问题讨论】:

  • 数据存储和展示是两个完全不同的东西

标签: asp.net html database security xss


【解决方案1】:

由于您想输出 HTML,您必须将输入以原始格式存储在数据库中。虽然只有一个问题。您永远不应该相信输入,因为所有输入都是邪恶的,尤其是在这种情况下,因为在输入时直接输出 HTML,可能会引发跨站点脚本 (XSS) 攻击。

你基本上有两个选择:

  1. 使用 HTML sanitizer,让您删除所有未知安全的标签。 Microsoft AntiXss toolkit 附带一个好的消毒剂。

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

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 toolkitEncoder 类。

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

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

当您使用输入编码时,请以这样一种方式命名数据库列,以便清楚地表明我们正在处理经过净化的编码数据。

【讨论】:

    【解决方案2】:

    在保存数据之前尝试htmlentities($str, ENT_QUOTES);,在从数据库中获取数据之后尝试html_entity_decode($str),然后再将其呈现给浏览器。

    【讨论】:

    • htmlentities() 和 html_entity_decode() 来自插件还是 jquery?
    • 抱歉没有看到 ASP.net 标签。 htmlentites 等是 PHP。对于 ASP.net,您需要使用 Server.HtmlEncode("");和 Server.HtmlDecode("<your string>");
    【解决方案3】:

    像这样将它保存到您的数据库中:

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

    会工作..

    【讨论】:

    • 那是非常危险的。我喜欢这种类型的
    • 无论做什么都必须得到保护。否则,它可能最终变得无用
    • 好吧,那么如果您真的想要安全,您可能应该重新提出您的问题。在这种情况下,我根本不建议使用 HTML 标签,因为最安全的方法是从用户输入的文本中删除所有 HTML 标签。
    • 对。 OP 只需阅读 XSS 并了解您的应用程序需求 - en.wikipedia.org/wiki/Cross-site_scripting
    猜你喜欢
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    相关资源
    最近更新 更多