Хобрук: Ваш путь к мастерству в программировании

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

<? if ( ! defined('BASEPATH')) exit();

    class Registration extends CI_Controller {

        public function __construct() {
            parent::__construct();
            $this->load->model('registration_model');
        }

        public function index() {
            $this->load->library('form_validation');

            $this->form_validation->set_rules('email', 'E-mail', 'trim|required|valid_email|callback_email_available');

            if($this->form_validation->run() == FALSE) {
                $this->load->view('registration');
            } else {
                $this->registration_model->add_user();
            }
        }

        # Check E-mail
        public function email_available($email) {
            $this->db->select('email');
            $this->db->where('email', $email);
            $query = $this->db->get('users');
            $result = $query->row();

            if(!empty($result)) {
                $this->form_validation->set_message('email_available', 'This e-mail belongs to another user.');
                return FALSE;
            } else {
                return TRUE;
            }
        }

    }
    ?>

У меня есть регистрационная форма с проверкой формы. И у меня есть функция обратного вызова для проверки уникальности электронной почты.

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

example.com/registration/email_available

A PHP Error was encountered
Severity: Warning
Message: Missing argument 1 for Registration::email_available()
Filename: controllers/registration.php

A PHP Error was encountered
Severity: Notice
Message: Undefined variable: email
Filename: controllers/registration.php

Как я могу запретить прямой доступ к функции обратного вызова?


Ответы:


1

Вы можете добавить к имени метода префикс _, чтобы запретить доступ через HTTP-запрос.

02.10.2012
  • Для тех, кто, как и я, пишет код слишком поздно для вашего же блага, убедитесь, что вы также изменили вызов функции обратного вызова в set_rules(), то есть callback__function_name (два символа подчеркивания). Я забыл это сделать и мне было интересно, почему это не сработало, дох! 27.04.2013

  • 2

    Я предлагаю поместить ваши правила проверки в отдельный файл. CodeIgniter поддерживает это, позволяя сохранять конфигурации проверки в config/form_validation.php. Взгляните на документацию по проверке форм, особенно на раздел Сохранение наборов Правила проверки файла конфигурации.

    Индекс вашего контроллера:

    public function index() {
        $this->load->library('form_validation');
        if($this->form_validation->run('submit_registration') == FALSE) {
            $this->load->view('registration');
        } 
        else{
            $this->registration_model->add_user();
        }
    }
    

    config/form_validation.php

    $config = array
    (   
        'submit_registration' => array
        (
            array(
                'field' => 'email',
                'label' => 'Email',
                'rules' => 'trim|required|valid_email|email_available'
            ),
            array(
                'field' => 'username',
                'label' => 'Username',
                'rules' => 'required|alpha_numeric|etc'
            )
        ),
        'some_other_submission' => array(
            array(
                'field' => 'somefield',
                'label' => 'SomeField',
                'rules' => 'some|rules'
            ),
            array(
                'field' => 'getit',
                'label' => 'Get The Point?',
                'rules' => 'trim'
            )
        )
    );
    

    библиотеки/MY_Form_validation.php

    class MY_Form_validation extends CI_Form_validation
    {   
        function __construct($config = array()){
            parent::__construct($config);
        }
    
        function email_available($email){
            $CI =& get_instance();
            //check your database with the $CI variable...
           if(email_exists) return TRUE;
           else return FALSE;
        }
    }
    
    02.10.2012
    Новые материалы

    Решения DBA Metrix
    DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

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

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...