PHP 登录系统硬编码用户名和密码
PHP Login system hard coded username and password
我必须做一个基本的登录系统来保护页面,我无法访问数据库,所以我将用户名和密码硬编码存储在 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
}
?>
在我看来,当您不打算永远使用它时,此解决方案足够安全。
我要检查的是您的 Web 服务器的设置 - 一些文本编辑器会备份已编辑文件的副本,例如 index.php~、index.php.bkp 等。确保您的 Web 服务器是否不提供这些文件(如果有)。
我的评论越来越长,所以我把它们移到这里。我不建议您将用户名和密码放在同一个文件中。如果 PHP 无法处理该页面,它将作为纯文本转储给用户。即使是数据库连接(其中 un/pwd 几乎必须存储纯文本),大多数人也不会将信息放在同一个文件中。
您有几个选择:
制作一个单独的 PHP 文件来设置您的 UN/PWD 变量,将其放在服务器外部无法访问的地方,并将其包含在 index.php.在这种情况下,直到您要比较变量并让本地范围尽快转储它时,我才会包含该文件。
由于这是基本身份验证,您可以使用 Apache's built in password authentication module.
临时解决方案的问题在于它们从来都不是临时的。
永远不要硬编码密码。其中一些原因是:
- 源代码的保密性比密钥还难。
- 您网站中允许读取源代码的任何漏洞都可能泄露密码。
- 来自开发的密码将最终用于生产。
- 不重新部署就无法更改密码。
我必须做一个基本的登录系统来保护页面,我无法访问数据库,所以我将用户名和密码硬编码存储在 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
}
?>
在我看来,当您不打算永远使用它时,此解决方案足够安全。 我要检查的是您的 Web 服务器的设置 - 一些文本编辑器会备份已编辑文件的副本,例如 index.php~、index.php.bkp 等。确保您的 Web 服务器是否不提供这些文件(如果有)。
我的评论越来越长,所以我把它们移到这里。我不建议您将用户名和密码放在同一个文件中。如果 PHP 无法处理该页面,它将作为纯文本转储给用户。即使是数据库连接(其中 un/pwd 几乎必须存储纯文本),大多数人也不会将信息放在同一个文件中。
您有几个选择:
制作一个单独的 PHP 文件来设置您的 UN/PWD 变量,将其放在服务器外部无法访问的地方,并将其包含在 index.php.在这种情况下,直到您要比较变量并让本地范围尽快转储它时,我才会包含该文件。
由于这是基本身份验证,您可以使用 Apache's built in password authentication module.
临时解决方案的问题在于它们从来都不是临时的。
永远不要硬编码密码。其中一些原因是:
- 源代码的保密性比密钥还难。
- 您网站中允许读取源代码的任何漏洞都可能泄露密码。
- 来自开发的密码将最终用于生产。
- 不重新部署就无法更改密码。