2014-06-25 3 views
0

Est-il possible d'écrire une requête de suppression à l'intérieur Où clause.Supprimer Requête dans la clause Where

Exemple:

Select ID,Name From MyTable Where ID IN(Delete From MyTable) 

Il peut être fou, mais laissez-moi vous expliquer ma situation. Dans notre outil de reporting, nous prenons en charge la saisie de requêtes SQL. Nous allons utiliser notre propre Sélectionnez et DeClause requête et de combiner l'entrée de requête de l'utilisateur.

Exemple:

Select ID,Name From MyTable Where ("Query typed by user") 

Ici, l'utilisateur peut saisir tout type d'où filtre de requête ..

S'il tape comme ID = 100 notre requête finale devient comme celui-ci

Select ID,Name From MyTable Where (ID=100) 

Un de nos clients nous a demandé ce qui se passerait si quelqu'un tapait la requête de suppression comme filtre de requête. il pense que c'est peut-être le trou de sécurité ... nous avons donc essayé ce genre de possibilité dans notre environnement de développement. Mais le sql renvoie l'erreur pour la requête suivante.

Select ID,Name From MyTable Where ID IN(Delete From MyTable) 

Donc finalement, ma question est, est-il une autre possibilité d'écrire Supprimer la requête dans Si possible, la clause Where ou clause Select .. comment puis-je restreindre?

+2

OUI! S'ils entrent leur requête comme quelque chose comme "; GO; DELETE FROM MyTable". Il existe de nombreuses variantes à ce sujet, vous devez donc vraiment chercher des moyens d'arrêter l'injection SQL. Le moyen le plus simple d'éviter cela est de paramétrer votre requête et de passer le texte utilisateur en paramètre. –

+0

Oui, c'est très dangereux. Ils pourraient mettre quelque chose comme 1 = 1; supprimer de la table. Lookup sql injection. – SQLChao

+0

Ceci est une injection SQL, et vous ne devriez pas laisser un utilisateur taper n'importe quel type de requête qu'il veut. Que faire si la requête qu'ils ajoutent est 'ID = 100); DELETE FROM MyTable; '? – Lamak

Répondre

2

Oui. Ils peuvent exécuter une suppression.Ils peuvent taper:

1 = 1; DELETE FROM MY_TABLE; 

Ou encore pire à certains égards, (puisque vous devriez avoir des sauvegardes):

1 = 0 UNION SELECT SOCIAL_SECURITY_NUMBER, CREDIT_CARD_NUMBER, OTHER_SENSITIVE_DATA FROM MY_SENSITIVE_TABLE; 

Maintenant, dans votre cas il est difficile de valider. Normalement, si vous passez juste une valeur à filtrer, vous pouvez utiliser sql paramétré pour vous sauver. Vous devez cependant également laisser l'utilisateur sélectionner une colonne. Dans de tels cas, nous utilisons généralement une liste déroulante pour permettre à l'utilisateur de sélectionner une liste prédéfinie de colonnes, puis de valider le côté serveur du nom de la colonne. Nous donnons à l'utilisateur une zone de texte pour entrer la valeur à faire correspondre, puis paramétrer cela.

+0

merci pour votre aide – kombsh

1

Ce n'est pas tout à fait possible. Mais il peut faire quelque chose comme ceci:

Select ID,Name From MyTable Where (ID=100); (DELETE FROM MyTable Where 1 = 1) 

en utilisant ID=100); (DELETE FROM MyTable Where 1 = 1 au lieu de ID=100

0

Je crois que votre client parle est l'injection SQL, aussi longtemps que vous avez pris des méthodes appropriées pour bloquer d'autres requêtes de en cours d'exécution après que votre instruction select soit terminée, vous ne devriez pas avoir de problème à les laisser taper ce que vous voulez. D'après mon expérience, il n'y a aucun moyen de supprimer quoi que ce soit lorsque vous faites une déclaration select. Assurez-vous simplement d'avoir des caractères de terminaison de requête afin qu'ils n'écrivent pas quelque chose comme ce qui suit.

select column1,column2, from myTable where ID in (1,2); delete from my table 

ce serait un souci valide de votre client si vous ne prenez pas les mesures appropriées pour empêcher l'injection sql de se produire.

Vous pourriez avoir votre outil de création de rapports SQL juste ne pas avoir de mise à jour, ou supprimer la permission et juste avoir l'autorisation de lecture. Cependant, c'est à vous de gérer votre sécurité d'injection SQL.

+0

merci pour votre aide – kombsh