0

目前,我的网络服务器上的一个文件夹中有两个文件,一个名为 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 访问。”

上述建议究竟是什么意思?我应该做些什么来使密码更安全吗?

4

3 回答 3

2

为了回答您的问题,您被告知将其放置在 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 手册,以获取有关如何使用它以获得最佳安全性的更多信息。

出于安全目的,存储类型(PHP 文件、数据库等)并不重要。重要的是密码不能被浏览器访问,并且它不是以明文形式存储的。

于 2013-07-29T23:35:24.627 回答
0

也许不是一个有用的答案,但一个很好的提示:永远不要使用硬编码的 php 变量来存储密码。使用 web 目录上方的 htpasswd 或将密码存储在至少经过哈希处理的数据库中。

于 2013-07-29T22:54:10.843 回答
0

当您使用 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';

于 2013-07-29T23:23:35.490 回答