PHP和MySQL $ _POST安全性和md5()哈希函数

时间:2012-01-31 01:51:50

标签: php mysql security md5

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

我已经使用哈希函数来加密密码,串行密钥等数据。我也使用preg_replace()函数来进入数据库的所有其他数据。

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

7 个答案:

答案 0 :(得分:3)

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有此功能。我曾使用代理访问我的脸书 - 自动锁定)

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

  

MD5哈希函数的安全性受到严重影响。

答案 3 :(得分:1)

首先:关注安全问题对你有好处。这是一个很大的主题,很多人都会忽视它,直到为时已晚。所以,感谢您寻求更好地了解最佳实践。 : - )

OWASP是理解网络安全问题的理想资源。

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

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

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

阅读StackOverflow创始人杰夫阿特伍德的博客You're Probably Storing Passwords Incorrectly

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

答案 4 :(得分:0)

你做错了,因为:

  • md5被视为已损坏,
  • preg_replace()不会给你太多。

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

此外:

  • 保护您的应用免受XSS,CSRF,
  • 等缩略语的影响
  • 始终要求SSL(对于每个请求,甚至是图像/样式/脚本),
  • 阅读安全新闻简报(如果您想为财务活动建立安全系统,则需要它们。)

答案 5 :(得分:0)

正如其他人所指出的那样,md5已被打破。此外,SHA1哈希的计算速度非常快,实际上使其作为哈希算法更差。而是看看bcrypt。假设您正在使用PHP,http://www.openwall.com/phpass/是一个非常好的密码,可以透明地处理哈希和盐析。

使用preg_replace()将数据转发到数据库是一个非常糟糕的主意。几乎所有数据库都包含自己的清理功能,PHP / MySQL也不例外,它们与mysql_real_escape_string()完全相同。

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

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

逃避所有输出 假设您在网站上显示的所有内容都旨在造成伤害。 XSS CSRF 是攻击网站最常用的技术之一。转义输出到浏览器的所有文本。考虑使用nonce来减轻攻击。

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

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

保护您的基础架构 大多数人都会选择这种方式,但请确保您花一些时间查看您正在运行的服务器。你在共享帐户吗?您不希望在其上存储财务信息(在某些国家/地区甚至也是非法的)。为您的操作系统/软件应用安全补丁,确保您没有留下旧的上传脚本,检查您的文件权限,使用SSH键和关闭密码登录。攻击者总是在寻找最简单的方法。

在一天结束时,保持安全的唯一方法是单眼睡觉,完全偏执。观察您的日志,安装Nagios并设置一些警报,聘请专业人员进行安全审核。没有100%安全的东西,但知道这是成功的一半。

答案 6 :(得分:0)

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

这里是该文件的简要说明:

  

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