0

考虑一个简单的例子:

  1. 登录您的 Facebook 帐户
  2. 发布状态
  3. 单击状态下拉菜单(右上角)
  4. 在浏览器中打开开发者工具,找到“删除”选项的 html
  5. 编辑一个看起来像的参数 story_fbid=10202782137141336

由于墙由几个状态和帖子组成,每个状态都有不同的story_fbid值,facebook应该使用这些值来更新/删除相应的帖子。然而,即使改变这个值(story_fbid)的一个数字也可以说story_fbid=10202782137141337会引发错误如下面的快照所示。

FB错误截图链接

我是 php 编程的初学者,很想知道服务器端数据验证是如何在 php 中完成的...

因此,我一直在寻找有关如何在服务器端检测到客户端更改的 html 的基本解释。

我在这里遇到了一个类似的问题。根据其中一个答案,一种可能的方法是服务器使用与特定帖子的 ID 关联的 UUID。如果此 UUID 在客户端被操作,服务器会检测到这一点,并且不会对该 ID 执行请求的操作(如数据库记录更新/删除)。但由于一个页面可以包含多个具有不同 ID 的此类帖子,因此不能可能有一个与它们中的每一个相关联的 UUID。

所以。facebook 使用什么方法来检测这种变化?

4

1 回答 1

0

免责声明- 我完全不知道 Facebook 方面进行了哪些验证 - 这篇文章仅包含有根据的猜测和一般的网络安全概念。

用户提交的任何数据都应被视为已被篡改

我认为这是一个很好的座右铭。您在喜欢/评论/删除帖子时发送给 Facebook 的数据仅由提交请求的用户生成的数据组成。无论该数据是由 Facebook 页面上已有的 JavaScript 生成,还是由 cURL 命令生成,甚至是由用户手动编译,都对 Facebook 服务器响应该请求没有任何影响。

由于无法在数据到达 Facebook 服务器之前对其进行验证,因此所有数据都应被视为“可能被操纵/有害”。出于这个原因,可以安全地假设向 Facebook 服务器发出的每个请求都通过了多个级别的验证:

  1. 这个请求有效吗?请求是否与预期格式有关?有效端点?有效参数?有效的论据?
  2. 请求的另一端是否有有效用户?他们是否使用有效access_token或类似的参数?
  3. 是否允许该用户提出此请求?对象是否归用户所有?用户是否具有发出此请求所需的权限?
  4. ETC...
  5. ETC...
  6. ETC...
  7. 还有很多等等...
  8. 可能还有更多的验证...

如果这些(假定的)验证中的任何一个失败,则会向用户返回一条错误消息。为了对确切的验证保密,Facebook 可能选择向用户返回一般错误,以免他们确切知道执行了哪些验证。

如果用户要确切知道执行了哪些验证,绕过它们可能不会太难 - 因此,如您所见,您收到的错误提到了一系列可能的问题:

  • “现在无法显示” - 最通用的解释。
  • “暂时不可用” - 嗯?像硬盘坏了?停电?数据中心的互联网宕机了?
  • “链接...已过期” - 可能操纵访问令牌?
  • “没有权限”

不可能确切地知道 Facebook 那边发生了什么——这就是他们的意图。


以类似的方式,给出类似于“用户名密码无效”的登录错误的站点不会向用户提供任何关于哪个参数无效的指示。它可以是用户名,也可以是密码。说只有密码无效暗示提供的用户名实际上有效的,这可能是网站不想共享的信息。

于 2014-08-30T20:34:11.407 回答