我有一个表格,其中使用在文本区域中输入多行文本。 有些行也可以有html标记。假设一行是粗体。
我应该如何在我的数据库中保存文本? 我应该像这样存放它们吗?
This is a greap post
<br/>
I love this type of findings.
<br/>
<br/>
Thanks for sharing
或者喜欢这个?
This is a greap post
<br/>
I love this type of findings.
<br/>
<br/>
Thanks for sharing
编辑期间: 我必须在输入时显示文字。换行将被新行替换 这样使用看到有一个换行符。 Textarea不会破坏br标记
显示期间: 我必须渲染文本,使其在页面上显示如下:
This is a greap post
I love this type of findings.
Thanks for sharing
我想知道存储可以在其中添加标记的文本的最简洁方法。
感谢您的帮助
答案 0 :(得分:2)
由于您要输出HTML,因此您必须将输入以原始格式存储在数据库中。但是只有一个问题。你永远不应该信任输入,因为所有输入都是邪恶的,特别是在这种情况下,因为输入时直接输出HTML,就会出现跨站点脚本(XSS)攻击的可能性。
你基本上有两个选择:
使用HTML清理程序,您可以删除所有不安全的标记。 Microsoft AntiXss toolkit附带一个好的消毒剂。
对输入进行编码并解码已知安全的结果部分,例如:
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>
会工作..