Как / что (критерии) решить, должна ли функция быть частной или общедоступной в КИ

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

Я всегда кодировал, не объявляя функцию, поэтому она рассматривалась как общедоступная, но работала нормально. Однако я прочитал это в руководстве,

В некоторых случаях вы можете захотеть скрыть определенные функции от публичного доступа. Чтобы сделать функцию закрытой, просто добавьте подчеркивание в качестве префикса имени, и оно не будет обрабатываться через URL-запрос. Например, если бы у вас была такая функция:

Как функционирует публичный доступ в контроллере?

У меня есть эта строка кода на каждом контроллере, который я делаю.

 if ( ! defined('BASEPATH')) exit('No direct script access allowed');

Что мешает пользователю напрямую пройти через контроллер и получить доступ к функции через URL-адрес?

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

приватная функция получает ошибку, в то время как я могу получить доступ к функции, объявленной / предполагаемой как публичная.

Каковы критерии для того, чтобы функции были «частными»? Функции, такие как доступ к базе данных? или ценные данные? как введенная информация от пользователя (конфиденциальная информация, такая как данные учетной записи / имя пользователя-пароль)?

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

Пример:

Я установил контроллер по умолчанию с именем «Main»

    public function index(){
if($this->input->cookie('cookie',TRUE)){

}
else
$this->load->view('login');
}

проверяет, существует ли cookie (если пользователь уже вошел в систему). Если я установил функцию индекса на частную, то при каждом доступе к корневой / основной папке он не сможет получить доступ. Поэтому я установил его как публичный. Являются ли мои рассуждения логичными / разумными?

public function login(){
$this->form_validation->set_rules('username', 'Username', 'required|callback_check_account');
$this->form_validation->set_rules('password', 'Password', 'required');

if($this->form_validation->run() == FALSE){
$this->load->view('login'); //i tried using redirect, but it does not pass the error message for validation
}else{

}
}

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

 public function check_account($username){
$data = array('username' => $username, 'password' => $_POST['password']);
$result = $this->LoginModel->validate_account($data);
if(empty($result)){
$this->form_validation->set_message('check_account' , 'account does not exist');
$this->form_validation->set_message('required' , '');
return FALSE;
} else if($result == 'invalid'){
$this->form_validation->set_message('check_account' , 'password does not match');
$this->form_validation->set_message('required' , '');
return FALSE;
} else if($result){
$isLoggedin = array( 'username' => $result['username'] , 'type' => $result['status'] ,  'is_loggedin' => TRUE);
$this->session->set_userdata($isLoggedin);
return TRUE; }
}

Я объявил это общедоступным, потому что, если бы я объявил это как личное, мой обратный вызов вызвал бы фатальную ошибку. Пользователи могут получить доступ к этому через ссылку /Main/check_account/username

Модель:

 function validate_account($data){
$this->db->select('username,password')->where('username' , $data['username']);
$query = $this->db->get('admin')->result_array();
if(!empty($query)){
foreach($query as $row){
if($data['password'] != $row['password']){
return 'invalid'; }
else $query = array('username' => $row['username'] , 'password' => $row['password'] , 'status' => 'administrator');
return $query; }
} else {
$this->db->select('username,password')->where('username' , $data['username']);
$query = $this->db->get('user_mst')->result_array();
if(!empty($query)){
foreach($query as $row){
if($data['password'] != $row['password']){
return 'invalid'; }
else $query['status'] = 'user'; return $query; }
} }
}

EDITED: изменена функция обратного вызова, чтобы проверить, существует ли введенное имя пользователя, если не отображается

‘Аккаунт не существует’

, если он возвращает недействительным, он отображает

‘пароль не подходит’

если он возвращает $ query, я устанавливаю сессию плюс статус учетной записи, так как я создаю только 1 логин для администратора и пользователя. Я до сих пор не знаю, как я буду использовать

‘тип’

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

0

Решение

Если вы не хотите, чтобы check_account был действием контроллера, вы должны использовать

public function _check_account($value) { ... }

и вы вызываете обратный вызов, как это:

$this->form_validation->set_rules('username', 'Username', 'required|callback__check_account');

Обратите внимание, что есть два подчеркивания «_» между «обратным вызовом» и «проверкой». Кроме того, значение отправленного поля формы будет параметром вашего обратного вызова.

0

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

Других решений пока нет …

По вопросам рекламы [email protected]