2010-09-26 2 views
12

Quelques doutes concernant Codeigniter et ses capacités de gestion des entrées. Certains peuvent être un peu bizarre mais ils n'en sont pas moins douteux.Injection SQL et Codeigniter

  1. Si j'utilise les fonctions Active Record de classe dans CodeIgniter, est mon entrée empêché contre l'injection SQL?
  2. J'ai lu quelque part que c'est le cas, mais je ne comprends pas comment? ou pourquoi?
  3. Est-ce que xssclean traite également l'injection SQL de quelque façon que ce soit?
+1

Le mot «enregistrement actif» peut être mal compris et les documents CI ont été modifiés en «query builder» https://codeigniter.com/user_guide/database/query_builder.html – teek

Répondre

16

est mon entrée empêché contre l'injection SQL?

Pas exactement 'automatiquement', mais il fournit des requêtes paramétrées. CodeIgniter ou non, vous devriez utiliser des requêtes paramétrées de préférence pour interroger le piratage de chaîne autant que possible.

$bof= "a'b"; 
$zot= 'a\b'; 

// Insecure! Don't do this! 
// 
$this->db->query("SELECT foo FROM bar WHERE bof='$bof' AND zot='$zot'"); 

// Secure but annoying to write 
// 
$this->db->query("SELECT foo FROM bar WHERE bof='".$this->db->escape($bof)."' AND zot='".$this->db->escape($zot)."'"); 

// This is what you want 
// 
$this->db->query('SELECT foo FROM bar WHERE bof=? AND zot=?', array($bof, $zot)); 

Remarque Cela n'a rien à voir avec « entrée »: lorsque vous effectuez une requête SQL de chaînes que vous doit utiliser paramétrisation ou d'échapper pour les adapter, peu importe si elles sont entrées utilisateur ou non.C'est une question de simple correction; la sécurité est un effet secondaire de cette correction.

De même lorsque vous texte de sortie en HTML, vous devez en code HTML <, & et " caractères dans ce puis. Il est absolument inutile d'essayer de jouer avec l'entrée pour échapper ou supprimer des caractères qui pourraient être gênants dans le futur si vous les utilisez sans s'échapper en SQL ou HTML. Vous allez réduire votre sortie en ayant des fuites SQL inattendues en HTML (ce qui explique pourquoi vous voyez des barres obliques inversées qui se multiplient dans les applications mal écrites) et un échappement HTML indésirable dans SQL. Et si vous prenez un texte ailleurs que sur cette entrée directe de l'utilisateur (par exemple, du matériel déjà dans la base de données), vous n'êtes pas protégé du tout.

De même, xssclean traite-t-il l'injection SQL de quelque façon que ce soit?

Non. Il est destiné à l'injection HTML. Mais c'est pire que sans valeur. Ne l'utilisez jamais. "Filtrage XSS" est complètement faux (encore, CodeIgniter ou quelqu'un d'autre)

XSS doit être empêché par une sortie HTML correctement échappée, ne manquant pas d'entrée. Le filtrage XSS non vous protège adéquatement si votre application n'est pas déjà sécurisée; au mieux, il va obscurcir vos défauts existants et vous donner un faux sentiment de sécurité. Cela va aussi déformer beaucoup d'entrées valides qui, selon CI, ressemblent à des balises.

+0

Intéressant! Le dernier point en particulier. Je pense que ton chemin est vraiment meilleur. – OrangeRind

+2

Vous voulez expliquer pourquoi xssclean de CI ne vaut rien? Je suis vraiment curieux! C'est la moitié de la raison pour laquelle j'utilise CI. J'aimerais savoir si je me fais des illusions et pas sûr! – kevtrout

+0

Si vous vous souvenez de l'échappement HTML de toutes les chaînes que vous affichez dans vos pages HTML, vous êtes sûr que vous utilisiez ou non 'xss_clean', et tout ce qu'il fera pour vous, c'est calmer vos cordes d'entrée, d'une manière effrayante façons. Sérieusement, jetez un œil à 'function xss_clean' dans' Input.php' et riez en remplaçant les choses par '%', les URL-décode, remplace les choses par '%', renverse les liens codés en URL, écrase les mots avec les esperluettes entre eux, s'échappent * certains * signes inférieurs à '<', et vous empêchent de parler de 'innerHTML' ou d'utiliser le mot' alert' ... et plus ... – bobince

1

Lorsque vous utilisez une entrée générée par l'utilisateur, passez-la dans la bibliothèque d'entrée où elle filtre les injections xss et sql.

$this->input->post() 

http://codeigniter.com/user_guide/libraries/input.html

Ne pas vérifier pour plus d'informations sur le filtrage de sécurité.

Dans le fichier cadre de CI vérifier le fichier

Codeigniter->System-libraries->input.php 

où vous pouvez trouver en interne les fonctions utilisées par CI pour aseptiser les données.

XSS propre signifie essentiellement filtrer les mots clés indésirables XHTML/HTML

+0

Selon votre propre lien '$ this-> input- > post() 'ne fait rien pour empêcher l'injection SQL. – Mischa

1

1. il fait si vous le faites correctement

2. Vous aurez probablement remarqué que tous les appels de fonction sont d'une manière que les données de l'utilisateur est passé dans une variable chacun. Vous n'avez donc même pas la possibilité de transmettre le code du contrôleur SQL et les données utilisateur dans une seule variable. Bref, les données sont encapsulées dans une variable chacune. Par conséquent, il peut être codé en toute sécurité sans casser votre code SQL. L'exception est cependant si vous passez votre requête entière. Alors ce n'est pas possible. Si vous

$db->query("select * from table where password = 'hello ' or '1=1"); 

il n'y a aucun moyen de dire ce qui devrait être échappé et ce qui est pas, mais si vous citez dans comme ce

$db->query("select * from table where password = ?",array('param1')); 

la variable utilisateur est encapsulé dans une variable et sera échappé.

3. Oui, il fait, mais son but est de ne pas primpary empêcher l'injection sql, je préfère compter sur http://codeigniter.com/user_guide/libraries/input.html

+0

Je pense qu'il ne devrait pas y avoir de guillemets simples autour du paramètre '?' Ici. – bobince

+0

hmm ... ne peux pas vraiment dire. Je pense que c'est correct de cette façon. Bien sûr, vous n'en avez pas besoin quand vous avez des nombres entiers, mais cela n'a pas vraiment d'importance ... donc c'est probablement mieux de l'écrire comme ça? –

+1

Eh bien, je n'ai pas essayé ceci avec CodeIgniter spécifiquement, mais de loin la façon la plus courante d'effectuer des requêtes paramétrées est d'utiliser un '?' Nu comme point de remplacement, et de traiter ''? point d'interrogation. Cela semble être la syntaxe donnée à http://codeigniter.com/user_guide/database/queries.html, de toute façon. – bobince