jQuery技术

ASP.NET jQuery注意小细节来防止XSS攻击

字号+ 作者:H5之家 来源:H5之家 2018-04-23 12:08 我要评论( )

前言在开发网站时最害怕的莫过于开发人员写出了一个具有被攻击性的网站,而其实很多开发人员如果一不注意就会踏进了 Cross-Site Scripting(XSS)的地狱,解决方

想象一下这是多恐怖的行为,代表黑客只要了解 Javascript 就可以开始扰乱你的网站,值得注意的是如果显示内容的方式,是让使用者输入后送出显示或是透过 Ajax 取得页面数据并显示的话,就需要注意有 XSS 的危险存在。

防范小技巧

1.一般我们在开发网站过程中,有可能为了项目的需求而暂时关闭基本防护的功能,所以在上线前记得检查一下 web.config 的设定是不是正常。

<system.web>
   <pages validateRequest="true" /> //预设为 ture => 开启防护
</system.web>

2.常见的方法可以利用 Server.HtmlEncode 来对内容进行编码:

string value = Server.HtmlEncode("<script>alert('XSS 攻击');</script>");而如果使用的 .Net Framework 为 4.5的版本可以利用新的方法 AntiXssEncoder.HtmlEncode 来对内容进行编码:

// 需引用 System.Web.Security.AntiXss;
string value = AntiXssEncoder.HtmlEncode("<script>alert('XSS 攻击');</script>", true);3.若使用 ASP.NET MVC 进行开发,在 View 里利用 Html Helper 显示数据时也已经帮我过处理大部分的安全性问题。

首先我们先故意做一个会造成 XSS 攻击的恶意程序代码,这是在 ASP.NET MVC 中的 Controller

        public ActionResult Index()
        {
            TestModel model = new TestModel();
            model.XssAtack = "<script>alert('攻击');</script>";
            return View(model);
        }

下面示范几种在 View 中显示数据的方法,来检验各个方法对于 XSS 的防范机制:

@Html.DisplayFor(p => p.XssAtack) 攻击失败,显示纯文字

@Html.DisplayForModel() 攻击失败,显示纯文字

@Html.EditorFor(P => P.XssAtack) 攻击失败,显示 input 卷标

@Html.Encode(Model.XssAtack) 攻击失败,将内容进行编码@Html.Raw(Model.XssAtack) // 攻击成功,跳出 alert 窗口

@Html.DisplayTextFor(P => P.XssAtack)  // 攻击成功,跳出 alert 窗口测试结果中显示 Html.Raw 和 Html.DisplayTextFor 会造成 XSS 攻击的问题,所以在开发 ASP.NET MVC 时也应该小心使用这些 Html Helper,你防止不必要的问题发生,反观如果需求就是要跳出一段 alert 来提醒使用者,也可以利用这两种方法来做数据显示。

4.在 jQuery 中我们也应该小心使用 .html 的方法。

错误示范二

<table>
    <tbody>
        <tr>
            <td class="td1"></td>
        </tr>
    </tbody>
</table>

<script>
    var result = "<script>alert('攻击成功')";
    //透过.html的方法会将内容输出成html,将有机会造成XSS攻击
    $(".td1").html(result);
</script>

如果只是单纯显示 td 内容应该使用 .text 的方法来设定值

$(".td1").text(result);错误示范二

假设我们透过 Ajax 的方式取得表格内容,并利用 .html 设定数据将会发生 XSS 攻击问题。

Controller:

        public JsonResult GetData()
        {
            var data = new { id = "s001", name = "<script>alert('XSS 攻击')</script>" };
            return Json(data, JsonRequestBehavior.AllowGet);
        }View:

<table id="GridContent">
</table>

<script>
        $(function () {
            $.getJSON("/Home/GetData/", function (data) {
                var tr = "";
                tr += "<tr>";
                tr += "<td>" + data["id"] + "</td>";
                tr += "<td>" + data["name"] + "</td></tr>";
                $("#GridContent").html(tr);
            });
        });
</script>

解决方法可以直接改变原本的写法,让我们透过 jQuery 去选取到 $(td) 的对象,并直接对 td 设定值,当然这样的作法在效能上真的不是很优,毕竟如果自料很多的话会花费很大的效能,当然更精确的作法还是直接从 Server 端就进行编码来防范这个问题,而当然还是有其它作法像是以 Regex 表示式来对字符串进行检查...,但作法就比较复杂一点了。

5. 透过 Ajax 呼叫时利用 encodeURIComponent 对参数进行编码

var arg = encodeURIComponent("");
 $.getJSON("/Home/GetData/", { id: arg  },function(data){
     // do somthing
});

总结

其实说了那么多防范的方法,主要的问题还是在于当使用者一开始进行输入时就该做完整的验证,不应该让使用者传出去的数据有机会出现造成程序的漏洞,前端验证后端在进行数据把关,才能让我们的网站把持最佳化。

 

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • CSS技巧:逐帧动画抖动解决方案 前端开发,JQUERY特效,全栈开发

    CSS技巧:逐帧动画抖动解决方案 前端开发,JQUERY特效,全栈开发

    2018-04-23 14:06

  •  JQuery _ AJAX 记要

    JQuery _ AJAX 记要

    2018-04-22 18:01

  • jQuery简单判断值是否存在于数组中的方法示例

    jQuery简单判断值是否存在于数组中的方法示例

    2018-04-22 17:01

  • JQuery 模拟点击事件,自动触发事件

    JQuery 模拟点击事件,自动触发事件

    2018-04-22 16:05

网友点评