我刚刚开始使用AntiXSS(4.3.0),主要是使用here所述的@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()
中,但在post I was following中他永远不会这样做(而是将整个事物用Javascript中的单引号括起来。)
我的问题是 - 你应该打电话给@Html.Raw(Encoder.JavaScriptEncode(data))
,还是我的设置有问题?
谢谢!
答案 0 :(得分:3)
您对剃刀编码的假设是正确的。我还说post you were following也是正确的(我可能错了,但我还没读完整篇文章)。
而不是
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 参数或是故意的?