web-dev-qa-db-fra.com

Ma page "cachée" est-elle sécurisée?

Je veux créer une page que quelqu'un peut voir uniquement s'il est enregistré et que l'accès lui est accordé.

Pour accorder l'accès à un utilisateur, j'utilise une ligne de la table #__users nommée activated2.

J'ai donc créé un fichier de vue dans un composant et mon view.html.php fichier est comme ça:

class IpropertyViewVtourpaketa extends JView
{
  function display($tpl = null)
  {   
                 $user = JFactory::getUser();

                 if (!$user) {

                  header('Location:index.php?msgvtour=You need to register and get activated');

                }
                else {
                 $db= JFactory::getDBO();
                 $query='SELECT activated2 from `#__users` where id='.$user->id;

                 $db->setQuery($query);
                 $pro=$db->loadResult();

                 if ($pro==0) {

                     header('Location: index.php?msgvtour=You need to get activated');
                 }else {

                // Display the view
                parent::display($tpl);
              }
            }
        }
}
?>

Donc, ce que je fais, c'est: vérifiez s'il est enregistré, sinon redirigez-le. Ensuite, vérifiez s'il est activé, sinon, redirigez-le. Sinon rediriger vers la vue où il peut voir la page. Cela fonctionne vraiment bien, bien que ce que je voulais savoir soit:

Comment est-ce sécuritaire que j'utilise? Cela pourrait-il être facilement piraté ou contourné?

5
IseNgaRt

Il y a des choses que je changerais:

  • Vous ne devriez pas mettre vos requêtes de base de données dans ce fichier. Joomla utilise MVC, vos requêtes doivent donc être placées dans une fonction, dans le modèle.
  • N'utilisez pas la fonction header() par défaut de PHP. Utilisez plutôt le API Joomla pour la redirection
  • Plutôt que d’ajouter votre propre colonne (activé2) au #__users _ table qui est une mauvaise idée, je vous conseillerais d'utiliser pleinement ACL Management de Joomla pour votre composant.
  • Pour la requête de base de données, je suggérerais d'utiliser les méthodes de Joomla plutôt que de l'écrire en langage SQL simple. ici pour plus d'informations

J'espère que cela t'aides

2
Lodder

Non, votre code n'est pas correct.

  • JFactory :: getUser () retourne toujours un objet utilisateur. Si l'utilisateur est un invité, $ user-> id == 0 ou supérieur ($ user-> guest)
  • Dans #__users table, il n'y a pas d'identifiant utilisateur 0
  • index.php? msgvtour ne semble pas appartenir au monde de Joomla
  • Au lieu de "header ('Location: ...", il est préférable de travailler avec l'API Joomla (check)

Par exemple, à partir des composants/com_users/views/profile/view.html.php:

/**
 * Execute and display a template script.
 *
 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
 *
 * @return  mixed   A string if successful, otherwise a Error object.
 *
 * @since   1.6
 */
public function display($tpl = null)
{
    ....
    // View also takes responsibility for checking if the user logged in with remember me.
    $user = JFactory::getUser();
    $cookieLogin = $user->get('cookieLogin');

    if (!empty($cookieLogin))
    {
        // If so, the user must login to edit the password and other data.
        // What should happen here? Should we force a logout which destroys the cookies?
        $app = JFactory::getApplication();
        $app->enqueueMessage(JText::_('JGLOBAL_REMEMBER_MUST_LOGIN'), 'message');
        $app->redirect(JRoute::_('index.php?option=com_users&view=login', false));

        return false;
    }

    ....

    return parent::display($tpl);
}
3
Anibal