Как или по каким критериям можно решить, должна ли функция быть частной или публичной.
Я всегда кодировал, не объявляя функцию, поэтому она рассматривалась как общедоступная, но работала нормально. Однако я прочитал это в руководстве,
В некоторых случаях вы можете захотеть скрыть определенные функции от публичного доступа. Чтобы сделать функцию закрытой, просто добавьте подчеркивание в качестве префикса имени, и оно не будет обрабатываться через 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 логин для администратора и пользователя. Я до сих пор не знаю, как я буду использовать
‘тип’
в моем сеансе, но я просто положил его там, в случае необходимости проверить сеанс, если пользователь является администратором или пользователем, чтобы они не могли получить доступ к страницам друг друга.
Если вы не хотите, чтобы check_account был действием контроллера, вы должны использовать
public function _check_account($value) { ... }
и вы вызываете обратный вызов, как это:
$this->form_validation->set_rules('username', 'Username', 'required|callback__check_account');
Обратите внимание, что есть два подчеркивания «_» между «обратным вызовом» и «проверкой». Кроме того, значение отправленного поля формы будет параметром вашего обратного вызова.
Других решений пока нет …