我有一个简单的论坛应用程序,当有人发布任何内容时,我会:
post.Content = Sanitizer.GetSafeHtml(post.Content);
现在,我不确定我是否做错了什么,或者发生了什么,但它不允许几乎没有 html。甚至简单<b></b>
实在是太多了。所以我想这个工具完全没用。
现在我的问题是:谁能告诉我应该如何清理用户输入,以便他们可以发布一些图像(<img>
标签)并使用粗体强调等?
看来很多人都找到消毒液了相当无用 https://wpl.codeplex.com/releases/view/80289#ReviewsAnchor。不用使用消毒剂,只需对所有内容进行编码,然后将安全部分解码回来:
private static readonly IEnumerable<string> WhitelistedTags =
new[] { "<b>", "</b>", "<i>", "</i>" };
private static readonly (string Encoded, string Decoded)[] DecodingPairs =
WhitelistedTags
.Select(tag => (Microsoft.Security.Application.Encoder.HtmlEncode(tag), tag))
.ToArray();
public static string Sanitize(string html)
{
// Encode the whole thing
var safeHtml = Microsoft.Security.Application.Encoder.HtmlEncode(html);
var builder = new StringBuilder(safeHtml);
// Decode the safe parts
foreach (var (encodedTag, decodedTag) in DecodingPairs)
{
builder.Replace(encodedTag, decodedTag);
}
return builder.ToString();
}
请注意,安全解码几乎是不可能的IMG标签,因为攻击者可以通过非常简单的方法来滥用此标签。例子:
<IMG SRC="javascript:alert('XSS');">
<IMG SRC=javascript:alert('XSS')>
看看这里更彻底XSS 备忘单 https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)