目前,我在Web服务器上的一个文件夹中有两个文件,其中一个名为password.php。该文件包含一行:
<?php $password = 'my_password' ?>
另一个php文件包含脚本,我只想在页面上发布正确的密码参数时执行该脚本。我把它设置成这个
<?php require 'password.php';
if (isset($_POST["Password"]) & $_POST["Password"] == $password){
//Execute code...
}
else {
echo "Error";
}
?>
现在我的问题是,这是否是一种安全的方式,可以通过手动向页面上发布信息来确保不需要的人无法在页面上执行脚本?有人告诉我,如果脚本处理器被禁用,服务器可以将原始脚本发送回服务器。这是否意味着人们可以故意禁用www.mysite.com/directory/password.php上的处理器,并查看$password变量的值?
我被告知:"将password.php放在一个单独的文件中,并将其存储在www目录上方的目录中。然后,它只能通过本地文件系统访问,而不能通过HTTP从外部世界访问。"
上述建议究竟是什么意思?我应该做些什么来提高密码的安全性吗?
为了回答您的问题,您被告知将其放置在web可访问空间之外。这意味着,如果您的web服务器有一个文档根设置在/var/www/site,那么您应该将其存储在该目录之外,也许是/var/www/data中,因为远程HTTP客户端可能无法访问后一个目录。
几个建议:
密码不应以纯文本形式存储。它应该存储为散列。也许是这样的:
<?php $password = some-hash; ?>
其中"some hash"是使用crypt()生成的实际密码的哈希,如crypt("password")
。
然后你的检查码会是这样的:
<?php require '../password.php';
if (isset($_POST["Password"]) && crypt($_POST["Password"]) == $password) {
//Execute code...
} else {
echo "Error";
}
?>
以上只是一个例子。。有关如何使用crypt()函数以获得最佳安全性的更多信息,请查看PHP手册中的crypt函数。
出于安全目的,存储类型(PHP文件、数据库等)实际上并不重要。重要的是浏览器无法访问密码,并且密码未以明文形式存储。
也许这不是一个有用的答案,但却是一个很好的提示:永远不要使用硬编码的php变量来存储密码。使用网页目录上方的htpasswd,或者将密码存储在至少哈希的数据库中。
当您使用ftp(或用于传输文件的任何协议)连接到托管提供商时,文件夹结构看起来如何?通常你会有类似的东西
/yourUserName/public
or
/yourUserName/public_html
你可以上传所有应该在yourdomain.com上可用的文件。你可以将配置文件(实际上几乎所有的服务器端文件)放在公共目录之外。这意味着如果我转到yourdomain.com/config.php,它就不在那里了。
我通常把我的整个应用程序放在公共目录之外,所以它看起来像这个
/userName/app
controllers
models
templates
views
config.php
router.php
/userName/public
css
js
index.php
然后我通常在index.php中做这样的事情:require’/app/config.php’;