【问题标题】:Does HTTPS make POST data encrypted?HTTPS 是否使 POST 数据加密?
【发布时间】:2018-01-11 01:55:45
【问题描述】:

我是编程领域的新手,我已经对使用 HTML-AJAX-PHP-MySQL 的基本 CRUD 类型的 Web 应用程序有了足够的了解。我一直在学习编码作为一种爱好,因此只使用了 WAMP/XAMP 设置(本地主机)。我现在想冒险使用 VPS 并学习设置它并最终打开一个新项目供公众使用。

我注意到,每当我使用 AJAX 甚至常规 POST 将表单数据发送到我的 PHP 文件时,如果我打开 Chrome 调试器并转到“网络”,我可以看到正在发送的数据,以及发送到哪个后端将数据发送到的 PHP 文件。

如果用户可以看到这一点,他们是否可以截取这些数据,对其进行修改,并将其发送到同一个后端 PHP 文件?如果他们创建自己的简单 HTML 页面并将 POST 数据发送到我的 PHP 后端文件,它会工作吗?

如果是这样,我该如何避免这种情况?我一直在阅读有关使用 HTTPS 的信息,但我仍然感到困惑。使用 HTTPS 是否意味着我必须以任何方式更改我的代码?

【问题讨论】:

  • 请求/响应被加密传输。两边都被解密了。
  • 这一切是自动完成的还是我需要修改我的代码?

标签: php mysql forms post https


【解决方案1】:

浏览器显然会知道它正在发送什么数据,并将在调试器中显示它。 HTTPS 对传输中的数据进行加密,远程服务器将在收到后对其进行解密;即,它可以防止中间的任何第 3 方能够读取或操作数据。

这可能会让您感到震惊(或者可能不会),但与您的服务器的通信完全通过 HTTP(S) 进行。那是一个简单的文本协议。任何人都可以随时随地向您的服务器发送任意 HTTP 请求。 HTTPS 加密与否。如果您担心有人操纵通过浏览器调试器工具发送的数据……您的担心完全是错误的。有许多更简单的方法可以将任意精心制作的 HTTP 请求发送到您的服务器,甚至无需访问您的站点。

您的服务器只能依赖于它接收到的数据,并且必须根据自身的优点严格验证给定的数据。试图以任何方式锁定客户端都是徒劳的。

【讨论】:

  • 谢谢。假设我想从数据库中删除一个用户,在 POST 数据中我发送用户名 (u:20),然后我的 MySQL 查询是DELETE FROM WHERE id=?(参数化查询)。那么有人可以向后端发送一个随机用户标识吗?我不能在这里使用 SESSIONS,因为该页面是管理员正在删除用户的页面。
  • 是的,任何人都可以删除任何人。您需要某种形式的身份验证,尤其是对于功能强大的管理页面。会话是执行此操作的典型方式。为什么管理员不可能做到这一点?
  • 我正在选择要从<select> 输入中删除的用户,然后通过 POST 发送用户的 ID。如果我让我的用户使用SELECT * FROM USERS,我可以如何以及在哪里使用会话?当管理员登录时,它将他/她的用户 ID 存储在 Session 中,所以我不确定如何使用 Sessions 引用另一个用户的 ID。
  • 您使用会话来确保管理员已登录,并在有人试图删除某人时验证管理员已登录。您不需要在会话中存储要删除的用户 ID,这在这里没有什么意义。听起来你已经在做正确的事情了。
  • 太棒了!我非常感谢您在回答我的问题时的时间和耐心。我现在对这一切有了更好的理解。非常感谢。
【解决方案2】:

这比那更简单。 无论您是使用 GET 还是 POST 来传输参数,HTTP 请求都会由用户的客户端发送到您的服务器,无论是 Web 浏览器、telnet 还是其他任何东西。用户可以知道这些 POST 参数是什么,因为是用户发送它们 - 无论用户个人参与该过程。

您从错误的角度解决问题。 编程最重要的规则之一是: 永远不要相信用户条目是编程的基本规则!用户可以并且犯错误,其中一些人试图伤害你或窃取从你那里。 欢迎加入俱乐部。

因此,如果您收到的 POST 或 GET 参数不是您所期望的,无论是错误的还是恶意的,您都不能允许您的代码执行任何可能以任何方式损害您的操作。如果您的代码(按照其设计方式)仅通过向您的一个页面发送特定的 POST 值就使您容易受到伤害,那么您的设计有问题,您应该考虑到这个问题重做它。

这个问题是设计程序时的主要问题,您会发现大量有关如何防止代码对您不利的文档、教程和提示。

别担心,这不是那么难以处理,而且你自己提出这个问题的事实表明你在解决问题方面的能力以及你对生产的投入程度好的代码,你没有理由失败。

如果您在进行安全更新时遇到特定问题,请随时发布另一个问题。

【讨论】:

  • 感谢您的解释!我首先将数据直接插入数据库,然后我阅读了 SQL 注入并学习了如何使用参数化查询。在这里,我检查数据是否是我期望的类型,然后将其添加到数据库中。还有什么我应该做的吗?
  • @Bruno 您必须自动转义可能包含在参数中的任何字符,以便从内部劫持您的 SQL 查询,或者如果这是您所期望的(那么更简单)将它们转换为整数。但目前的最佳做法是使用参数化查询(理想情况下使用 PDO),因为转义是即时包含的。
  • 我目前正在这样做,以及使用参数化查询。请参阅我对deceze 答案的评论。
  • 我敢打赌 deceze 能够在这方面为您提供指导;)
【解决方案3】:

每个人都可以向您的应用程序发送他们想要的任何内容。 HTTPS 只是意味着他们无法看到和操纵其他人发送到您的应用程序的内容。但是您总是必须假设发送到您的应用程序的内容是 POST、GET、COOKIE 或任何邪恶的东西。

【讨论】:

    【解决方案4】:

    HTTPS 会在传输过程中加密,因此不会解决此问题。

    您不能信任任何客户端。通过网络表单发送的任何数据都可以设置为客户想要的任何内容。他们甚至不必拦截它。他们可以只修改页面上的 HTML。

    没有办法解决这个问题。您可以而且应该进行客户端验证。但是,由于这通常只是 JavaScript,因此可以修改/禁用它。

    因此,您必须在收到数据时验证所有数据服务器端。数字应该是数字,去掉任何反斜杠或无效的特殊字符等。

    【讨论】:

      【解决方案5】:

      在 HTTPS 中,TLS 通道是先建立的,然后传输 HTTP 数据,所以从这个角度来看,GET 和 POST 请求没有区别。

      【讨论】:

        【解决方案6】:

        它是加密的,但这只是为了防止中间人攻击。

        你的 php 后端不知道它收到的数据来自哪里,这就是为什么你必须假设它收到的任何数据都直接来自黑客。

        由于您无法防止发送令人讨厌的数据,因此您必须确保安全地处理所有收到的数据。需要采取的一些步骤包括确保上传的任何文件都无法执行(即,如果有人上传 php 文件而不是图像),确保收到的数据永远不会直接与数据库交互(即https://xkcd.com/327/),并确保你不要'不要仅仅因为某人说他们以用户身份登录就信任他们。

        为了进一步保护您对收到的帖子数据所做的任何事情进行一些研究,并查找最佳实践。

        【讨论】:

        • 感谢您的回答。有没有办法在后端 PHP 文件中验证数据来自哪里?
        • @Bruno 有几种方法,例如IP 地址,但发件人可以对此撒谎。
        • @Bruno 您可以将令牌与表单一起发送,然后检查是否与发布数据一起返回了正确的令牌。
        • 如果我理解正确,如果我将所述令牌与表单一起发送,那么令牌数据也是可见的,所以不受欢迎的人不能也发送该令牌吗?
        • 这个想法是为每个表单生成一个新令牌,该令牌只能使用一次并在给定时间后过期。您可以使用 PHP 会话而不是令牌。无论如何,接收 cookie/令牌的人仍然可以发送他们想要的任何数据。
        猜你喜欢
        • 1970-01-01
        • 2011-05-07
        • 1970-01-01
        • 2015-11-27
        • 2010-09-16
        • 2013-09-12
        • 2019-01-15
        • 1970-01-01
        相关资源
        最近更新 更多