测试支持CORS的服务器的跨域请求行为。
对Restful API做如下改动,在response中加入header:
def index():
#Add CORS header#
response.set_header("Access-Control-Allow-Origin", ":8080")
return 'Hello World.'
测试结果:
1. 跨域GET请求已经发出,请求header中带有
Origin :8080
2. 服务器端正确给出response
3. 客户端正常获取数据
测试3:
测试OPTIONS请求获取CORS信息。
对客户端的Ajax请求增加header:
$.ajax({ url: 'http://localhost:8000/hello', headers: {'Content-Type': 'text/html'}, success: function(data) { alert(data); }, error: function() { alert('error'); } });
对Restful API做如下改动:
@route('/hello', method = ['OPTIONS', 'GET']) def index(): if request.method == 'OPTIONS': return '' return 'Hello World.'
测试结果:
1. Ajax函数会首先发送OPTIONS请求
2. 针对OPTIONS请求服务器
3. 客户端发现没有CORS header后不会发送GET请求
测试4:
增加服务器端对OPTIONS方法的处理。
对Restful API做如下改动:
@route('/hello', method = ['OPTIONS', 'GET']) def index(): response.headers['Access-Control-Allow-Origin'] = 'https://localhost:8080' response.headers['Access-Control-Allow-Methods'] = 'GET, OPTIONS' response.headers['Access-Control-Allow-Headers'] = 'Origin, Accept, Content-Type' if request.method == 'OPTIONS': return '' return 'Hello World.'
测试结果:
1. Ajax函数会首先发送OPTIONS请求
2. 针对OPTIONS请求服务器
3. 客户端匹配CORS header中的allow headers and orgin后会正确发送GET请求并获取结果
测试发现,Access-Control-Allow-Headers是必须的。
CORS协议提升了Ajax的跨域能力,但也增加了风险。一旦网站被注入脚本或XSS攻击,将非常方便的获取用户信息并悄悄传递出去。
4. Cookie 同源策略
Cookie中的同源只关注域名,忽略协议和端口。所以https://localhost:8080/和:8081/的Cookie是共享的。
5. Flash/SilverLight跨域
浏览器的各种插件也存在跨域需求。通常是通过在服务器配置crossdomain.xml[4],设置本服务允许哪些域名的跨域访问。
客户端会首先请求此文件,如果发现自己的域名在访问列表里,就发起真正的请求,否则不发送请求。
<?xml version="1.0"?> <!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"> <cross-domain-policy> <allow-access-from domain="*"/> <allow-http-request-headers-from domain="*" headers="*"/> </cross-domain-policy>
通常crossdomain.xml放置在网站根目录。
6. 总结
互联网的发展催生了跨域访问的需求,各种跨域方法和协议满足了需求但也增加了各种风险。尤其是XSS和CSRF等攻击的盛行也得益于此。
了解这些技术背景有助于在实际项目中熟练应用并规避各种安全风险。
您可能感兴趣的文章: