当前位置: 移动技术网 > IT编程>开发语言>JavaScript > 挑战常规--为什么不应该使用Jsonp进行跨域

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

2018年10月31日  | 移动技术网IT编程  | 我要评论
常规跨域的方法 常见跨域的方法有: 1. 添加Access Control Allow Origin 2. 后台服务器代理 3. Jsonp 1、2两种方法都是安全可靠的,3是不安全不可靠的 Json的本质 Json本质是 引用并执行外部JavaScript脚本 ,原理是\标签不受域名的限制,通过动 ...

常规跨域的方法

常见跨域的方法有:

  1. 添加access-control-allow-origin
  2. 后台服务器代理
  3. 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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网