2

我正在构建一个私人 CMS 供我自己使用,并且我将开始构建用户名和密码存储功能。我正在考虑将所有管理员用户名、密码和用户详细信息存储在 PHP 文件中的多维数组中的可能性,而不是使用 SQL 将它们存储在数据库中。

我想要使​​用这种非传统方法来存储用户信息的原因是相信这将使攻击者更难获得对用户信息(用户名、密码、IP 地址等)的未经授权的访问,因为我不会连接到 MySQL 数据库。

粗略的代码大纲:

add_user.php

// set the last referrer session variable to the current page 
$_SESSION['last_referrer'] = 'add_user.php';

// set raw credential variables and salt
$raw_user = $_POST['user'];
$raw_pass = $_POST['pass'];
$raw_IP = $_SERVER['REMOTE_ADDR'];
$salt = '&^${QqiO%Ur!W0,.#.*';

// set the username if its clean, else its false
$username = (is_clean($raw_user)) ? $raw_user : false; // is_clean() is a function I will build to check if strings are clean, and can be appended to an array without creating a parsing error.

// set the salted, sanitized, and encrypted password if its clean, else its false
$password = (is_clean($raw_pass)) ? $salt . encrypt($raw_pass) : false; // encrypt() is a function I will build to encrypt passwords in a specific way

// if username and password are both valid and not false
if( $username && $password ) {

    // set the users IP address
    $IP = sanitize($raw_IP);

    // create a temporary key
    $temp_key = $_SESSION['temp_key'] = random_key(); 

    // random_key() is a function I will build to create a key that I will store in a session only long enough to use for adding user info to the database.php file

    // add user details array to main array of all users
    $add_user = append_array_to_file('database.php', array($username, $password, $IP)); 

    // append_array_to_file() is a function I will build to add array's to the existing multidimensional array that holds all user credentials. 

    // The function will load the database.php file using cURL so that database.php can check if the temp_key session is set, the append_array_to_file() function will stop and return false if the database.php file reports back that the temp_key is not set.

    // The function will crawl database.php to read the current array of users into the function, will then add the current user's credentials to the array, then will rewrite the database.php file with the new array. 

    // destroy the temporary session key
    unset($_SESSION['temp_key']);
}
else {
    return false;
}

数据库.php

$users_credentials = array(1 => array('username' => 'jack', 
                                      'password' => '&^${QqiO%Ur!W0,.#.*HuiUn34D09Qi!d}Yt$s',
                                      'ip'=> '127.0.0.1'), 
                           2 => array('username' => 'chris', 
                                      'password' => '&^${QqiO%Ur!W0,.#.*8YiPosl@87&^4#',
                                      'ip'=> '873.02.34.7')
                          );

然后,我将创建自定义函数来模拟 SQL 查询(如SELECT),以用于验证尝试登录的用户。

我的问题

  1. 这是一个坏主意,如果是,为什么?

  2. 我是否正确地认为这将减少黑客试图获得未经授权的访问、嗅探/窃取密码等的可能性,因为我没有连接到远程数据库?

4

2 回答 2

2

我没有看到任何优势:无论您使用文本文件、mysql 数据库还是 php 文件(=== 文本文件),它们都是“数据库”,因为它们是存储信息的文件。不同之处在于为这些东西制作了一个 sql 数据库。

我确实看到了缺点,因为您必须考虑更多潜在的漏洞。一些例子(除了评论中提到的东西):

  • 你需要注意密码文件总是在 web-root 之外,以防 php 死在你身上;
  • 您需要避免在源代码控制中传递您的密码文件。

这些都不是很难解决的事情,但是使用普通的数据库,您甚至不必担心它们。

除此之外,还误解了盐的用途:如果您只是将其添加到加密密码中,那么使用盐确实没有意义,您需要将其发送到您的encrypt函数以使用您的文本密码对其进行哈希处理,以便彩虹必须为每个密码生成表,而不是为整个数据库生成一个表。出于这个原因,您也不应该为所有用户使用单一的盐,每个用户都应该有不同的、独特的盐。

于 2012-12-16T02:18:06.420 回答
1

如果您计划将任何类型的配置数据存储在任何类型的文本文件中,而不是传统数据库,请考虑使用 .ini 文件。如果我没记错的话,您也可以将其存储在您的网络根目录之外,就像php.ini文件一样。

这是一篇很棒的帖子,准确地解释了如何解决这个问题:使用 ini 文件进行 PHP 应用程序设置

PHP 手册:get_cfg_var()

于 2012-12-16T02:26:35.353 回答