我有一个名为 action.php 的文件,它将执行一些操作。我想将其公开为纯 JSON 或 JSONP 输出。用户将使用如下 URL 来调用它:
action.php?jsonp=callback
在我的action.php中我正在做这样的事情
$jsonp = isset $_GET["jsonp"] ? $_GET["jsonp"] : false;
$output = execute_action();
if ($jsonp) {
header('Content-Type: application/javascript');
printf("%s(%s)", $jsonp, json_encode($output));
} else {
header('Content-Type: application/json');
echo json_encode($output);
}
但这对我来说似乎不安全。如果传入 jsonp 回调参数,我应该验证还是转义它吗?如果是这样,这可以防止什么情况,我应该如何在 PHP 中做到这一点?
假设这个 action.php 作为服务暴露在互联网上,供任何网站(包括我自己的网站)使用。
编辑:为了清楚起见,我的问题有两部分:
您对保护假设的第三方网站免受有害 jsonp 注入的重要性的看法
现在假设我想使用我的服务保护第 3 方站点,我应该验证 jsonp 参数(即可能只允许某些字符?),还是应该转义 jsonp 输出(如果是这样的话怎么办?php
我应该使用函数吗?)
为了让我将答案标记为已接受,我希望对这两个问题有更多的意见。
由于用户只接收他们自己发送的数据,因此不存在持久注入的真正风险。但是,攻击者仍然可以创建恶意链接并让客户端单击它,以在客户端计算机上执行代码。为了避免攻击者创建这些恶意链接(例如,这将允许从您的域窃取 cookie),您必须转义或验证回调参数。
你必须选择是只是验证它还是逃避它。在我看来,逃避并没有什么意义。通常我们会转义 HTML 实体以防止攻击并允许 HTML 字符,如 '<' or '>' 才能正确显示。但在这种情况下,没有理由honest用户会发送需要转义的字符...所以验证就足够了并且更有意义。
该怎么办 ?
如果您不想考虑注入问题,一种更安全的方法是为函数设置一个固定名称并让用户实现它。只是尽量避免名称冲突。
您还可以验证回调值。它必须是有效的 JavaScript 函数名称。您可以使用 PHP 函数preg_match()
http://de3.php.net/preg_match http://de3.php.net/preg_match.
$jsonp = preg_match('/^[$A-Z_][0-9A-Z_$]*$/', $_GET["jsonp"]) ? $_GET["jsonp"] : false;
$output = execute_action();
if ($jsonp) {
header('Content-Type: application/javascript');
printf("%s(%s)", $jsonp, json_encode($output));
} else {
header('Content-Type: application/json');
echo json_encode($output);
}
我不是正则表达式方面的专家,所以我从以下位置得到了这个不完整的示例模式验证 JavaScript 函数名称 https://stackoverflow.com/questions/2008279/validate-a-javascript-function-name。检查那里是否有正确的正则表达式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)