将“现金总收入”数据存储到数据库中

时间:2013-07-22 18:51:56

标签: php mysql

我正在开发一个用户可以玩游戏的Web应用程序。如果用户获胜,她将获得金钱到她的帐户;另一方面,如果用户输掉比赛,她也会赔钱。我需要将数据“赚取的总金额”和“损失的总金额”存储到数据库中。

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

乍一看,我认为通过加密“赚取的总金额”和“总损失金额”可以完全避免这个问题,但突然我意识到这不会起作用,因为这个假设的恶意用户总能改变这些价值无论他想要什么。

这个问题不是关于“”如何避免用户访问我的数据库“”,而是“如果恶意用户可以访问它,我该如何阻止我的数据被更改?”“

3 个答案:

答案 0 :(得分:6)

这只是基本的服务器安全性。如果有人以具有写入权限的用户身份登录到您的MySQL数据库,则无法执行任何操作。你必须事先阻止它们。

您可以采取的步骤:

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

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

3)确保您受到SQL注入的保护。这可能是诺富特犯下的第一个错误。

当然还有更多要知道的内容,但是有关安全问题的书籍在一生中可以阅读的数量超过了你。我建议你调查一下。我强烈推荐PHP代码的Essential PHP安全性。它小巧简洁,内容丰富。

答案 1 :(得分:3)

起点:

您可以查看Magento对其sales_order表格信息执行的操作。

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

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

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

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

背景信息:

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

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

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

您可以访问任何内容:

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

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

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

答案 2 :(得分:0)

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

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