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

2024-02-16

我有一个名为 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. 您对保护假设的第三方网站免受有害 jsonp 注入的重要性的看法

  2. 现在假设我想使用我的服务保护第 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(使用前将#替换为@)

是否需要验证或转义jsonp回调字符串 的相关文章

  • 通过 __get() 通过引用返回 null

    快速规格 PHP 5 3 error reporting 1 the highest 我正在使用 get 通过引用技巧神奇地访问对象中任意深度的数组元素 快速示例 public function get key return isset t
  • Play Framework 2.3 (Scala) 中的自定义 JSON 验证约束

    我设法使用自定义约束实现表单验证 但现在我想对 JSON 数据执行相同的操作 如何将自定义验证规则应用于 JSON 解析器 示例 客户端的 POST 请求包含用户名 username 我不仅要确保该参数是非空文本 而且还要确保该用户确实存在
  • PHP 开发相当于 Mongrel/Webrick 吗?

    PHP 开发中是否有与 Rails 开发期间使用 Mongrel Webrick 等效的方法 我通常在端口 3000 上使用 Mongrel 在开发过程中为我的 Rails 应用程序提供服务 我从事 PHP 开发已经有几年了 据我所知 方法
  • 如何将 HTML 转换为 Markdown?

    我有一个类似 stackoverflow 的网站 有一个文本区域 人们可以在其中写答案 我用这个 PHP 库 http parsedown org 转换降价 我的意思是我使用该函数来转换 italic to i italic i inclu
  • 如何通过php的require()或include()函数传递变量?

    当我使用这个时 require diggstyle code php page page no 警告是 无法打开流 第 198 行 C xampp htdocs 4ajax gallery core php 中没有错误 错误是 Failed
  • 将 Google 信任徽章添加到 Magento

    我正在尝试将 Google Trust Badge 添加到我的 magento 商店 我尝试在 Magento 网站上搜索扩展程序 但找不到 我是否需要将以下代码粘贴到产品和结账页面 还是必须对其进行更改 如果有人能引导我走向正确的方向 我
  • Instagram 粉丝计数 - 使用 jQuery / json 和 PHP

    经过几个小时的工作和一些帮助萨希尔 米塔尔我们已经成功使用 jQuery json 和 PHP 检索 Instagram 关注者计数 这是我们设法整理的内容 希望对其他想要获取 Instagram 信息的人有所帮助 我们的 jQuery I
  • Laravel 5 中的自定义验证器

    我正在将 Laravel 应用程序从 4 升级到 5 但是 我有一个自定义验证器 但无法运行 在L4中 我做了一个验证器 php文件并将其包含在全局 php using require app path validators php 我尝试
  • WordPress 分页自定义帖子类型

    我有一个名为 新闻 的页面 使用页面模板page newslist php 它应该显示来自自定义帖子类型 也称为新闻 的帖子 我意识到两者具有相同的名称会导致问题 因此在注册自定义帖子类型时 我进行了重写以将其与页面区分开来 rewrite
  • 使用 XSLT 将 XML 转换为 SQL

    由于我无法控制的原因 我将获得一个 XML 文件和一个 XSLT 文件 该文件可以将 XML 文件转换为 SQL 代码或错误 现在让我们假设我们可以信任提供 XML 文件的人不会在 XML 中包含危险的构造 我什至不知道是否应该使用 Sim
  • 使用 JSON 参数的 Postgres 批量 INSERT 函数

    这是一个plpgsqlpostgres 的函数9 6 它试图INSERT一行 如果插入没有失败 由于违反键约束 那么它会运行更多命令 CREATE FUNCTION foo int text text RETURNS void AS BEG
  • apache_request_headers() 与 $_SERVER

    据我所知 apache request headers 提供与以下相同的信息 SERVER 但按键略有不同 为什么有人应该使用apache request headers 而不仅仅是从那里获取这些信息 SERVER 我在 Centos 上使
  • Joomla 页面中的自定义 php 代码

    我正在尝试将 Joomla 1 5 9 页面中的表源从页面中的硬编码 html 更改为从 SQL 数据库获取信息 执行此操作的正确方法是什么 创建一个新的模型或组件并以某种方式在页面中使用它 我找到了这些 http docs joomla
  • WordPress 插件中的类自动加载器

    我想编写一个类自动加载器以在 WordPress 插件中使用 该插件将安装在多个站点上 我想尽量减少与其他插件发生冲突的机会 自动加载器将是这样的 function autoload name some code here 我的主要问题是
  • suhosin.mt_srand.ignore 在 PHP 中一致洗牌数组的解决方法?

    我有一个 PHP 脚本 需要随机化一个具有一致结果的数组 这样它就可以向用户呈现前几个项目 然后如果他们愿意 他们可以从同一个打乱的集合中提取更多结果 我目前使用的是这个 基于我相信的 Fisher Yates 算法 function sh
  • 从数据库填充复选框

    我有两个表 第一个由与名称关联的 id 组成 1 汽车 2 火车 3 普通 ETC 第二个表由两个字段 user id 和第一个表中的 id 组成 例如 1 1 2 1 3 当用户转到该页面时 我试图重新填充选定的复选框 首先 您查询数据库
  • URL 中的 %2F 中断并且未引用所需的 .php 文件 [重复]

    这个问题在这里已经有答案了 我需要将 作为变量作为 URL 的一部分传递 我的结构如下所示 www domain com listings page 1 city Burnaby South type Townhome bedroom 2
  • 保存多对多关系,同步/附加不存在?

    我有以下两个多对多关系的模型 use Illuminate Database Eloquent Model class Permission extends Model The database table used by the mode
  • php curl 使用 GET 发送变量 奇怪的结果

    我正在尝试调用远程站点上页面中的网址 决定使用curl 在远程站点上 url 变量显示为 REQUEST Array var1 gt val1 amp var2 gt val2 amp var3 gt val3 被调用的url是 http
  • 使用 php-ews(Exchange Web 服务)在特定日期后获取电子邮件

    在我的 PHP 脚本中 我需要弄清楚如何检索指定消息 ID 之后或特定日期之后的所有电子邮件 两者都可以 我只需要检索自上次抓取收件箱以来的新电子邮件 这个收件箱每天收到数千封电子邮件 而且我在 30 天内无法删除任何电子邮件 对于初始导入

随机推荐

  • 在活动目录中,mailNickname 有何用途?

    在 Active Directory 中 mailNickname 是否应始终等于 samaccountname 或者 它应该始终等于邮件属性 减去 domain 我询问的原因是 我们最近将每个人的主要电子邮件地址更改为first last
  • DeviceContext (HDC) 中的 Alpha 通道

    请帮助我处理 HDC 中的 alpha 通道 我让 HDC dc 抛出 CreateCompatibleDC 然后调用 CreateDIBSection 并可以在内存中找到图像字节 然后调用 DrawFrameControl 到此 dc 一
  • Heroku:SSL 未启用

    所以我的 Rails 3 2 1 应用程序在 Heroku 上运行良好 然后我设置config force ssl true在我的生产配置文件中 打开文件后 我现在收到 SSL 未启用 错误 我以为 Heroku 允许你附带他们的 SSL
  • Powershell 字节数组到 INT

    我有一个包含两个值的字节数组 07 and DE 十六进制 我需要做的是以某种方式连接07DE并从该十六进制值获取十进制值 在这种情况下 它是2014 My code This line gives 11 bytes worth of in
  • 如何使用 Raphael.js 旋转 div?

    我是 Raphael 的新手 我真的很困惑 我想使用 Raphael 的按钮来旋转 div 及其内容 理想情况下 我希望有一个平滑的动画 当单击按钮时 动画从 0 度到 90 度 然后当再次单击按钮时 动画将反转 我想我会更改鼠标单击时的
  • 使用 jQuery 的延迟链接 ajax 请求

    我有一个网络应用程序必须多次调用服务器 到目前为止 我有一个很长的嵌套回调链 但我想使用 jQuerywhen then等功能 但是 使用后我似乎无法让东西再次运行then when get pages run tool html then
  • Objective-C 中的“超级”是什么? (自我!=超级)?

    我已阅读下面的问题和故事SEEMS simple Objective C 中的 super 到底是什么 https stackoverflow com questions 3095360 what exactly is super in o
  • 在存储过程中创建临时表

    我正在为 MySQL 编写第一个存储过程 存储过程需要创建一个临时表 然后向其中插入一些数据 如果我在存储过程之外手动创建一个普通表 那么存储过程不会创建临时表 存储过程将被创建并完全按照我的要求执行 如果我随后将创建临时表添加到存储过程中
  • Java 和 C# 正则表达式兼容吗?

    这两种语言都声称使用 Perl 风格的正则表达式 如果我用一种语言测试正则表达式的有效性 它在另一种语言中是否有效 正则表达式语法有何不同 这里的用例是一个 C NET UI 与最终的 Java 后端实现对话 该实现将使用正则表达式来匹配数
  • symfony2 按属性对对象集合进行排序

    我有这个实体 class Categoria ORM Id ORM Column type integer ORM GeneratedValue protected id ORM Column type string length 100
  • 尝试在空对象引用上调用虚拟方法“void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)”

    问题如下 我有一个登录活动 在 Android Studio 中 几天前运行良好 我不记得更改过任何内容 但是当我上次运行此应用程序时 应用程序在我单击登录按钮后立即关闭 最后一件事是关于 AsyncTask 预执行的祝酒 我不明白为什么会
  • 使用 google Oauth 2.0 进行身份验证与注册的重定向 URI 不匹配

    我正在尝试使用进行身份验证谷歌 OAuth 2 0 我在中注册了我的网址谷歌云控制台 在谷歌的规格中OAuth 2 0它说 redirect uri 确定响应发送到的位置 该参数的值必须与注册的值之一完全匹配谷歌云控制台 包括 http 或
  • 使用与主用户名不同的 RDS 代理用户连接被拒绝

    我正在尝试设置 RDS 代理来为我的应用程序提供 mysql 数据库服务 大多数应用程序运行时使用的用户名和密码等于 RDS 数据库上设置的主用户名 该用户名和密码具有所有权限 我尝试使用与主用户名不同的用户名和密码访问我的 RDS 实例
  • 如何消除这个错误? java.lang.reflect.InitationTargetException [重复]

    这个问题在这里已经有答案了 我添加了所有需要的权限 PackageManager packageManager context getPackageManager Class
  • @事务和继承

    我曾经添加过 Transactional所有 Spring 服务 类 的注释 然后我想 如果事务行为应该相同 我真的必须这样做吗 当然 如果不应该的话 我们会添加 Transational以及方法的其他参数 我试图找到一些关于继承的有用信息
  • 如何使用 Xunit 2.0 动态跳过测试?

    Xunit 1 9 x 为用户提供了DynamicSkipExample cs https github com xunit xunit blob v1 samples AssertExamples DynamicSkipExample c
  • 如何获取 SLURM 作业所用脚本的原始位置?

    我正在使用脚本启动 SLURM 作业 并且脚本必须根据其在脚本本身内部获取的位置来工作SCRIPT LOCATION realpath 0 但 SLURM 将脚本复制到slurmd文件夹并从那里开始工作 这会搞砸进一步的操作 在移动 复制之
  • 桌面上方的浮动图标

    我正在编写一个 C 应用程序 我希望它在桌面上有一个浮动图标 就像移动设备中的 Facebook Messenger 我一直在互联网上搜索但找不到任何有用的东西 有文章吗 有想法吗 您需要创建一个没有标题栏和边框的表单 并使用图像作为表单的
  • OpenCV中概率霍夫变换的具体实现是什么?

    有谁知道 OpenCV 实现中概率霍夫变换的特定算法吗 我的意思是 有关于该算法的参考论文或文档吗 为了得到这个想法 我当然可以查看源代码 但我想知道是否有任何关于它的文档 它不在源代码的注释中 OpenCV 1 0 谢谢你 Jin Ope
  • 是否需要验证或转义jsonp回调字符串

    我有一个名为 action php 的文件 它将执行一些操作 我想将其公开为纯 JSON 或 JSONP 输出 用户将使用如下 URL 来调用它 action php jsonp callback 在我的action php中我正在做这样的