【问题标题】:PHP & MySQL secure web application - Whole web site as single index.php file yes or no?PHP 和 MySQL 安全 Web 应用程序 - 整个网站作为单个 index.php 文件是或否?
【发布时间】:2012-04-15 11:27:23
【问题描述】:

我正在开发将使用 PHP 和 MySQL 的 Web 应用程序。应用程序将处理机密数据。我需要让它尽可能安全。

我不希望应用程序用于连接数据库的 MySQL 用户的密码以明文格式(例如 root 帐户)写入 PHP 文件。

因此,我使用存储过程制作了伪 MySQL 角色系统。用户将使用他们的 MySQL 用户名和密码登录到应用程序。他们将仅具有执行 MySQL 存储过程的特权,但没有对存储过程内部使用的表的 SELECT、INSERT、UPDATE、DELETE 特权。存储过程的定义者将是 root 帐户。

我有一个问题。那就是:我不想在会话中以明文格式存储登录表单数据(例如密码)。我无法使用会话将 mysql 连接资源对象从一个页面转移到另一个页面。

我现在正在考虑将整个 Web 应用程序作为一个大的 index.php 文件。这样我就可以在需要时随时使用 MySQL 连接资源。

有没有击球手的方法来做到这一点?大概。在浪费了太多的工作之后,我不想后悔我的选择:)。

提前谢谢你。

【问题讨论】:

  • 一个大文件根本不是设计,这是一个错误。会话可以被域中的任何脚本使用,请阅读手册。
  • 你认为会话对我有什么帮助?我不想在会话中写入密码归档数据。
  • 我看不出在一个文件中拥有或不拥有所有内容与任何事情有什么关系。它当然与存储 MySQL 凭据无关。
  • 听着。我不想使用这个 $_SESSION['pass'] = $_POST['pass'] 因为它将以明文格式存储在 HDD 上。我不能使用这个 $connection = mysql_connect($db_host.":".$db_port, $fuser, $fpass); $_SESSION['connection'] = $connection;它只是不工作。我无法使用会话将 $connection 从一个页面转移到另一个页面,它不起作用。
  • @BozoCvetkovski,投票结束...您现在已经多次自相矛盾,不清楚您想要什么。请阅读常见问题解答 (stackoverflow.com/faq),并在您将问题缩小到您遇到的特定问题并能够清楚地表达该问​​题时再试一次。

标签: php mysql session procedure


【解决方案1】:

您仍然需要将用户名和密码保存到会话中。但不要以明文形式保存密码,请将 openssl_encrypt 和 openssl_decrypt 与您自己的哈希一起使用。

http://php.net/manual/en/function.openssl-encrypt.php

但是这个函数出现在 PHP 5.3.0 以上

【讨论】:

  • 有什么关系?会话存储应该在服务器上受到保护,并且会话数据永远不会直接传递给客户端。
  • 没错.. 会话的内容从未传递给客户端。但他问“用户将使用他们的 MySQL 用户名和密码登录应用程序”并且不希望在会话中保存明文密码。也许您可以轻松地 grep 会话服务器上的临时文件,然后清楚地获取密码。
  • 是的,加密一点都不重要。同样,如果他担心他的系统管理员这样做,系统管理员可以轻松地使用相同的 PHP 脚本来解码密码。
  • 好吧,如果我完全不担心系统管理员怎么办?如果有人使用一些与应用程序本身无关的漏洞访问服务器怎么办?我只是不喜欢在服务器上的任何位置以明文格式处理财务信息的应用程序存储密码。
  • @BozoCvetkovski,我很遗憾你正在写任何处理财务信息的东西。我当然希望你不要为 my 银行工作。你不明白没关系。如果有人可以访问您的服务器,那么任何加密/解密的服务器端都很容易受到攻击,您的应用程序很容易被修改以窃取凭据,HTTPS 的使用毫无意义,我可以继续下去。
【解决方案2】:

您永远不需要在会话中存储密码,也无需为应用程序的每个用户创建单独的 MySQL 用户。这些东西不会使您的应用程序更安全,实际上可能会降低它的安全性。

以下是一些建议:

  • 创建一个仅具有读取所需数据所需权限的 MySQL 用户。
  • 将 MySQL 连接信息存储在文档根目录之外的 PHP 文件中,并将此文件包含在需要访问数据库的 PHP 文件中。
  • 在数据库中创建一个表来存储用户帐户,并在将其保存到表之前始终对其密码进行哈希处理。您可以在用户登录时使用此表对用户进行身份验证。
  • 当用户登录时,只需在会话中存储一个标志,例如他们的 user_id。这足以识别他们是谁以及他们已登录。如果该值不在会话中,则他们未登录。
  • 您不需要将所有内容都放在一个 PHP 文件中。可以有多个文件。

您可能想尝试使用框架,例如 Symfony、CodeIgniter 或 CakePHP,因为它们将提供可以帮助您创建安全应用程序的教程。请记住,安全性不仅仅是密码。正如 Kishor 指出的那样,您还需要担心 XSS、SQL 注入、CSRF 等。框架将真正帮助您解决这些问题。

【讨论】:

  • 尼克这正是我为博客或任何其他网络应用程序编码时所做的事情,因为我使用共享主机。但就我而言,我有专用服务器,并且我可以完全控制 MySQL 的安装。我想让击球手利用它。还是谢谢你。
【解决方案3】:

存在一种称为Front Controller 的设计模式,基本上它的作用是通过一个页面来提供整个应用程序。您实现自己的调度程序,调度程序处理所有请求。例如要实例化哪个对象或要包含哪个页面。这限制了对未知对象的安全利用。

此外,对于会话劫持,您可以通过监视和检查来实施预防机制

  1. 用户代理
  2. 会话重新生成 ID
  3. 代币

数据库部分令人印象深刻,但如果其他人必须扩展、调试您的应用程序,可能会增加额外的复杂性。您可以使用prepared statements 甚至更好的替代方法ORM,例如DoctrineData Objects

主要的安全漏洞是通过 XSS 和 CSRF,因为您必须在表单中实现令牌传递机制并检查“请求来源”。

最后,我想指出 Web 应用程序中可能存在各种安全漏洞。为了对抗这些漏洞,存在许多好的框架。这些问题和漏洞已在此处预先处理。您可以考虑业务逻辑并让其他人为您处理。与流行的看法相反,使用框架实际上会加速您在架构、安全性和请求方面的增长。

希望对您有所帮助!干杯!

【讨论】:

  • 您对使用它的看法: session.save_handler = mm 。它将会话数据存储在 RAM 中。 ossp.org/pkg/lib/mm 这个 HTTP 无状态的东西正在杀死我。我真的很接近垃圾所有 HTML 和 PHP 并开始学习 C#。
  • @BozoCvetkovski,是的,因为您选择的语言对 HTTP 的工作原理产生了真正的影响。 </sarcasm>
  • 而且每个 C# 应用程序都在使用 HTTP 是吗?不。现在,请跳过我。
【解决方案4】:

不,不要让您的应用程序成为一个巨大的文件。

将您的数据库凭据放在 web 根目录之外的包含中。然后,确保只有需要它的用户才能打开它。这就是通常的做法。

【讨论】:

  • 我知道一般是怎么做的。但这对我来说是不可接受的。数据库管理员和服务器管理员并不总是同一个人。
  • 如果它可以被您的 PHP 脚本读取,那么无论您尝试做什么,您的服务器管理员都肯定可以得到它。
  • 但我的 PHP 脚本无法读取它。我将像这样连接到数据库 $connection = mysql_connect($db_host.":".$db_port,$_POST['user'], $_POST['pass']);完成后,整个 PHP 脚本将被加密,因此任何人都无法更改代码。
  • @BozoCvetkovski, ... 等等,所以您要让您的用户输入要使用的数据库主机/端口/用户名/密码?而且,您担心您的系统管理员会做一些不安全的事情......
  • @BozoCvetkovski,那么,问题出在哪里?你害怕自己吗?现在你的帖子毫无意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多