我正在开发一个将使用PHP&MySQL。应用程序将处理机密数据。我需要让它尽可能安全。
我不希望应用程序用来连接数据库的MySQL用户的密码以明文格式写在PHP文件中(例如根帐户)。
正因为如此,我用存储过程制作了伪MySQL角色系统。用户将使用MySQL用户名和密码登录到应用程序。他们将只具有执行MySQL存储过程的权限,而不具有对存储过程内部使用的表的SELECT、INSERT、UPDATE和DELETE权限。存储过程的定义将是根帐户。
我有一个问题。也就是说:我不想在会话中以明文格式存储登录表单数据(examore的密码)。我无法使用会话将mysql连接资源对象从一个页面转移到另一个页面。
我现在正在考虑将整个web应用程序作为一个大的index.php文件。这样,当我需要MySQL连接资源时,我就可以随时使用它。
有更好的方法吗?可能在浪费了太多工作之后,我不想后悔我的选择。
提前谢谢。
您仍然需要将用户名和密码保存到会话中。但不要将密码保存为明文,使用opensslencrypt和openssldecrypt以及您自己的哈希。
http://php.net/manual/en/function.openssl-encrypt.php
但是这个函数出现在之上的PHP 5.3.0中
您永远不需要在会话中存储密码,也不需要为应用程序的每个用户创建单独的MySQL用户。这些东西并不能使你的应用程序更安全,实际上可能会降低它的安全性。
以下是一些建议:
- 创建一个MySQL用户,该用户仅具有读取所需数据的必要权限
- 将MySQL连接信息存储在文档根目录之外的PHP文件中,并将此文件包含在需要访问数据库的PHP文件内
- 在数据库中创建一个表来存储用户帐户,并在将其保存到表之前始终对其密码进行哈希。您可以使用此表在用户登录时对其进行身份验证
- 当用户登录时,只需在会话中存储一个标志,比如他们的user_id。这足以识别他们是谁以及他们已登录。如果该值不在会话中,则他们不会登录
- 您不需要将所有内容都放在一个PHP文件中。可以有多个文件
你可能想尝试使用一个框架,比如Symfony、CodeIgniter或CakePHP,因为他们会有教程可以帮助你创建一个安全的应用程序。请记住,安全性不仅仅局限于密码。正如Kishor所指出的,您还需要担心XSS、SQL注入、CSRF等。一个框架将真正帮助您解决这些问题。
存在一种称为Front Controller的设计模式,它所做的基本上是通过一个页面为整个应用程序提供服务。您实现了自己的调度器,调度器处理所有请求。例如要实例化哪个对象或要包含哪个页面。这限制了对未知对象的安全利用。
此外,对于会话劫持,您可以通过监控和检查来实现您的预防机制
- 用户代理
- 会话重新生成id
- 代币
数据库部分相当令人印象深刻,但如果其他人必须扩展、调试您的应用程序,可能会增加额外的复杂性。您可以使用准备好的语句,甚至可以使用更好的ORM,如条令或数据对象。
主要的安全漏洞是通过XSS和CSRF,因此您必须在表单中实现令牌传递机制,并检查"请求来源"。
最后,我想指出,在web应用程序中可能存在各种安全漏洞。为了应对这些漏洞,存在许多好的框架。这些问题和漏洞在那里得到了预先处理。你可以考虑一下商业逻辑,让别人帮你处理。与人们普遍认为的相反,使用框架实际上会使您在架构、安全性和请求方面的增长更加陡峭。
希望得到帮助!!干杯
不,不要让应用程序成为一个巨大的文件。
将您的DB凭据放在web根目录之外的include中。然后,确保只有需要它的用户才能打开它。这就是通常的做法。