ASP.NET & jQuery注意小细节来防止XSS攻击
- 前言
在开发网站时最害怕的莫过于开发人员写出了一个具有被攻击性的网站,而其实很多开发人员如果一不注意就会踏进了 Cross-Site Scripting(XSS)的地狱,解决方法很简单但却也很容易踏进去,以小弟来说就也曾经跳进去很多次,尤其式透过 jQuery 在操作动态网页时很容易没想清楚就用错方法导致 XSS 错误发生,所以这边笔者整理了几种在撰写上的技巧来跟大家分享如何防止XSS攻击。
XSS 指令码攻击
我们先看下底下这个画面,这是一个简单的讯息发送窗口,而倘若今天黑客在窗口内输入 Javascript 片段,将会造成这样的结果:
想象一下这是多恐怖的行为,代表黑客只要了解 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 来提醒使用者,也可以利用这两种方法来做数据显示。www.it165.net
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("http://tw.yahoo.com");
$.getJSON("/Home/GetData/", { id: arg },function(data){
// do somthing
});总结
其实说了那么多防范的方法,主要的问题还是在于当使用者一开始进行输入时就该做完整的验证,不应该让使用者传出去的数据有机会出现造成程序的漏洞,前端验证后端在进行数据把关,才能让我们的网站把持最佳化。
原文:http://www.it165.net/pro/html/201305/5947.html