多くの人が消毒剤を役に立たないと感じているようです. サニタイザーを使用する代わりに、すべてをエンコードし、安全な部分をデコードして戻します。
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 チート シートについては、こちらをご覧ください。