2016-11-14 18 views
1

很晚到游戏 -编码一个对象而不是每个属性

我刚刚开始思考我的网站上的XSS。不幸的是,在几个地方我创建了我通过Ajax传递的对象:

var params = {}; 
params.firstName = $("#firstName").val(); 
params.lastName = $("#lastName").val(); 

$.ajax({url:url, data:params}).done(); 

任何人都可以用可执行JS编写。现在,从我读过,我可以轻松地做这个改变这种情况:

var params = {}; 
params.firstName = encodeURIComponent($("#firstName").val()); 
params.lastName = encodeURIComponent($("#lastName").val()); 

$.ajax({url:url}, data:params).done(); 

但不是通过每一个创建对象和encodeURIComponent方法包装各个领域的地方去---有什么办法直接在参数上而不是在每个属性上直接转义字符?

感谢您的任何有用的提示。

更新:当内容类型:application/x-www-form-urlencoded; charset = UTF-8然后表单数据被自动编码。

+3

我认为jQuery的实际执行此为您 – aw04

+1

出于安全虽然,逃避所有这些字符的服务器 - 方,而不是客户端。在客户端上转义它使得XSS变得更加困难,但它仍然完全可能并且不那么困难。 – nicovank

+0

@nicovank - 是的,非常好的一点。所有的端点也将得到保护。我只是把它作为一个额外的措施,因为我认为UI应该对XSS采取一些措施。 – fumeng

回答

-1

像这样的东西会工作:

function encodeParams(data) { 
    Object.keys(data).forEach(function(key) { 
     data[key] = encodeURIComponent(data[key]); 
    }); 

    return data; 
} 

你可以使用像这样:

var params = encodeParams({ 
    firstName: $('firstName').val(), 
    lastName: $('lastName').val() 
}); 

ajax(...) 
相关问题