2009-09-17 6 views
1

J'ai découvert une erreur sur mon script de pagination dans les CodeIgniter:est-ce une vulnérabilité de codeigniter?

$this->db->where("by_id",$user_id); 
$this->db->order_by("date","desc"); 
$this->db->limit(10,$from); 
$query = $this->db->get("status"); 

L'URL ressemble à ceci: serveur/demo/page/10

donc si le serveur de type d'utilisateur/nedjma/baniss/1000000000000000000000

Numéro d'erreur: 1064

Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de '1000000000000000000000, 10' à la ligne 5

SELECT * FROM (status) OÙ by_id = '58' ORDER BY date desc LIMITE 1000000000000000000000, 10

pouvez-vous me dire s'il vous plaît quel est le bogue?

+1

Désolé compagnon, juste enlevé le lien vers ce site étant donné qu'il était ouvert à SQL Injection. Quelqu'un d'autre répondra en détail (je ne sais pas assez sur php) mais vous devez valider la variable '$ from', pour vous assurer que c'est un nombre * seulement *. –

+0

@silky, la validation de la variable 'from' s'avère être une réponse valide dans toutes les langues, pas seulement PHP. –

+0

Vineet: Oui, je ne sais pas du tout de ma tête comment confirmer que c'est un int en php; des langages fous non typés: P –

Répondre

4

Ce n'est pas une vulnérabilité ou un bug de CodeIgniter. C'est simplement un problème SQL/MySQL. J'ai fait un peu de test avec phpMyAdmin, le plus grand offset que vous pouvez utiliser est quelque part autour de 18000000000000000000.

Quelque chose de plus grand, et vous obtiendrez une erreur de syntaxe SQL. Si vous voulez éviter cette erreur, vérifiez que $from ne dépasse pas 18 x 10^18, ou créez vos propres pages d'erreur personnalisées. Vous pouvez également désactiver le signalement des erreurs - en haut de l'index.php de CI, error_reporting(0);

Une dernière remarque: le code que vous avez publié n'est pas ouvert à l'injection SQL. La classe d'enregistrement actif de CodeIgniter s'échappe et vérifie votre entrée pour vous. Si $from n'est pas un nombre, Active Record ne générera pas de clause LIMIT lors de la création du code SQL.

+0

Je suis d'accord, c'est un nombre valide, juste trop grand pour mysql, faire un vérifier pour un maximum et cela devrait être éliminé. – Jakub

+0

merci jimyi :) –