У меня проблемы с защитой моего сайта от атак.
Прежде всего, мой сайт заказан на тестовом сервере с такой структурой ниже
Проблема возникает, когда я должен определить безопасность для панели администратора.
Что я хочу:
Как я могу это сделать? Пока что я сделал это:
поместил в каждый контроллер этот код:
defined('BASEPATH') OR exit('No direct script access allowed');
я понимаю, что это должно предотвратить прямой доступ к контроллерам, но это не работает … Я могу получить доступ без регистрации для каждой функции в каждом контроллере …
Я также кодировал эту функцию для хранения пользовательских данных в сессии:
public function receiveLogin(){
$this->load->library('form_validation');
$this->load->library('session');
$this->form_validation->set_rules('username', 'Username', 'required');
$this->form_validation->set_rules('password', 'Password', 'required');
if ($this->form_validation->run() == FALSE){
$this->data['error_message'] = $this->form_validation->error_array();
}else{
$username = $_POST['username'];
$password = md5($_POST['password']);
$user = $this->user_model->checkUserLogin($username,$password);
if (!empty($user)){
$admin_data = array(
'admin_id' => $user->u_id,
'admin_name' => $user->u_name,
);
$this->session->set_userdata($admin_data);
redirect('admin/showDashboard');
}else{
$this->session->set_userdata('admin_id', 0);
$this->data['error_message'] = 'Los datos de ingreso son incorrectos';
redirect('login');
}
}
}
Я также настроил свои маршруты для сокращения URL, и это работает хорошо.
Может кто-нибудь объяснить мне, как выполнить то, что мне нужно? сообщения, которые я нашел об этом, не говорят об этих 3 проблемах безопасности, которые я задал ..
Каковы лучшие практики для этого?
Я заметил из вашего комментария, что вы не хотите включать проверку входа в систему в каждой функции, это понятно, но не обязательно.
Помните, что контроллер — это просто класс, поэтому вы можете выполнить проверку входа в конструктор:
public function __construct(){
parent:__construct();
$this->loggedIn();
}
Просто не забудьте переопределить родительский конструктор, иначе ваш контроллер, вероятно, будет работать неправильно.
Также обратите внимание, что это выполнит проверку входа в систему для всех функций в контроллере, поэтому вам потребуется отдельный контроллер для страниц, не вошедших в систему.
Другой аккуратный способ заключается в использовании черты, вам понадобится как минимум php версии 5.4, но это очень полезно для абстрагирования логики, подобной этой. Вы можете создать признак, который выполняет проверку входа в систему, включить его в контроллер, где требуется проверка подлинности, и просто вызвать $this->loggedIn()
или как вы вызывали функцию в верхней части функции контроллера, которая требует, чтобы пользователь вошел в систему, и позволяет черту перенаправить пользователя, если он не вошел в систему
самое простое — поместить приложение и системную папку на один уровень выше общедоступной папки html, тогда ничего не будет доступно!
application/public_html/
system302/public_html/
/public_html/index.php
в вашем файле index.php
$application_folder = '../application';
$system_path = '../system302';
для входа в систему — поместите свой контрольный код входа в систему где-нибудь как модель, автоматически загрузите модель, чтобы она всегда была доступна, затем вызовите регистрацию в конструкторе класса. Тогда все методы в классе защищены, и вы не повторяете кучу кода проверки сеанса в ваших контроллерах.
Лучшая защита, которую вы могли бы получить, — это использование htaccess, так как я также вижу, что вы пытаетесь создать безопасность для панели администратора и в зависимости от того, как вы используете контроллеры (некоторые люди используют контроллер администратора для всего на своей панели администратора). I рекомендовал бы использовать основной контроллер.
Внутри основного контроллера вы используете следующий код:
class MY_Controller extends CI_Controller{
function __construct(){
parent::__construct();
if($this->uri->segment(1) == "admin"){
$this->checkLoginAdmin();
}
}
function checkLoginAdmin(){
if(isset(!$this->session->userdata('admin_id'))){
$this->session->set_flashdata("message", "You must login first.");
redirect("admin/login");
}
}
}
Имейте в виду, что для этого вам нужно загрузить помощник uri, в зависимости от того, какую версию codeigniter вы используете, я бы порекомендовал поместить ее в автозагрузчик CodeIgniter. Кроме того, в зависимости от URL-адреса для панели администратора, этот код будет работать, как только ваш URL будет выглядеть следующим образом: www.example.com/admin
Даже посещение www.example.com/admin/test не будет разрешено, если вы не вошли в систему.
Входной класс CodeIgniter имеет метод с именем is_ajax_request()
для этого.
if ($this->input->is_ajax_request()) {
//do something
}
else {
show_error("No direct access allowed");
//or redirect
}