在共享主机上安全存储MySQL密码

4
我为商业客户制作了一个简单的网页,它在主要由我们的B2C Prestashop基础电子商务平台使用的MySQL数据库上运行。我们使用共享主机。这个网站主要基于jQuery jTable (jtable.org),旨在显示产品的当前、近似库存。
我使用了jQuery jTable的“起步包”,并为我们的合作伙伴创建了一个简单的前端视图。它看起来有点像jTable教程中的那个。
        $(document).ready(function () {

        //Prepare jTable
        $('#PeopleTableContainer').jtable({
            title: 'Product Availability',
            actions: {
                listAction: 'someconfigfile.php?action=list',
            },
            fields: {
                column1: {
                    title: 'column1',
                    width: '70%',
                    key: true
                },
                column2: {
                    title: 'column2',
                    width: '30%'
                }
            }
        });

        //Load person list from server
        $('#PeopleTableContainer').jtable('load');

    });

由于我只想展示MySQL数据库中的数据,所以我准备了只读用户,并使用他的凭据来访问数据库。如jQuery脚本中所示,我通过someconfigfile.php文件和'list'操作访问数据库。

someconfigfile.php包含MySQL连接字符串以及用于填充前端视图中表格的SQL查询。出于安全考虑,我想将someconfigfile.php文件放在public_html文件夹上面的目录中。包含HTML、PHP和CSS文件的用于前端的文件夹将保留在public_html下面。

我的问题是:

  • 如果我将它放在public_html上面,我的密码是否会被任何人访问到?我的整个前端代码只有这个jQuery jTable。
  • 如果我只使用mysql_fetch_assoc($result)获取数据,然后打印数组()的json_encode,我是否容易受到SQL注入攻击?用户不会在此输入任何数据。

编辑:请注意,jTable CRUD函数中我只留下了Read选项。Create、Update和Delete选项已被删除。


1
“如果我把密码放在public_html上面,会有任何人可以访问到吗?” - 你是指与你共享服务器的任何人,还是通过HTTP访问资源的“外部人员”? 如果Web服务器正确配置(即public_html是Web根目录),则后者应该是不可能的,而前者取决于您的主机提供商正在运行的配置。 - CBroe
我指的是Web访问,即通过HTTP。由于它是共享主机,我无法访问服务器配置,因此我不会自找麻烦去改变我无法改变的事情。那么JavaScript的漏洞呢? - mwilczynski
2个回答

1
我不确定这个真正的工作原理,因为我没有尝试过,但是前几天学到了这个,所以我想分享一下。
在GoDaddy上,您可以将主域名指向子目录,从而创建一个新的文档根目录,可以这样说。其他主机可能不是这种情况,但值得检查。
例如,在根目录中创建一个名为“application”的新目录,将应用程序文件上传到该目录中,并将主域名指向该目录(您可能需要先删除域名,然后再使用指定的目录添加域名)。然后,您可以包括文件-例如您的数据库凭据-来自您的新文档根目录之前,现在对公众不可用,但对您的应用程序可用。
新结构:
DB凭据:
/home/www/html/someSite/dbCredentials.php

您的网站(主域名指向的地方):

/home/www/html/someSite/application/index.php

例子:

在dbCredentials.php中添加你的凭证:

<?php
$strHostName = “10.10.10.10”; 
$strDbName = “dbname”;
$strUserName = “dbuser”;  
$strPassword = “xxx***xxx”;
?>

在您的网页中,包含文件并像平常一样使用变量:
<?php
require_once ('/home/www/html/someSite/dbCredentials.php');
$db_found = new PDO("mysql:host=$strHostName..........);
?>

来源:

http://support.godaddy.com/help/article/4175/specifying-a-new-default-document-root-on-your-hosting-account?pc_split_value=4&countrysite=uk

如果你尝试了,让我知道它的进展情况。

1
密码将存储在您的php文件中,因此即使这些文件位于public_html文件下,也无法通过HTTP请求访问。
使用共享主机会使您面临同一托管服务器上的其他人可能能够访问您的文件的可能性,但我假设您的托管公司已经采取了必要的措施来限制客户之间的文件访问。
话虽如此,您仍需要使用密码保护您的html文件,否则任何人都可以访问您的数据库信息。

据我所知,如果他们的PHP出了问题,崩溃等等,.php文件将显示其包含的内容(我使用.php文件作为配置和索引文件)。 如果它在webroot之上或受.htaccess规则保护,我认为应该没问题。 - mwilczynski
当然这不是最佳实践,但由于他只需要处理共享 Web 托管上的一个公共目录,所以他没有太多选择。即使使用 .htaccess 保护整个目录也不足够,如果托管公司也搞砸了 .htaccess 怎么办呢?而且即使密码被泄露,mysql 服务器也可能允许来自本地主机或受限 IP 的连接。 - Matteo Galli
我可以访问 webroot 上面的一个目录。这意味着它不应该暴露 .php 文件包含的数据,因为它不能通过 HTTP 请求访问(或者至少不应该)。 - mwilczynski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接