2010-08-20 8 views
1

Possible en double:
XKCD SQL injection - please explaincomment l'injection SQL est-elle effectuée?

Quel est le concept général injection sql?

Être un développeur de rails

Ceci est dangereux

Booking.find(:all, :conditions => [ 'bookings.user_id = #{params[user_id]]}']) 

ce qui est sûr: -

Booking.find(:all, :conditions => [ 'bookings.user_id = ?', params[user_id]]) 

Ai-je raison? Donc, ma question est de savoir comment l'injection sql est faite? Comment ces gars-là font des trucs comme ça. Tout exemple/tutoriel en direct où quelqu'un montre ce genre de choses. Quelque chose de fondamental pour connaître la logique.

+0

duplication possible de [injection SQL XKCD - expliquez svp] (http://stackoverflow.com/questions/332365/xkcd-sql-injection-please-explain) et un [couple d'autres] (http: // stackoverflow. com/search? q = sql + injection) – Gordon

+1

Voter pour fermer ma propre question pour la première fois :-(. mais c'est bien mon erreur de poser une question comme ça avant de chercher sur stackoverflow Désolé les gars. :-) –

Répondre

2

L'injection SQL se produit lorsqu'un programmeur devient paresseux. Une requête vulnérable ressemblerait à ceci:

DECLARE @cmd varchar(256) 

SET cmd='SELECT @col FROM Table' 
EXEC @cmd 

Avec @col étant une variable passée dans une procédure stockée.

Habituellement, l'utilisateur entrerait une colonne dans celle qui existe déjà pour cette variable. Mais un utilisateur plus sournois pourrait entrer quelque chose comme ceci:

* FROM Table; DROP DATABASE data;-- 

La table * FROM; termine la déclaration précédente. Ensuite, les données DROP DATABASE; est la charge utile qui fait de mauvaises choses, dans ce cas, en laissant tomber la base de données. Enfin, le - commente le reste de la requête afin d'éviter les erreurs d'injection.

Ainsi, au lieu d'exécuter ceci:

SELECT column 
FROM Table 

Vous obtenez ceci:

SELECT * 
FROM Table; 
DROP DATABASE data; 
-- 

Ce qui est pas bon.

Et ceci: alt text

+1

Voté pour XKCD. Ecrire l'exemple de la bande dessinée et ce qui se passe exactement serait génial. – KPthunder

1

Tout l'utilisateur doit faire est d'entrer:

1234; DROP TABLE BOOKINGS 

...

0

Si vos données correctement nettoyé et sanatized, un utilisateur peut essayer d'obtenir leur propre code SQL à exécuter sur le serveur. par exemple, supposons que vous ayez une requête comme celle-ci:

"SELECT * FROM products WHERE product_type = $type" 

où type est une entrée utilisateur non modifiée provenant d'un champ de texte. maintenant, si je devais rechercher ce type:

(DELETE FROM produits)

Vous allez être dans un monde de souffrance. C'est pourquoi il est important de s'assurer que toutes les entrées de l'utilisateur sont désinfectées avant de l'exécuter dans la base de données.

1

Je ne sais pas sur les rails, mais en faisant cela Booking.find(:all, :conditions => [ 'bookings.user_id = #{params[user_id]]}']), vous risquez que l'utilisateur donne à user_id la valeur 1 OR 1=1 et comme vous pouvez le voir, il va modifier votre demande.

Avec plus d'injection que vous pourriez faire quelque chose comme 1; DROP TABLE BOOKINGS etc.

Fondamentalement, l'injection est juste « détournement d'avion » à une demande de base pour ajouter le vôtre.

Bobby tables

1

Si vous avez une requête simple comme

SELECT * FROM réservations OU user_id = ORDER BY user_id ASC;

Si vous ne vérifiez pas l'ID utilisateur, il peut fermer votre requête, puis en commencer une nouvelle (nuisible) et jeter le reste.Pour atteindre ceci, généralement, vous devez entrer quelque chose comme

1; EFFACER des réservations; -

initiale; ferme la bonne requête, la mauvaise requête vient ensuite, puis elle est fermée avec; et - s'assure que tout ce qui viendrait après dans la bonne requête est commenté. Vous vous retrouvez ensuite avec

SELECT * FROM réservations WHERE id_utilisateur = 1; EFFACER des réservations; - ORDER BY user_id ASC;

0

Beaucoup d'excellents documents sur la théorie de l'injection SQL ici:

sql injection filetype:pdf

devrait être assez facile à chasser un vers le bas qui est spécifique à votre langue/DB combinaison.