JSONP安全防范解决方案新思路
jsonp安全性防范,分为以下几点: 1、防止callback参数意外截断js代码,特殊字符单引号双引号,换行符均存在风险 针对第三点,我们可以通过来源refer白名单匹配,以及cookieToken机制来限制 我们的关注点一直在于如何限制用户输入,但是请从另外一个层面去考虑该问题,或许就会豁然开朗。 我们先了解一下JS本身的特性。 function test(){}test(); 而在全局的函数也就默认是window的成员。也可以显示书写为 window.test = function(){};window.test(); 而JS中对象的成员是可以使用字符串索引的方式访问的,故进一步改造为 window['test']=function(){};window['test'](); 现在有注意到么,如此一来我们已经把函数名已经完全限制在了字符串上下文,理论上只要做好了防注入工作,callback参数是不可能跳出字符串上下文意外执行代码的。以PHP为例,单字符串防止注入甚至可以直接使用json_encode该字符串实现。 window['alert("123");abc'](); 上面的callback参数虽然有注入的风险,可以由于callback参数严格限制在字符串内部,仅会作为文本,不会意外执行 但仍然存在xss漏洞问题,看下面例子 window['<script>alert(123);</script>'](); 我们虽然已经保证了<script>严格限制在引号内部,不会造成js注入,但是直接在浏览器中输入该jsonp请求仍会按照HTML解析,产生XSS漏洞,即便设置了header也很难防范。 在进一步,我们只需要保证浏览器内不会明文出现<>标签,那么问题便可彻底解决。 最终附上一段简短的代码。根本解决jsonp的安全问题 <?php header('Content-type: text/javascript'); //加上此句可以消除chrome的警告 $callback = urlencode($_GET['callback']); echo "window[decodeURIComponent('{$callback}')] ({ret:0,msg:’OK’});" 请求1:http://www.test.com/a.php?callback=alert(123);abc 响应1:window[decodeURIComponent('alert(123)%3Babc')]({ret:0,msg:'OK'}); 请求2:http://www.test.com/a.php?callback=<script>alert(123);</script> 响应2:window[decodeURIComponent('%3Cscript%3Ealert(123)%3B%3C%2Fscript%3E')]({ret:0,msg:'OK'}); 上述几个例子都可以证明jsonp安全漏洞已被彻底规避,即便存在尝试注入的恶意参数,仍能最大限度保证程序完全正常工作触发回调。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |