我的网站上有一个名为dbSettings.php的文件,其中包含以下行:
<?php
$host = "localhost";
$dbName = "database";
$user = "user";
$pwd = "pass";
$db = new mysqli($host, $user, $pwd, $dbName);
?>
我使用require_once()函数将此页面放入主页面。对于通过服务器(我的域)到达此页面的人来说,是否有任何方法可以获取存储在这些变量中的值?这是保持数据库设置的安全方法吗?
答案 0 :(得分:3)
这是在php应用程序中保留数据库凭据的常用方法。通常,配置文件会保留这些设置的一些好的做法
chmod the file 640 instead of 600. Keep file ownership to your user and change group to webserver. This way, the webserver can only read and not modify it
If user just needs to access one database only give privileges for that database and data not give Structure or Administration related privileges if not needed
.htaccess
<files dbSettings.php>
order allow,deny
deny from all
</files>
答案 1 :(得分:2)
如果您的网络服务器配置正确,则网络客户端应该无法查看设置。当通过Web服务器访问.php
文件时,它会执行脚本,并将其打印的内容返回给客户端。脚本的源代码不会发送到客户端。
通过将此类文件放在您的webroot之外,您可以使事情更安全。然后客户端甚至无法解决它们,只能通过require
d从另一个脚本访问它们。
答案 2 :(得分:0)
根据我所知的PHP安全性,这些信息有两种泄露方式:
至于安全存储信息,我不认为有更好的解决方案可以像Barmar建议那样做,并将配置文件放在Web服务器实际上不提供文件的地方。 PHP仍然可以访问这些文件,但Web服务器不会将它们提供给客户端。根据您的主机,这可能是也可能是不可能的。
答案 3 :(得分:0)
确保无法通过URL访问您的dbSettings.php,因此php必须能够读取此文件,但是通过在浏览器中键入它的地址(通过猜测,运气等),该文件不应该是可访问的。但是如果你已经正确配置了www服务器,你应该没问题,因为php会被处理,空白页面会返回给用户。
只有当您错误配置您的Web服务器以便它不会处理php页面而是将它们返回给用户时 - 其他人才能访问该文件以进行下载。因此,无法再从外部访问您的设置。
除此之外你不应该从生产服务器上的php代码中获取echo,dump等等这些值,你也应该从mysql驱动程序中捕获任何错误,这样它们就不会打印给生产服务器上的用户。
答案 4 :(得分:0)
如前所述,最重要的安全措施是正确的网络服务器配置。
在创建永远不能直接访问的配置文件时,可以安全地将其放在服务器根目录之外,或者放在服务器配置为不提供文件的目录中。只要该文件具有适当的权限,您可以在没有网络服务器帮助的情况下include()
。
如果您选择坚持将配置文件放在可访问的位置,您可以使用define()
技巧来防止未经授权的执行。这是通过在实际include()
之前在文件中定义一个包含配置文件的常量来完成的,然后检查配置文件本身中是否存在常量。
使用example.php:
<?php
define ('my_const', 1);
include ('config.php');
echo $super_secret_data;
?>
的config.php:
<?php
if (!defined ('my_const'))
die ();
$super_secret_data = 42;
?>
当然,这里唯一的安全好处是,如果直接访问页面,可执行代码将不会在没有常量的情况下运行,并且不能定义const的文件也无法访问其数据(这是非常糟糕的安全性)通过默默无闻,你可能仍然可以在文件上调用getfilecontents()
。