php - 票务系统中的php漏洞
问题描述
我正在为某个网站建立一个票务系统,用户可以从中预订某些活动的门票。我的预订机制是这样的:
- 用户点击立即购买按钮。
- PayPal 处理付款。
- 成功结帐后,PayPal 将用户重定向到某个生成票号的“generate_ticket.php”页面。
- 用户将被重定向到显示给他们的票号的第一页。
问题出在这里:任何恶意用户都可以通过观察开发者工具中的网络点击,知道成功结账被重定向到的 url,并向该页面“generate_ticket.php”发送请求并获得免费门票。
这是我想解决这个问题的方法:
- 检查
$_SERVER['HTTP_REFERER']
引用 URL 的变量并将其与来自贝宝的 URL 进行比较。但问题是,如手册中所述。
将用户代理引向当前页面的页面地址(如果有)。这是由用户代理设置的。不是所有的用户代理都会设置这个,有些提供修改 HTTP_REFERER 作为一个特性的能力。简而言之,它不能真正被信任。
这个变量可以修改。所以,它是不可靠的,至少不是单独的。
- 当用户单击立即购买按钮时,我停止提交表单并在某个“token.php”文件中生成一个令牌,将其附加到表单,使用 PayPal 将自定义变量附加到表单中的 url 的功能,并且也将其存储在某个会话中,然后提交表单。当请求“generate_ticket.php”页面时,它会将会话中的令牌与 URL 中的令牌进行比较。但同样,任何用户都可以单击该按钮,使“token.php”文件生成令牌并将其附加到表单中。然后获取该令牌,将其附加到 url,并使用第一个漏洞请求票证。
那么,是否有人有任何解决方案来修复这些漏洞或阻止用户请求免费门票?
解决方案
Paypal 有一个称为 IPN 的功能,基本上,一旦您在 generate_ticket.php 上获取数据,您就不会直接向用户发送票证,一旦创建交易,您可能会在数据库中插入一条具有待处理状态的记录并根据贝宝的响应更新它,这里是 IPN开始发挥作用,交易完成后,贝宝将发送一个您提供为 notify_url 的发布请求,您将在其中处理向用户发送门票的脚本。
推荐阅读
- c# - 通过 Postman 发送 JSON + 文件
- javascript - 在异步函数中设置 const 状态
- javascript - 如何在 Firebase Firestore 的文档中检索和存储 doc.id?
- azure - Azure DevOps Pipeline Program 不包含适用于入口点的静态“Main”方法
- java - 如何在 Android Studio 中翻译按钮动画?
- geospatial - Geopandas geom_almost_equals 方法给出错误的输出
- java - 如何减小 Jar 文件的大小以进行更新或更新 Jar 文件的最佳方法是什么
- amazon-web-services - 让 EMR 集群在终止时终止其 EC2 实例
- erlang - config.exs 中 include_erts 的多个路径
- python - 加载 spacy 时出错 - 'en_core_web_sm' 库