0

我必须做一个基本的登录系统来保护一个页面,我无法访问数据库,所以我将用户名和密码硬编码在 php 页面中。

我的问题是,这个登录系统可以抵御攻击吗?我需要它保持大约1个月。

任何改进的建议都会有所帮助。代码不在 laravel 中,即使它看起来像。用户名和密码,当然会改成更强的。

先感谢您。

<?php
class UserController {
private $username;
private $password;
private $isLoggedIn = false;

// Credentials
public function credentials() {
    $credentials = array(
        array(
            "username" => "telekom",
            "password" => "1234"
        ),
        array(
            "username" => "telekom2",
            "password" => "1234"
        )
    );
    return $credentials;
}

// Basic login
public function login() {
    foreach ($this->credentials() as $credential) {
        if ($this->username == $credential['username'] && $this->password == $credential['password']) {
            Session::put('username', $this->username);
            Session::put('password', $this->password);
            $this->isLoggedIn = true;
        }
    }
}

// Get login status
public function isLoggedIn() {
    return $this->isLoggedIn;
}

// Logout
public function logout() {
    // Delete all sessions
    Session::all();
    redirect('/telekom/');
}

// Telekom
public function telekom() {
    $form = new Form();
    if (Input::get('logout') == 1) {
        $this->logout();
    }

    // Post Data from login form
    if (Input::has('username') || Input::has('password')) {
        if (!$form->isCsrfValid()) {
            $form->errors['CSRF'] = "CSRF Token";
        } // CSRF protection is on, comment to disable
        if (empty($form->errors)) {
            $this->username = Input::get('username');
            $this->password = Input::get('password');

            // Check Login
            $this->login();
            if (!$this->isLoggedIn()) {
                Session::put('login', 'Username and password do not match.');
            } else {
                redirect('/telekom/');
            }
        } else {
            Session::put('login', '<p class="color-dark-red"><strong>Errors:</strong></p>
                        <p>' . $form->displayErrors($form->errors) . '</p>');
        }
    // Check if session has username and password 
    } elseif (Session::has('username') && Session::has('password')) {
        $this->username = Session::get('username', false);
        $this->password = Session::get('password', false);
        // Check Login 
        $this->login();
    }
}
}// EOF Class User

// Outside class
$user = new UserController();

// Outside class
if (!$user->isLoggedIn()) {
    // display login form
} else {
    // display protected content    
}
?>
4

3 回答 3

1

我的评论越来越长,所以我将它们移到这里。我不建议您将用户名和密码放在同一个文件中。如果 PHP 无法处理该页面,它将作为纯文本转储给用户。即使对于数据库连接(un/pwd 几乎必须存储纯文本),大多数人也不会将信息放在同一个文件中。

你有几个选择:

  1. 制作一个单独的 PHP 文件来设置您的 UN/PWD 变量,将其放在服务器外部无法访问的位置,并将其包含在 index.php 中。在这种情况下,直到您要比较变量并让本地范围尽快转储它时,我才会包含该文件。

  2. 由于这是这样的基本身份验证,您可以使用Apache 的内置密码身份验证模块

于 2015-09-17T14:38:29.013 回答
0

临时解决方案的问题在于它们从来都不是临时的。

永远不要硬编码密码。其中一些原因是:

  • 将源代码保密比作为密钥更难。
  • 您网站中任何允许读取源代码的漏洞都可能泄露密码。
  • 来自开发的密码最终将用于生产。
  • 不重新部署就不可能更改密码。
于 2015-09-22T09:46:21.520 回答
0

在我看来,当你不打算永远使用它时,这个解决方案是足够安全的。我要检查的是您的网络服务器的设置 - 一些文本编辑器会备份已编辑文件的副本,例如 index.php~、index.php.bkp 等。确保您的 Web 服务器是否不提供这些文件(如果有)。

于 2015-09-17T13:51:46.543 回答