【问题标题】:How to disable direct access to callback functions?如何禁用对回调函数的直接访问?
【发布时间】:2012-10-02 01:02:37
【问题描述】:
<? 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;
            }
        }

    }
    ?>

我有一个带有表单验证的注册表单。 而且我有一个回调函数来验证电子邮件的唯一性。

所有代码都可以正常工作,但我可以直接访问有错误的回调函数

examle.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

如何拒绝直接访问回调函数?

【问题讨论】:

    标签: codeigniter codeigniter-2


    【解决方案1】:

    您可以在方法名称前加上 _ 以拒绝通过 HTTP 请求的访问。

    【讨论】:

    • 对于像我这样为了自己的利益而在深夜编码太晚的人,请确保您也更改了对 set_rules() 中回调函数的调用,即 callback__function_name(两个下划线)。我忘了这样做,想知道为什么它不起作用,doh!
    【解决方案2】:

    我的建议是将您的验证规则放入一个单独的文件中。 CodeIgniter 通过允许您将验证配置保存在 config/form_validation.php 中来支持这一点。查看Form Validation Documentation,特别是标记为将验证规则集保存到配置文件的部分。

    你的控制器的索引:

    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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 1970-01-01
      • 1970-01-01
      • 2020-08-17
      • 1970-01-01
      • 2020-04-10
      • 2012-02-01
      相关资源
      最近更新 更多