我想通过JSONP提供一个was服务,我想知道我是否需要清理回调参数的值。
我目前的服务器端脚本看起来像这样(或多或少。代码是用PHP编写的,但实际上可以是任何东西。):
header("Content-type: application/json; charset=utf-8");
echo $_GET['callback'] . '(' . json_encode($data) . ')';
这是一个典型的XSS漏洞。
如果我需要清理它,那该怎么做呢?我找不到关于可能允许的回调字符串的足够信息。我引用Wikipedia的话
虽然填充(前缀)通常是在浏览器的执行上下文中定义的回调函数的名称,它也可以是变量赋值、if语句或任何其他Javascript语句前缀。
发布于 2010-05-06 15:21:20
是的,当callback
像这样
(function xss(x){evil()})
当您从php回显时,将如下所示
(function xss(x){evil()})(json)
函数xss将会运行,sending ()可以是一些将cookie发送到其他地方的代码。
因此,仅将其清理为有效函数名称,例如,将其限制为字母数字
发布于 2012-06-06 00:13:58
您希望确保回调是有效的标识符,可以是字母数字、下划线或$。它也不能是保留字(为了彻底起见,我要确保它不是undefined
、NaN
或Infinity
)。这是我使用的测试:
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
时
发布于 2014-07-10 02:16:20
是。
正如@YOU所描述的,攻击者可以手工创建一个回调参数,其计算结果为恶意javascript,或者更糟糕的是,malicious Flash。
根据@Brett-Wejrowski的描述,验证回调不是保留字并且是字母数字,这是一个很好的开始。
谷歌、Facebook和Github正在通过在jsonp回调中预先添加一个空注释(如/**/ )来缓解Rosetta Flash漏洞。
另一种方法是返回一个更安全的javascript表达式,就像ExpressJS做的那样:
typeof callbackstring === 'function' && callbackstring(.....);
https://stackoverflow.com/questions/2777021
复制相似问题