2

我刚刚开始使用 AntiXSS (4.3.0),主要是按照这里@Encoder.JavaScriptEncode的描述使用。

我从 Nuget 安装了 AntiXSS,然后添加encoderType="Microsoft.Security.Application.AntiXssEncoder, AntiXssLibrary"<httpRuntime我的 Web.config 中。

在我看来,我有以下行(在<script>标签内):

var userId = @Encoder.JavaScriptEncode(User.Identity.GetUserId());

我希望输出

var userId = 'user-id';

而是输出:

var userId = &#39;user-id&#39;;

我认为这是因为 Razor 正在尝试清理 HTML,因此将单引号编码为&#39;.

那么解决方案就是将其包装在 中Html.Raw(),但在我关注的帖子中,他从未这样做(而是在 Javascript 中用单引号将整个内容包装起来)。

我的问题是 - 你应该需要打电话@Html.Raw(Encoder.JavaScriptEncode(data)),还是我的设置有问题?

谢谢!

4

1 回答 1

4

您对剃刀编码的假设是正确的。我还要说您关注的帖子也是正确的(我可能是错的,虽然我还没有阅读整个帖子)。

代替

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参数或者是故意的?

于 2014-07-22T14:20:06.520 回答