-4

我正在开发一个用户可以玩游戏的网络应用程序。如果用户获胜,她将把钱存入她的账户;另一方面,如果用户输掉了游戏,她也会输钱。我需要将“总收入”和“总损失”数据存储到数据库中。

问题是,如果某个恶意用户访问了数据库,该用户将能够更改所有“赚的总钱”和“损失的总钱”,这是一个大问题。

乍一看,我以为可以通过加密“总收入”和“总损失”来完全避免这个问题,但突然间我意识到这是行不通的,因为这个假设的恶意用户总是可以将这些值更改为他想要的任何值想要。

这个问题不是关于“如何避免用户访问我的数据库”,而是关于“如果恶意用户访问它,我怎样才能防止我的数据被更改?”

4

3 回答 3

6

这只是基本的服务器安全性。如果有人以具有写入权限的用户身份登录您的 MySQL 数据库,您将无能为力。你必须事先阻止他们。

您可以采取的步骤:

1)有强大的服务器密码和用户帐户设计。不要让人们以 root 身份登录 SSH 是一个简单的例子。

2) 只为您的应用程序提供所需的数据库访问权限。例如,如果不需要,不要让您的应用程序删除表。这至少会减轻可能的损害。

3) 确保您受到 SQL 注入保护。这可能是新手犯的第一个错误。

当然还有很多东西要知道,但是关于安全问题的书籍比你一生读的要多。我建议你研究一个。我强烈推荐您的 PHP 代码使用 Essential PHP 安全性。它小巧简洁,内容丰富。

于 2013-07-22T18:53:34.110 回答
3

初始点:

您可以Magento查看其sales_order表格信息的用途。

表中的每一行sales_order代表客户发出的单个订单。管理员中有保护机制,不允许管理员编辑这些订单。您只能取消之前的并创建一个新的克隆订单(如果初始订单确实需要“更改”)。

在表级别有一个名为 的列protect_code。此代码(我推测)生成为整个订单信息对象的加密哈希(hash_hmac使用任何一种算法:md5、sha1、sha2、sha256 等)。

如果使用犯罪者无权访问的安全密钥对订单信息对象进行哈希处理(例如,黑客访问了您的数据库但未访问您的 PHP 代码),那么他将无法更改订单信息对象的值,因为他还需要更新散列,如果不使用相同的安全密钥,他将无法获得相同的散列。

您将能够通过重新计算哈希来识别任何被篡改的行。

背景资料:

通常,像这样的密钥存储在 PHP 中,并且哈希值在支付表单中呈现给用户,以确保用户在将表单发送到支付网关(单独的网站)之前无法更改支付信息。

您的 PHP 应用程序和支付网关应用程序都共享加密密钥,因为支付网关必须对其接收的数据进行哈希处理并检查它是否未被篡改(通过比较哈希值)。通常,您会从支付网关收到您(自己的专用)加密密钥。

这意味着用户/黑客不知道您的加密密钥并且无法访问您的 PHP 服务器(这意味着他也无法读取密钥)。

您使用的任何东西都可以访问:

如果用户可以访问您的应用程序服务器,这意味着他可以访问任何和所有第三方服务(安全与否),例如数据库、文件存储服务器、支付服务、邮件发送服务等。唯一的例外是规则是,如果您的应用程序服务器只是其他自托管自包含服务的聚合器。

如果用户可以访问数据库服务器但不能访问应用程序服务器,那么您的加密密钥应该是安全的,并且您的数据应该难以被篡改而不被发现(但不难更改或删除)。

如果您在应用程序的任何地方使用少量数据,则用户/黑客可以访问应用程序服务器,这意味着他(黑客)可以访问该数据。您甚至可以将加密密钥存储在单独的服务器上,并通过请求获取它们中的每一个,如果用户/黑客有权访问,他也可以请求它们。如果您的应用程序正在使用它们,那么您的黑客也可以使用它们。

于 2013-07-22T19:04:57.210 回答
0

您需要了解的第一件事是,在保证数据安全方面没有灵丹妙药。从通过确保仅打开必要的通信端口来保护对服务器的访问到使用强用户名和密码,再到确保 DB 用户仅具有执行必要任务所需的权限。这确实是一个广泛的话题。我建议你在网上搜索 OWASP。如果未经身份验证的用户能够访问您的数据,那么您最不用担心加密。

对于您的情况,加密很好,但请考虑使用用户特定的盐并确保您的加密方法安全。

于 2013-07-22T19:06:34.030 回答