gpt4 book ai didi

php - 是否需要验证或转义 jsonp 回调字符串

转载 作者:可可西里 更新时间:2023-11-01 00:32:44 25 4
gpt4 key购买 nike

我有一个名为 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 作为任何网站(包括我自己的网站)使用的服务暴露在互联网上。

编辑:为清楚起见,我的问题分为两部分:

  1. 您对保护假设的第 3 方网站免受有害 jsonp 注入(inject)的重要性的看法

  2. 现在假设我想使用我的服务保护第 3 方网站,我应该验证 jsonp 参数(即可能只允许某些字符?),还是应该转义 jsonp 输出(如果是这样,php 我应该使用什么功能?)

为了将答案标记为已接受,我想就这两个问题提供更多意见。

最佳答案

  • 由于用户只接收他们自己发送的数据,因此不存在持久注入(inject)的真正风险。然而,攻击者仍然可以创建恶意链接并让客户端点击它,从而在客户端机器上执行代码。为避免攻击者创建这些恶意链接(例如允许从您的域中窃取 cookie)的可能性,您必须转义或验证回调参数。

  • 您必须选择是只验证它还是转义它。在我看来,逃避没有真正的意义。通常我们转义 HTML 实体以防止攻击并允许 HTML 字符如 '<' '>' 正确显示。但在这种情况下,诚实用户没有理由发送需要转义的字符……所以验证就足够了,而且更有意义。

怎么办?

如果您不想考虑注入(inject)问题,一个更安全的方法是为函数设置一个固定名称并让用户实现它。尽量避免名称冲突。

您还可以验证回调值。它必须是有效的 javascript 函数名称。您可以使用 PHP 函数 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);
}

我不是正则表达式方面的专家,所以我从 Validate a JavaScript function name 得到了这个不完整的示例模式.在那里检查正确的正则表达式。

关于php - 是否需要验证或转义 jsonp 回调字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20958218/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com