0

我目前正在阅读 .net MVC 并且刚刚到达本书的安全章节。我知道 xss,并且我从不信任任何用户输入而不首先对其进行清理(通常使用 html 编码甚至像 php 的 strip_tags 之类的东西)。到目前为止,我还不熟悉用于保护的 Javascript 编码字符串。本书中的一个示例让用户传入如下字符串:

\x3cscript\x3e%20alert(\x27test\x27)\x3c/script\x3e

所以很自然地,当我学习新东西时,我想测试它。我创建了这个:

public ActionResult Index()
    {
        ViewBag.test = "\x3cscript\x3e%20alert(\x27test\x27)\x3c/script\x3e";
        return View("index");
    }

这个视图代码在页面上打印出测试字符串:

@ViewBag.test

但是,我根本无法显示此警报框。当我在页面上查看源代码时,我得到

<script>%20alert('test')</script>

我试过用几种不同的方式玩它

  1. 从查询字符串传递@ViewBag
  2. 将 viewbag 打印放在现有脚本代码中(这就是本书的内容)
  3. 用实际空格替换 %20
  4. 使用 jquery 将 html 替换为 ViewBag.test:
    $('#inject_here').html('@ViewBag.test');

我尝试的任何操作都不会执行此代码(我想这是一件好事?)。现在我知道这本书不会有一部分专门讨论一开始就不起作用的东西,所以问题一定出在我的头上。我只是不知道它是什么。有人有想法么?

4

1 回答 1

1

asp.net MVC 试图为您解决这个问题。它自动编码输出。您必须竭尽全力打印出一个没有 html 编码的字符串。

@Html.Raw(ViewBag.test)

在某些地方,您最终会在应用程序中执行此操作。理想情况下,您将拥有将模型渲染到的模板。但是,在某些情况下,您将拥有动态的 HTML 部分,需要按原样打印。在这些情况下,您将使用Html.Raw并且只需要注意您必须验证内容的完整性。

于 2013-05-30T21:00:03.607 回答