Я должен был сделать базовую систему входа в систему, чтобы защитить страницу, и у меня нет доступа к базе данных, поэтому я храню имя пользователя и пароль, жестко запрограммированные на странице 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
}
?>
Мои комментарии становятся длиннее, поэтому я просто перенесу их сюда. Я бы не советовал ставить имя пользователя и пароль в один файл. Если PHP когда-нибудь не удастся обработать страницу, она будет выгружена пользователю в виде обычного текста. Даже для соединений с базой данных (где UN / PWD почти необходимо хранить в виде простого текста), большинство людей не помещают информацию в один и тот же файл.
У вас есть пара вариантов:
Создайте отдельный PHP-файл, который устанавливает переменные UN / PWD, поместите его в недоступное извне сервер и включите его в index.php. В этом случае я не буду включать файл до тех пор, пока вы не сравните переменные и не позволите локальной области вывести его как можно скорее.
Поскольку это такая базовая аутентификация, вы можете использовать Встроенный в Apache модуль аутентификации по паролю.
На мой взгляд, это решение достаточно безопасно, если вы не планируете использовать его вечно.
Что бы я проверил, это настройки вашего веб-сервера — некоторые текстовые редакторы делают резервные копии отредактированных файлов, таких как index.php ~, index.php.bkp или около того. Убедитесь, что ваш веб-сервер не обслуживает эти файлы, если таковые имеются.
Проблема с временными решениями заключается в том, что они никогда не были временными.
Никогда не кодируйте пароли жестко. Некоторые из причин: