3 votes

Comment ajouter et vérifier des tokens (contre CSRF etc.) dans des liens et non des formulaires dans CodeIgniter ?

Je sais comment activer CSRF dans les formulaires dans CodeIgniter, cependant je ne suis pas sûr de savoir comment mettre en œuvre cette fonctionnalité dans CodeIgniter classic link (par exemple pour ajouter/supprimer des messages privés, des messages, etc. dans la zone d'administration).

J'utilise maintenant quelque chose comme ceci :

VIEW

<?php echo anchor('account/delete_private_message/'.$obj->pmID, 'delete mesage', array('onclick' => 'return confirm(\'Do you really want to delete this private message?\');', 'class' => 'delete-message-button')); ?>

CONTRÔLEUR

function delete_private_message($pmID = '')
    {

        $deleted_pm = $this->account_model->delete_pm($pmID);

        if($deleted_pm)
        {
            $this->session->set_flashdata('status', 'PM was deleted successfully');
        }
        else
        {
            $this->session->set_flashdata('status', 'Error');
        }
        redirect('account/private_messages');
    }

MODÈLE

function delete_pm($pmID)
    {

        $return = 0;
        if(!empty($pmID))
        {
            $this->db->where('pmID', $pmID);
            $result = $this->db->delete('private_messages');
        }
        return $result;
    }

Et si l'utilisateur clique sur OK dans la fenêtre contextuelle, le message est supprimé.

La question est de savoir comment ajouter un jeton au lien et à la session de l'utilisateur, comment le vérifier, etc. Je ne sais pas comment faire pour que cela fonctionne correctement.

EDIT : Je suppose que je dois ajouter le jeton généré à la fin du lien comme suit :

account/delete_private_message/1239/dfdf6e7re67a6e87r6e87r69876bn3

et la valeur dfdf6e7re67a6e87r6e87r69876bn3 également dans la session de l'utilisateur actuel et les vérifier dans le contrôleur. Cependant, je ne sais pas ce que je dois faire exactement. Donc, toute aide est appréciée.

3voto

The Shift Exchange Points 23103

Vous avez raison - il suffit de transmettre le jeton CSRF en tant que partie du lien. L'exemple ci-dessous devrait vous aider (mais je ne l'ai pas testé)

function delete_private_message($pmID = '', $token = null)
{
    // Check supplied token is valid
    if ( ! ($this->_check_token($token)))
    {
        // Not valid
        $this->session->set_flashdata('status', 'Error');
        redirect('account/private_messages');
    }

    if($this->account_model->delete_pm($pmID))
    {
        $this->session->set_flashdata('status', 'PM was deleted successfully');
    }
    else
    {
        $this->session->set_flashdata('status', 'Error');
    }
    redirect('account/private_messages');
}

function _check_token ($token)
{
      return ($token === $_COOKIE[$this->csrf_cookie_name]);
}

p.s. vous avez une erreur dans le code de votre modèle

$return = 0;

devrait être

$result = 0;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X