Проблемы с безопасностью моего сайта, построенного с codeigniter

У меня проблемы с защитой моего сайта от атак.

Прежде всего, мой сайт заказан на тестовом сервере с такой структурой ниже
образ

Проблема возникает, когда я должен определить безопасность для панели администратора.

Что я хочу:

  1. Чтобы избежать прямого доступа к контроллерам без входа на сайт
  2. Чтобы мой сайт не подвергался атакам хакеров
  3. Чтобы защитить мою базу данных от хакеров

Как я могу это сделать? Пока что я сделал это:

поместил в каждый контроллер этот код:

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 проблемах безопасности, которые я задал ..

Каковы лучшие практики для этого?

0

Решение

Я заметил из вашего комментария, что вы не хотите включать проверку входа в систему в каждой функции, это понятно, но не обязательно.

Помните, что контроллер — это просто класс, поэтому вы можете выполнить проверку входа в конструктор:

public function __construct(){
parent:__construct();
$this->loggedIn();
}

Просто не забудьте переопределить родительский конструктор, иначе ваш контроллер, вероятно, будет работать неправильно.

Также обратите внимание, что это выполнит проверку входа в систему для всех функций в контроллере, поэтому вам потребуется отдельный контроллер для страниц, не вошедших в систему.

Другой аккуратный способ заключается в использовании черты, вам понадобится как минимум php версии 5.4, но это очень полезно для абстрагирования логики, подобной этой. Вы можете создать признак, который выполняет проверку входа в систему, включить его в контроллер, где требуется проверка подлинности, и просто вызвать $this->loggedIn() или как вы вызывали функцию в верхней части функции контроллера, которая требует, чтобы пользователь вошел в систему, и позволяет черту перенаправить пользователя, если он не вошел в систему

2

Другие решения

самое простое — поместить приложение и системную папку на один уровень выше общедоступной папки html, тогда ничего не будет доступно!

application/public_html/
system302/public_html/
/public_html/index.php

в вашем файле index.php

$application_folder = '../application';
$system_path = '../system302';

для входа в систему — поместите свой контрольный код входа в систему где-нибудь как модель, автоматически загрузите модель, чтобы она всегда была доступна, затем вызовите регистрацию в конструкторе класса. Тогда все методы в классе защищены, и вы не повторяете кучу кода проверки сеанса в ваших контроллерах.

1

Лучшая защита, которую вы могли бы получить, — это использование 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 не будет разрешено, если вы не вошли в систему.

0

Входной класс CodeIgniter имеет метод с именем is_ajax_request() для этого.

if ($this->input->is_ajax_request()) {
//do something
}
else {
show_error("No direct access allowed");
//or redirect
}
-3