首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我需要清理JSONP调用中的回调参数吗?

我需要清理JSONP调用中的回调参数吗?
EN

Stack Overflow用户
提问于 2010-05-06 05:46:08
回答 4查看 28.7K关注 0票数 18

我想通过JSONP提供一个was服务,我想知道我是否需要清理回调参数的值。

我目前的服务器端脚本看起来像这样(或多或少。代码是用PHP编写的,但实际上可以是任何东西。):

代码语言:javascript
复制
header("Content-type: application/json; charset=utf-8");
echo $_GET['callback'] . '(' . json_encode($data) . ')';

这是一个典型的XSS漏洞。

如果我需要清理它,那该怎么做呢?我找不到关于可能允许的回调字符串的足够信息。我引用Wikipedia的话

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-05-06 15:21:20

是的,当callback像这样

代码语言:javascript
复制
(function xss(x){evil()})

当您从php回显时,将如下所示

代码语言:javascript
复制
(function xss(x){evil()})(json)

函数xss将会运行,sending ()可以是一些将cookie发送到其他地方的代码。

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

票数 10
EN

Stack Overflow用户

发布于 2012-06-06 00:13:58

您希望确保回调是有效的标识符,可以是字母数字、下划线或$。它也不能是保留字(为了彻底起见,我要确保它不是undefinedNaNInfinity)。这是我使用的测试:

代码语言:javascript
复制
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

票数 11
EN

Stack Overflow用户

发布于 2014-07-10 02:16:20

是。

正如@YOU所描述的,攻击者可以手工创建一个回调参数,其计算结果为恶意javascript,或者更糟糕的是,malicious Flash

根据@Brett-Wejrowski的描述,验证回调不是保留字并且是字母数字,这是一个很好的开始。

谷歌、Facebook和Github正在通过在jsonp回调中预先添加一个空注释(如/**/ )来缓解Rosetta Flash漏洞。

另一种方法是返回一个更安全的javascript表达式,就像ExpressJS做的那样:

代码语言:javascript
复制
typeof callbackstring === 'function' && callbackstring(.....);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2777021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档