东莞市盛裕绒艺玩具有限公司

东莞市盛裕绒艺玩具有限公司

easybet易利

13500432193
联系方式
全国服务热线: 13500432193

咨询热线:15543553798
联系人:林伟佳
地址:武汉市江岸区保成路41附1

挑战常规--为什么不应该使用Jsonp进行跨域

来源:easybet易利   发布时间:2019-06-26   点击量:441

常规跨域的方法

常见跨域的方法有:

    添加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

<?phpdate_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

<?phpheader("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

相关产品

COPYRIGHTS©2017 easybet易利 ALL RIGHTS RESERVED 备案号:441