我正在尝试保护我的网站免受跨站点脚本(XSS)的攻击,我正在考虑使用正则表达式来验证用户输入。
这是我的问题:我有一个危险的HTML标签列表......
<applet>
<body>
<embed>
<frame>
<script>
<frameset>
<html>
<iframe>
<img>
<style>
<layer>
<link>
<ilayer>
<meta>
<object>
...我希望将它们包含在正则表达式中 - 这可能吗?如果没有,我应该使用什么?你有任何想法如何实现这样的东西吗?
答案 0 :(得分:5)
请仔细阅读OWASP XSS (Cross Site Scripting) Prevention Cheat Sheet以获取各种信息。黑名单标签不是一种非常有效的方式,并且会留下空白。您应该在输出到浏览器之前过滤输入,清理,编码HTML实体以及链接中讨论的各种其他技术。
答案 1 :(得分:5)
您应该将字符串编码为HTML。使用dotNET方法
HttpUtils.HtmlEncode(string text)
答案 2 :(得分:2)
<SCRIPT>
<ScRiPt>
< S C R I P T >
<scr�ipt>
<scr<script>ipt>
(你是否递归申请黑名单;-))
这不是可能的攻击的列举,而只是一些关于黑名单如何被击败的例子。这些都将在浏览器中正确呈现。
答案 3 :(得分:2)
public static bool ValidateAntiXSS(string inputParameter)
{
if (string.IsNullOrEmpty(inputParameter))
return true;
// Following regex convers all the js events and html tags mentioned in followng links.
//https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
//https://msdn.microsoft.com/en-us/library/ff649310.aspx
var pattren = new StringBuilder();
//Checks any js events i.e. onKeyUp(), onBlur(), alerts and custom js functions etc.
pattren.Append(@"((alert|on\w+|function\s+\w+)\s*\(\s*(['+\d\w](,?\s*['+\d\w]*)*)*\s*\))");
//Checks any html tags i.e. <script, <embed, <object etc.
pattren.Append(@"|(<(script|iframe|embed|frame|frameset|object|img|applet|body|html|style|layer|link|ilayer|meta|bgsound))");
return !Regex.IsMatch(System.Web.HttpUtility.UrlDecode(inputParameter), pattren.ToString(), RegexOptions.IgnoreCase | RegexOptions.Compiled);
}