我已经在Asp.net mvc 5中开发了一个应用程序。我正面临着全宽度unicode字符的跨站点脚本问题。
攻击值: - %uff1cinput / onclick = alert(1)%uff1e
%uff1c =< %uff1e =>
我知道Antixss库可用于解决问题。但是任何人都可以展示如何实现Antixss输入过滤和输出编码的示例代码 请为此提出解决方案。
答案 0 :(得分:1)
我遇到了同样的问题,终于找到了解决办法。希望这将对其他有相同问题的人有所帮助。
基本上,您需要扩展System.Web.Util中的RequestValidator基类。这是我的班级,它将同时过滤unicode值和小于和大于符号的实际全宽:
using System.Web;
using System.Web.Util;
namespace Common.Extensions
{
public class RequestValidatorExtension : RequestValidator
{
private const string UNICODE_LESS_THAN = "%uff1c";
private const string UNICODE_GREATER_THAN = "%uff1e";
public RequestValidatorExtension() { }
protected override bool IsValidRequestString(
HttpContext context,
string value,
RequestValidationSource requestValidationSource,
string collectionKey,
out int validationFailureIndex
)
{
validationFailureIndex = -1;
if (value.Contains(UNICODE_LESS_THAN))
value = value.ReplaceWith(UNICODE_LESS_THAN, "<");
else if (value.Contains("<"))
value = value.ReplaceWith("<", "<");
if (value.Contains(UNICODE_GREATER_THAN))
value = value.ReplaceWith(UNICODE_GREATER_THAN, ">");
else if (value.Contains(">"))
value = value.ReplaceWith(">", ">");
return base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);
}
}
}
对于我来说,当“恶意”代码添加到文本框中时,它将作为unicode值传递。但是,当查询字符串被Fiddler拦截并修改时,该值将位于全角符号中。这就是为什么要同时检查两者的原因。
您还必须在web.config或global.asax页面中注册此新的RequestValidationType。这是两个示例:
// Web.config
<httpRuntime requestValidationMode="2.0" requestValidationType="namespace.class" />
// Global.asax.cs
protected void Application_Start(object sender, EventArgs e)
{
RequestValidator.Current = new RequestValidatorExtension();
}
此外,here's a link有关如何利用和扩展类的MS文档。
希望这会有所帮助,加油!
答案 1 :(得分:0)
根据下面的文章,发生了此问题,因为如果您的数据库列不支持nvarchar或nchar,SQL Server将尝试将Unicode <>转换为<>的Ascii版本。结果,当从数据库中查询相同的<>时,它将变为XSS注入。 因此,基本上有两种方法可以解决此问题。 首先,作为@Alec Zorn的答案,您可以在输入时阻止它们。这是一种简单有效的方法。 第二种方法是您可以将DB列更改为使用nvarchar或nchar。但是这种方法将需要您更改很多列。
https://www.gosecure.net/blog/2016/03/22/xss-for-asp-net-developers/