Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1502630
  • 博文数量: 3500
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 43870
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-03 20:31
文章分类

全部博文(3500)

文章存档

2008年(3500)

我的朋友

分类:

2008-05-04 19:56:29

一起学习
预备知识:

1.什么是JSONP:JSONP(JSON with Padding)是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。
2.为什么使用JSONP:由于 JSON 只是一种含有简单括号结构的纯文本,因此许多通道都可以交换 JSON 消息。因为同源策略的限制,我们不能在与外部服务器进行通信的时候使用 XMLHttpRequest。而JSONP是一种可以绕过同源策略的方法,即通过使用 JSON 与
JSON扩展测试页





()正在说:\"\"



年龄:
话语:









JavaScript代码片段:

/**
* 刷新信息
*/
function refreshPeopleInfo(people){
$('name').innerHTML=people.name;
$('age').innerHTML=people.age;
$('talking').innerHTML=people.talking;
}
/**
* 设置信息(年龄、话语)
*/
function setPeopleInfo(){
var newPeople=new Object();
newPeople.age=$F('newAge');
newPeople.talking=$F('newTalking');
var xmlHttp = new Ajax.Request(
"/json/people/cleverpig",
{
method: 'post',
parameters: 'json=' encodeURIComponent(Object.toJSON(newPeople)),
onComplete: function(transport){
var retObj=transport.responseText.evalJSON();
$('name').innerHTML=retObj.name;
$('age').innerHTML=retObj.age;
$('talking').innerHTML=retObj.talking;
}
}
);
}
Event.observe(
'setButton',
'click',
setPeopleInfo,
false
);

这里简单的功能非常明确:在页面装载时调用服务端URL(/json/people/cleverpig/jsonp/refreshPeopleInfo)生成的脚本来刷新people这个Div里面的数据项,而点击“修改”按钮便会将我们输入的新属性post到服务端,并接收服务端返回的JSON字符串更新页面显示。

运行截屏:

image

JSONP的安全问题:

我们可以使用若干种方法在 JavaScript 程序中动态地生成代码。最著名的函数之一就是 eval() 函数,该函数允许您将任意字符串做为 JavaScript 代码执行。然而,肆无忌惮地使用该函数是非常危险的。遗憾的是,一些使用广泛的 JavaScript 库在内部直接使用 eval() 函数。
由于 JSON 是以 JavaScript 的一个子集为基础的,所以脚本内容会潜在地包含恶意代码。然而,JSON 是JavaScript 的一个安全的子集,不含有赋值和调用。因此,许多 JavaScript 库使用 eval() 函数将 JSON 转换成 JavaScript 对象。要利用这点,攻击者可以向这些库发送畸形的 JSON 对象,这样 eval() 函数就会执行这些恶意代码。可以采取一些方法来保护 JSON 的使用。这里提供一种方法:使用 RFC 4627 中所定义的正则表达式确保 JSON 数据中不包含活动的部分。
下面 演示了如何使用正则表达式检查 JSON 字符串:

var my_JSON_object = !(/[^,:{}\[\]0-9.\- Eaeflnr-u \n\r\t]/.test(
text.replace(/"(\\.|[^"\\])*"/g, '' ''))) &&
eval(''('' text '')'');


源代码下载:

jsonp_source.rar


参考资源:

Restlet指南

Restlet讨论组


Implement JSONP in your Asp.net Application

Allen Wang对JSONP的介绍

GWT Tutorial: How to Read Web Services Client-Side with JSONP

JSON for jQuery

征服 Ajax 应用程序的安全威胁 下载本文示例代码


跨越访问之JSONP实践跨越访问之JSONP实践跨越访问之JSONP实践跨越访问之JSONP实践跨越访问之JSONP实践跨越访问之JSONP实践跨越访问之JSONP实践跨越访问之JSONP实践跨越访问之JSONP实践跨越访问之JSONP实践跨越访问之JSONP实践跨越访问之JSONP实践
阅读(157) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~