【问题标题】:PHP and MySQL $_POST Security and md5() hash functionPHP 和 MySQL $_POST 安全性和 md5() 哈希函数
【发布时间】:2012-01-31 01:51:50
【问题描述】:

我正在创建一个处理财务信息、联系人等的信息系统。我正在使用面向对象的编程(类、函数等)从头开始开发网站。大部分数据将来自 MySQL 数据库。用户将能够获取数据并将其提交到数据库。

我已经在使用散列函数来加密密码、序列号等数据。我还对进入数据库的所有其他数据使用 preg_replace() 函数。

我还需要采取哪些其他安全措施来确保从数据库提交和获取数据不会危及安全性?

【问题讨论】:

  • 请告诉我网站的名称,这样我就可以避开它。谢谢。
  • 您是否担心数据库内部或传输过程中数据的安全性?
  • hash 不是加密的,preg_replace 是什么?为什么?

标签: php mysql security md5


【解决方案1】:

md5 是一个 cryptographic hash function。一旦散列,它就不能“取消散列”回原始值(单向),而不是encryption,后者是双向(加密-解密)。

为了您的数据安全,请考虑以下场景和预防方法,而不仅仅是加密:

  • cross-site request forgeries (CRSF) - 防止使用表单令牌

  • SSL connection(“httpS://”)防止传输中的数据拦截

  • hash salting 进一步保护(但不完全)散列密码免受字典攻击。在这种情况下,弱密码和普通密码是目标。

  • 散列不是绝对的。哈希中的字母和数字组合的数量是有限制的。在某些时候,极其不同的字符串可能具有相同的哈希值。这被称为collision

  • 哈希很容易受到暴力/字典攻击。虽然散列是一种方法,但可以创建一个字符串散列字典,匹配散列并找出它背后的字符串。

  • cross-site scripting (XSS) 包括(但不限于)cookie 窃取、点击劫持等。

  • SQL injection - 表单未经处理时欺骗 SQL 的方法

  • 可消耗的 session ids 跟踪用户会话 - 应该在给定的时间内过期,因此有自动注销机制。

  • 识别您的用户!用户 IP 地址、浏览器检测等来分析您的用户。任何奇怪的数据(如 IP、位置等的突然变化)都应在一定的阈值内考虑。 (facebook 有这个功能。我曾经使用代理访问过我的 facebook - 自动锁定)

【讨论】:

  • 我喜欢这个建议,我会在我得到的第一个更改时查看它。
  • 这不是一个完整的列表。这只是常见的。
  • MD5 不是加密。您无法保证您拥有的哈希值是从您存储的值生成的,否则它将是一个很棒的压缩算法。
  • “散列加盐以进一步加密散列密码并避免冲突”——首先,加盐不会加密任何东西。其次,它不能避免碰撞;当您将无限量的输入值映射到无限量的哈希值时,您将不可避免地发生冲突。
  • @Gumbo 我会改变的。感谢您指出这些事情。密码学(和数学)并不是我的强项
【解决方案2】:

preg_replace() 在安全方面不会做太多事情。在进行这项工作之前,您应该熟悉一些基本的安全/加密。此外,请考虑使用标准加密库来加密/解密数据,而不是随意使用散列或正则表达式函数。

看看这个:http://php.net/manual/en/book.openssl.php

【讨论】:

    【解决方案3】:

    第一:有利于您关注安全问题。这是一个很大的话题,很多人都忽略了,直到为时已晚。因此,感谢您寻求对最佳实践的更多了解。 :-)

    OWASP 是了解网络安全问题的好资源。

    另一个很好的资源是 SANS 报告The Top Cyber Security Risks

    具体来说,Cross-Site Scripting (XSS)SQL Injection 是大多数网站的两大安全风险。您应该阅读有关如何设计代码以最大程度降低这些风险的信息。

    我还设计了一个演示文稿SQL Injection Myths and Fallacies,深入探讨了这个问题的本质和防御方法。

    阅读 StackOverflow 创始人 Jeff Atwood 的博客 You're Probably Storing Passwords Incorrectly

    我还在我的书 SQL Antipatterns: Avoiding the Pitfalls of Database Programming 中介绍了 SQL 注入和密码哈希。

    【讨论】:

      【解决方案4】:

      如果您使用 md5 来保护财务信息,希望您有良好的责任保险。阅读md5,http://en.wikipedia.org/wiki/MD5,密切关注行

      MD5 哈希函数的安全性受到严重威胁。

      【讨论】:

      • 我喜欢上一个用户对SHA1的建议。你认为最好的加密算法是什么?
      • md5 或 sha1 都不是“加密算法”,在做任何与安​​全相关的事情之前,您应该明白这一点
      【解决方案5】:

      你做错了,因为:

      • md5 被认为是损坏的,
      • preg_replace() 不会给你太多。

      考虑为您的系统使用已经开发、测试和安全的框架(候选者包括 Zend Framework、Symphony、Kohana、Yii)。在实现至少与标准框架一样好的安全性之前,您还有很长的路要走。如果您仍然想重新发明轮子,还可以考虑使用准备好的语句而不是 preg_replace() 和 salted sha1 而不是简单的 md5。

      此外:

      • 保护您的应用免受 XSS、CSRF 等首字母缩略词的影响
      • 始终需要 SSL(对于每个请求,甚至对于图像/样式/脚本),
      • 阅读安全通讯(如果您想为金融活动构建安全系统,您将需要它们)。

      【讨论】:

      • 为什么 md5 被认为是损坏的。我使用它的唯一目的是存储密码。我认为它是一个很棒的加密工具。
      • 我阅读了第一个答案并理解您选择 md5 背后的原因
      • 从哪里可以获得更多关于 SHA1 算法或函数的信息?
      • @KevinOluseunKarimu:它被破坏了,因为已经发现一种比暴力攻击更短的方法能够逆转它。而且它绝对不是加密工具,它是一种哈希算法。散列算法意味着尽可能单向。 MD5 未能满足该要求。即使是简单的消息脚本也停止在新代码中使用 MD5,尤其是在没有盐的情况下,尤其是密码存储。清楚吗?为什么要投反对票?
      • @KevinOluseunKarimu:例如在 Wikipedia 上(抱歉,我是用手机写的,发现更多信息真的就像在 Wikipedia/Google 上搜索一样简单)。在 PHP 函数中,使用 SHA-1 的哈希值被称为...sha1().
      【解决方案6】:

      正如其他人指出的那样,md5 已损坏。此外,SHA1 散列的计算速度非常快,这实际上使得它作为散列算法更糟。相反,看看 bcrypt。假设您使用的是 PHP,http://www.openwall.com/phpass/ 是一个非常好的密码,可以透明地为您处理散列和加盐。

      使用 preg_replace() 将数据转义到数据库是一个非常糟糕的主意。几乎所有的数据库都包含自己的清理函数,PHP/MySQL 也不例外,mysql_real_escape_string()。

      还有一些要点(请注意,这些都不是一成不变的):

      清理所有输入 假设用户发送到您的服务器的所有内容都旨在造成伤害。这包括表单提交,还包括 URL 路由、cookie 值、服务器变量等所有内容。使用框架通常会为此提供一些隔离,自动为您转义大量数据。

      转义所有输出 假设您在网站上显示的所有内容都旨在造成伤害。 XSSCSRF 是最常见的网站攻击技术。转义您输出到浏览器的所有文本。研究使用 nonce 来减轻攻击。

      使用 TLS/SSL 如果您想在途中保护您的用户数据,请为自己获取一个签名的 SSL 证书并进行设置。这使访问者可以安全地访问https://yoursite.com(或者,如果他们是那种在咖啡店 wifi 上进行网上银行业务的人,至少更安全)。

      使用框架 每个人都从编写自己的框架开始,因为他们知道如何正确地做,或者不需要额外的复杂性或他们想出的任何原因。除非您正在编写 PHP 可能不是正确答案的超级特定利基应用程序,否则请使用框架。我更喜欢http://kohanaframework.org/,但从http://codeigniter.com/http://framework.zend.com/ 的范围很广。框架会为您处理会话加密、数据库转义、输入清理等,而且由于它们被许多人使用,因此出现错误的机会比只有一个人编写的代码要少得多。

      保护您的基础架构 大多数人倾向于使用这个,但请确保您花一些时间查看您正在运行的服务器。你是共享账户吗?你不想在他们身上存储财务信息(在某些国家,这甚至是非法的)。为您的操作系统/软件应用安全补丁,确保您没有留下旧的上传脚本,检查您的文件权限,使用带有密钥的 SSH 并关闭密码登录。攻击者总是在寻找最简单的方法。

      在一天结束时,保持安全的唯一方法就是睁着一只眼睛睡觉,完全偏执。查看您的日志,安装 Nagios 并设置一些警报,聘请专业人员进行安全审计。没有所谓的 100% 安全,但知道这是成功的一半。

      【讨论】:

        【解决方案7】:

        我是一位经验丰富的 PHP 开发人员,我想建议您看看这个项目 OWASP_Development_Guide。每个 Web 开发人员都应该将其用作圣经。它对我很有用,希望对你也一样。

        这里是对文档的简要说明:

        开发指南提供实用指导,包括 J2EE、ASP.NET 和 PHP 代码示例。开发指南涵盖了广泛的应用程序级安全问题,从 SQL 注入到网络钓鱼、信用卡处理、会话固定、跨站点请求伪造、合规性和隐私问题等现代问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-07-07
          • 2012-03-09
          • 2018-04-09
          • 2012-05-28
          • 1970-01-01
          • 2012-01-21
          • 2010-09-28
          相关资源
          最近更新 更多