当前位置: 首页 > 知识库问答 >
问题:

保护AJAX调用的PHPendpoint

司凡
2023-03-14

我的应用程序由几个PHPendpoint组成,这些endpoint可以通过AJAX访问。问题是它们也可以通过向同一endpoint发出HTTP请求的任何人访问。我可以添加这个答案中指定的HTTP_X_REQUESTED_WITHHTTP_REFERER的检查,但是这些检查可以被欺骗。我可以添加一个需要与请求一起发布的密钥,但是任何查看javascript和/或控制台的人都可以看到这个密钥。这里的解决方案是什么?

共有3个答案

江嘉悦
2023-03-14

没有。如果你给某人一些数据,那么他们可以用他们喜欢的任何方式处理它。您无法控制它离开服务器后会发生什么。

同样,您无法控制它们向endpoint发送的数据。

尉迟越
2023-03-14

如果您的应用程序和api位于不同的域上,例如app.example.comapi.example.com,那么大多数答案都没有帮助-在这种情况下,会话将无法工作,您将不得不求助于OAuth,这对于这样一个简单的问题来说是一个相当大的难题。

以下是我会做的:

我假设数据库中有用户和唯一标识符,如user\u id=12345。我还假设您的作业位于数据库中,并且它们也具有唯一的ID,如job\u ID=6789

首先在app.example.com中,您可以使用诸如Blowfish这样的快速简单的方法加密两个ID:

$secret_uid = mcrypt_encrypt(MCRYPT_BLOWFISH, "your_secret", strval($user_id));
$secret_jid = mcrypt_encrypt(MCRYPT_BLOWFISH, "your_secret", strval($job_id));

我假设您的endpoint的工作方式如下:

api.example.com/jobs/delete/<job_id>/<user_id>

现在从Ajax调用该endpoint,而不是使用普通ID调用

api.example.com/jobs/delete/6789/12345

你用加密的身份证打电话给它:

api.example.com/jobs/delete/6A73D5B557C622B3/57F064C07F83644F

在软件的API端,您可以解密参数:

$jid = mcrypt_decrypt(MCRYPT_BLOWFISH, "your_secret", <param_1>);
$uid = mcrypt_decrypt(MCRYPT_BLOWFISH, "your_secret", <param_2>);

现在,您可以在数据库中搜索uidjid,并执行您计划执行的任何任务。当然,请确保用户只能删除自己的作业。

我承认这不是一个100%的解决方案,但它让攻击者有很多猜测工作——他必须猜测user_id和匹配的job_id、加密算法和你的秘密。它不能防止运行数百万次暴力尝试来猜测匹配的配对,但它会让几率对你有利(无论如何,你应该对你的endpoint有某种配额限制保护)。

祝你好运!

乐正洲
2023-03-14

人们通常认为,因为他们使用的是Ajax请求,所以常规的会话不起作用。是的。如果您有一个endpoint要从数据库中删除源代码中可见的内容,例如:

example.com/user/1/delete

您可以像在浏览器中使用非Ajax HTTP请求一样,保护此请求免受未经身份验证的用户的攻击。使用会话。如果用户具有删除用户的权限,则此路由将起作用,否则返回错误(或不执行任何操作)。

还可以使用OAuth保护API。这里有一份很好的文件解释了它是如何工作的:http://tatiyants.com/using-oauth-to-protect-internal-rest-api/

 类似资料:
  • 问题内容: 我已经编写了一些JavaScript,以便在asp.net应用程序中执行ajax调用。这会触发一个方法,该方法调用URL,并在POST中发送一些参数。 接收页面处理数据并更新我们的数据库。 我们将向客户提供此代码,以使他们能够在我们的结帐流程中为每笔交易向我们发送所需的数据。 谁能告诉我是否有办法防止对该URL的未经授权的访问?否则,不道德的开发人员可能会使用该URL将数据添加到我们的

  • 出于学习目的,我正在使用OAuth2开发一个REST API Angular 4应用程序。 有些受保护的endpoint只能由经过身份验证的用户调用。让我们以更新用户配置文件的endpoint为例: /users/{user_id} 登录用户将能够通过转到更新配置文件屏幕来更新自己的配置文件,该屏幕在后台将调用 /users/{user_id}发送带有新信息和访问令牌的有效载荷。 我们如何防止恶意

  • 工作形式如下: 这在语法上正确吗?是否需要在“.done”之前添加分号? 我使用的是CSRF保护,文件说明如下: 发送AJAX请求时,向其添加X-CSRFToken标头。例如,在JQuery中,您可以配置发送令牌的所有请求。 这一点对吗?我确实得到了HTTP 200,但没有返回JSON数据。JQuery/AJAX让我很困惑。 表格1(无CSRF的工作表格)的语法正确吗 非常感谢您的帮助,谢谢您抽出

  • 函数名称:保护模式调用 函数功能:保护执行 function 函数, function 内部发生的错误不会影响脚本运行 函数方法 bool,msg = pcall(fun,action,...) 参数 类型 必填 说明 fun function 是 待调用参数 action - 否 待传入 fun 的参数,支持多个参数 返回值 类型 说明 bool boolean true - 无错误,false

  • 问题内容: 我想对已经列出我们公司产品的本地在线商店进行API调用,然后返回其详细信息,标签,照片等的JSON。除了保护我的API密钥之外,不包括敏感信息。 如何保护我的API密钥并向另一个网站发出GET / POST请求? 问题答案: 要向访问您网站的访问者隐藏API密钥,请在您自己的网站上使用PHP脚本充当中继。它接收Ajax请求(没有API密钥);添加您的密钥并发出自己的API请求;然后将响

  • 问题内容: 想象一下下一个场景:用户想要注册到网页并填写表格。当他填写表格时,jQuery会通过正则表达式检查字段是否有效等。 将电子邮件作为用户注册后将使用的主键,需要使用Ajax来检查电子邮件字段,以使用户知道该电子邮件是否已注册。我想使用Ajax进行检查,以避免发送完整的表单并清空它,刷新页面等。 因此,当用户结束填写电子邮件字段时,Ajax请求将发送到服务器,类似于下一个链接: 当chec