2012-10-15 3 views
3

J'utilise codeigniter avec jquery et ce serait bien si vous m'expliquiez comment protéger le contrôleur d'un accès direct. Par exemple, je vue avec cette ligne standard jquery:Comment protéger le contrôleur contre un accès direct?

$('#handler').load('tools/get_stats'); 

Outils il est mon contrôleur avec fonction de statistiques de chargement. Si j'écris directement dans le navigateur l'adresse complète du script http://site.com/tools/get_stats, le navigateur ouvre, bien sûr, ces données. Comment protéger l'accès direct du contrôleur au navigateur? Je veux que mes données ont été chargées seulement dans la vue, pas sur l'accès direct de contrôleur.

+0

connexes: http://stackoverflow.com/q/8121997/29995 –

Répondre

3

La classe d'entrée CodeIgniter a une méthode appelée is_ajax_request() à cette fin.

if ($this->input->is_ajax_request()) 
{ 
    //do something 
} 
else 
{ 
    show_error("No direct access allowed"); 
    //or redirect 
} 

Si vous avez un contrôleur dédié Ajax, vous pouvez bien sûr inclure cette logique dans la méthode __construct(), sinon il peut être mis en œuvre sur une méthode par base de méthode dans vos contrôleurs.


Voir:

+0

Cela permettrait d'arrêter un attaquant potentiel en ajoutant un en-tête http supplémentaire. – JeffS

+0

La question n'est pas celle de la sécurité, mais celle de la présentation; Comme l'a indiqué l'interlocuteur, il souhaite limiter la présentation des données à la vue. C'est la solution canonique de CodeIgniter à cette question. – coderabbi

3

En général, vous ne pouvez pas le faire d'une manière significative en raison de la nécessité de fournir un accès et la simplicité de HTTP. Ou plus fondamentalement, vous ne pouvez pas refuser l'accès aux informations que vous devez fournir (dans ce cas, les informations de connexion sans état). Les meilleures étapes initiales consistent à s'assurer que le contrôleur autorise uniquement l'accès aux données auxquelles l'utilisateur doit avoir accès (quelle que soit la manière dont il se connecte), plutôt que d'essayer de restreindre en fonction des informations de demande facilement altérées. Cela étant dit, si vous avez une raison étrange de poursuivre après cela, vous pouvez utiliser une forme de jeton à usage unique passée avec la requête AJAX. Vous pourriez, par exemple, générer une clé aléatoire, persister quelque part (idéalement juste en mémoire dans quelque chose comme une table de hachage car il ne devrait jamais y avoir un délai assez long pour justifier le contraire) et le transmettre avec la page qui émettra l'ajax demande. Le jeton est renvoyé avec la demande et supprimé, puis ce jeton ne sera plus valide. Le contrôleur ne pourrait pas être accédé directement puisqu'il aurait besoin d'un jeton.

Cela encore pouvoir être travaillé autour depuis le processus pourrait être arrêté et un jeton émis utilisé, mais il dissuader tout simplement jouer avec boucle (si vraiment ne vaut pas l'effort). En bref, vous ne pouvez pas faire cela d'une manière que personne ne pourrait pas contourner dans les 10 minutes. Concentrez-vous sur vous assurer que vous n'exposez que les données que vous voulez, peu importe comment elles sont récupérées.

+0

Merci, Matt! Je comprends ce que vous voulez dire, réponse très pro – Gamekeeper

Questions connexes