挑战常规--为什么不应该使用Jsonp进行跨域
程序员文章站
2022-03-12 19:56:56
常规跨域的方法 常见跨域的方法有: 1. 添加Access Control Allow Origin 2. 后台服务器代理 3. Jsonp 1、2两种方法都是安全可靠的,3是不安全不可靠的 Json的本质 Json本质是 引用并执行外部JavaScript脚本 ,原理是\标签不受域名的限制,通过动 ......
常规跨域的方法
常见跨域的方法有:
- 添加access-control-allow-origin
- 后台服务器代理
- jsonp
1、2两种方法都是安全可靠的,3是不安全不可靠的
json的本质
json本质是引用并执行外部javascript脚本,原理是<scrpit>标签不受域名的限制,通过动态创建<scrpit>来执行js函数
jsonp的使用
jquery执行jsonp使用
$.ajax(url,{ datatype:"jsonp", error:function(jqxhr,textstatus,errorthrown) { //todo }, success:function(data) { //todo } });
jquery3.3.1加载执行外部js
function domeval( code, doc, node ) { doc = doc || document; var i, script = doc.createelement( "script" ); script.text = code; if ( node ) { for ( i in preservedscriptattributes ) { if ( node[ i ] ) { script[ i ] = node[ i ]; } } } doc.head.appendchild( script ).parentnode.removechild( script ); }
不安全
用户输入不可信,外部脚本同样不可信。若a网站引用了b网站的跨域脚本,那么a网站的安全受b网站牵制。
安全情况下,safeapi.php
<?php date_default_timezone_set('asia/shanghai'); $result=json_encode(array("msg"=>"你好,当前时间:".date("y-m-d h:i:s e"))); if(isset($_request['callback'])) { header("content-type:text/javascript;charset=utf-8"); echo $_request['callback']."(".$result.")"; }else { header("content-type:application/json;charset=utf-8"); echo $result; }
b网站受到攻击或恶意代码,danger.php
<?php header("content-type:text/javascript;charset=utf-8"); if(isset($_request['callback'])) { echo $_request['callback']."("; }else { echo "_("; } echo json_encode(array("msg"=>"你好,当前时间:".date("y-m-d h:i:s"))); echo ");console.log('do something');";
在a网站下控制台输出 do something
思考
应该对网站安全进行隔离,不应轻易相信外部脚本,否则很容易造成账号泄漏等安全风险。如果的确需要引用执行外部脚本,可以使用csp 策略指令进行白名单控制,如:
content-security-policy: default-src 'self' trustedscripts.foo.com
上一篇: SQLServer之创建AFETER DELETE触发器
下一篇: 判断属性存在于原型而非对象的方法