当前位置:  开发笔记 > 编程语言 > 正文

我是否需要从JSONP调用中清除回调参数?

如何解决《我是否需要从JSONP调用中清除回调参数?》经验,为你挑选了2个好方法。

我想通过JSONP提供一个web服务,并且想知道,如果我需要清理callback参数中的值.

我当前的服务器端脚本现在看起来像这样(或多或少.代码在PHP中,但可能是真的.):

header("Content-type: application/json; charset=utf-8");
echo $_GET['callback'] . '(' . json_encode($data) . ')';

这是一个典型的XSS漏洞.

如果我需要消毒它,那怎么样?我无法找到有关可能允许的回调字符串的足够信息.我引用维基百科:

虽然填充(前缀)通常是在浏览器的执行上下文中定义的回调函数的名称,但它也可以是变量赋值,if语句或任何其他Javascript语句前缀.

Brett Wejrow.. 11

您希望确保回调是有效的标识符,可以是字母数字,下划线或$.它也不能是保留字(和刚需深入我会确保它不是undefined,NaNInfinity).这是我使用的测试:

function valid_js_identifier( $callback ){
    return !preg_match( '/[^0-9a-zA-Z\$_]|^(abstract|boolean|break|byte|case|catch|char|class|const|continue|debugger|default|delete|do|double|else|enum|export|extends|false|final|finally|float|for|function|goto|if|implements|import|in|instanceof|int|interface|long|native|new|null|package|private|protected|public|return|short|static|super|switch|synchronized|this|throw|throws|transient|true|try|typeof|var|volatile|void|while|with|NaN|Infinity|undefined)$/', $callback);
}

许多保留字是毫无意义的,但其中一些可能导致错误或无限循环.

重要提示:不要只是通过替换字符来清理输入; 修改后的回调可以无错误地运行,并且返回的数据将无法正确处理(甚至可能由错误的函数处理).您想测试输入是否有效,如果不是则抛出错误.这将避免意外行为并通知开发人员需要不同的回调.

注意:这是一个更安全但有限的JSONP版本,不允许表达式或细化.我发现它适用于大多数应用程序,特别是如果你使用jQuery和$.getJSON



1> Brett Wejrow..:

您希望确保回调是有效的标识符,可以是字母数字,下划线或$.它也不能是保留字(和刚需深入我会确保它不是undefined,NaNInfinity).这是我使用的测试:

function valid_js_identifier( $callback ){
    return !preg_match( '/[^0-9a-zA-Z\$_]|^(abstract|boolean|break|byte|case|catch|char|class|const|continue|debugger|default|delete|do|double|else|enum|export|extends|false|final|finally|float|for|function|goto|if|implements|import|in|instanceof|int|interface|long|native|new|null|package|private|protected|public|return|short|static|super|switch|synchronized|this|throw|throws|transient|true|try|typeof|var|volatile|void|while|with|NaN|Infinity|undefined)$/', $callback);
}

许多保留字是毫无意义的,但其中一些可能导致错误或无限循环.

重要提示:不要只是通过替换字符来清理输入; 修改后的回调可以无错误地运行,并且返回的数据将无法正确处理(甚至可能由错误的函数处理).您想测试输入是否有效,如果不是则抛出错误.这将避免意外行为并通知开发人员需要不同的回调.

注意:这是一个更安全但有限的JSONP版本,不允许表达式或细化.我发现它适用于大多数应用程序,特别是如果你使用jQuery和$.getJSON



2> YOU..:

是的,什么时候callback喜欢

(function xss(x){evil()})

当你从php回显时,会看起来像

(function xss(x){evil()})(json)

函数xss将运行而evil()可以是一些代码将cookie发送到其他地方.

因此,将其清理为仅有效的函数名称,例如,将其限制为字母数字


你应该使用**`application/javascript`**而不是`application/json` !!
如果您使用的是英语语言环境,则可以使用ctype_alpha($ _ GET ['callback'])轻松检查此情况,否则过滤函数可以很好地工作.另请注意,标题应设置为'content-type:application/json; 返回jsonp响应时charset = utf-8'.
推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有