我刚刚开始使用AntiXSS(4.3.0),主要是使用这里描述的@Encoder.JavaScriptEncode
。
我从Nuget安装了AntiXSS,然后在我的Web.config中将encoderType="Microsoft.Security.Application.AntiXssEncoder, AntiXssLibrary"
添加到<httpRuntime
。
在我看来,我有以下行(在<script>
标签内):
var userId = @Encoder.JavaScriptEncode(User.Identity.GetUserId());
我希望输出
var userId = 'user-id';
却输出:
var userId = 'user-id';
我认为这是因为Razor试图净化HTML,因此将单引号编码为'
。
解决方案是将其包装在Html.Raw()
中,但在我所遵循的帖子中,他从未这样做过(而是将整个东西包装在Javascript中的单引号中)。
我的问题是-你应该需要调用@Html.Raw(Encoder.JavaScriptEncode(data))
,还是我的设置有问题?
谢谢!
你关于剃刀编码的假设是正确的。我也想说你所关注的帖子也是正确的(我可能是错的,虽然我没有读完整篇文章)。
代替
var userId = @Encoder.JavaScriptEncode(User.Identity.GetUserId());
试
var userId = '@Encoder.JavaScriptEncode(User.Identity.GetUserId(), emitQuotes: false)';
//optionally surround with '' if your userId needs to be a string
还是
var userId = @Encoder.JavaScriptEncode(User.Identity.GetUserId(), emitQuotes: false);
// Visual Studio gives you a red squiggly syntax error after the semi-colon though.
// From your example, if it is a number, then no quotes are required
或继续使用Html.Raw()
,如
var userId = Html.Raw(@Encoder.JavaScriptEncode(User.Identity.GetUserId());
Opionated:我更喜欢emitQuotes: false,因为这个选项是存在的,而且因为它消除了对另一个函数调用Html.Raw()
的需要。emitQuotes的默认值为true。您错过了emitQuotes参数还是故意的?