常見跨域的方法有:javascript
一、2兩種方法都是安全可靠的,3是不安全不可靠的php
Json本質是引用並執行外部JavaScript腳本,原理是<scrpit>標籤不受域名的限制,經過動態建立<scrpit>來執行js函數html
jQuery執行Jsonp使用java
$.ajax(url,{ dataType:"jsonp", error:function(jqXHR,textStatus,errorThrown) { //TODO }, success:function(data) { //TODO } });
jQuery3.3.1加載執行外部jsnode
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網站牽制。ajax
安全狀況下,safeapi.phpjson
<?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.phpapi
<?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