4

J'utilise ASP Classic et SQL Server 2000 pour créer des sites Web dynamiques.ASP Classic - Objet Recordset et objet de commande

Je suis un peu confus quant à quand utiliser un objet jeu d'enregistrements et quand utiliser un objet de commande lors de l'interrogation de la base de données.

On m'a dit que si la procédure stockée renvoyait des enregistrements d'une instruction SELCT, je devrais utiliser un jeu d'enregistrements, mais si je suis en train de mettre à jour ou d'insérer, je devrais utiliser un objet de commande procédure stockée.

Lorsque vous utilisez un jeu d'enregistrements je passe souvent des données requises comme ceci:

rs.Source = "spTest " & id 

Je valident alway les données que je passe pour vous assurer qu'il est ce que je me attends et de le jeter à son type correct.

Depuis, on m'a dit que la méthode ci-dessus laisse mon code ouvert aux attaques par injection SQL et que je devrais toujours utiliser un objet de commande.

Est-ce correct?

Merci

Répondre

3

Oui, c'est vrai. Imaginez quelqu'un passant la chaîne: '0; supprimer * des utilisateurs; '

Vous requête serait alors:

spTest 0; delete * from users; 

Si vous êtes chanceux, vous aurez pas une table d'utilisateurs. Personnellement, j'utiliserais l'objet de commande tout le temps pour la cohérence. Vous pouvez obtenir tout ce dont vous avez besoin.

Voici un exemple rapide de la façon dont vous pouvez le faire avec l'objet de commande:

Dim oStoredProc : Set oStoredProc = Server.CreateObject("ADODB.Command") 

    With oStoredProc 
     .ActiveConnection = oDBConnection 
     .CommandType = adCmdStoredProc 
     .CommandText = "up_procname" 
     .Parameters.Append(.CreateParameter("@Param1", ADODB.adInteger, ADODB.adParamInput, 22, 11)) 
     .Parameters.Append(.CreateParameter("@Param2", ADODB.adInteger, ADODB.adParamOutput, 22, 12) 

     Call .Execute() 

     myVal = .Parameters("@Param2") 
    End With 

    Set oStoredProc = Nothing 
+0

Merci.Dites que, comme dans l'exemple que j'ai donné, je sais que le paramètre va être numérique et j'ai validé l'entrée pour m'assurer que c'est le cas. Serait-il correct d'utiliser l'objet jeu d'enregistrements comme je l'ai décrit ou devrais-je utiliser l'objet de commande indépendamment? Je demande seulement beaucoup de temps que ce sont seulement les valeurs numériques que je traverse et cela me sauverait beaucoup de temps si je n'avais pas à passer par tous et à les changer tous. Merci – chester600

1

Qu'est-ce que vous avez dit est correct en effet: vous devez toujours utiliser des objets pour empêcher l'injection commande SQL. En utilisant des requêtes paramétrées, vous laissez toute la sécurité et la validation des paramètres à la couche ADO (bien que vous deviez toujours effectuer votre propre validation) et vous pouvez même obtenir une amélioration des performances (ces requêtes paramétrées sont mises en cache par SQL Server)

Lorsque vous exécutez une commande, vous avez deux options: soit le SQL que vous exécutez retourne des lignes (une instruction SELECT, ou certaines procédures stockées), puis vous devez utiliser un jeu d'enregistrements pour stocker ces lignes (UPDATES, DELETS , autres procédures), alors vous exécutez simplement la commande et ne vous inquiétez pas des jeux d'enregistrements.

Edit: juste pour vous assurer que tout est clair pour vous, je le code de James Wiseman ci-dessus et adapté à votre exemple:

Dim oStoredProc : Set oStoredProc = Server.CreateObject("ADODB.Command") 

With oStoredProc 
    .ActiveConnection = oDBConnection 
    .CommandType = adCmdStoredProc 
    .CommandText = "spTest ?" 
    .Parameters.Append(.CreateParameter("id", ADODB.adInteger, ADODB.adParamInput, id, 11)) 
    Dim rs : Set rs = .Execute() 
End With 

Set oStoredProc = Nothing 

n'a pas testé, mais devrait être ok :-)

Enfin, même si vous êtes assez bien protégé, n'oubliez pas que si vous utilisez du SQL dynamique dans votre procédure stockée, vous pouvez toujours avoir un trou de sécurité d'injection SQL (dès que vous êtes chaînes de concaténation pour créer SQL, vous pourriez être vulnérable, je dirais)!

+0

Merci. Donc dois-je seulement utiliser l'objet recordset conjointement avec la commande obbject? Je suppose également que l'utilisation de l'objet jeu d'enregistrements est correcte lorsque j'exécute une procédure stockée qui ne nécessite aucun paramètre à lui passer? Merci – chester600

+0

Afin de simplifier la chose, je vous encourage à toujours utiliser la même méthode: utilisez toujours des jeux d'enregistrements avec des objets Command, et n'y pensez plus. Vous pouvez avoir un peu plus à taper parfois, mais cela peut être facilement évité avec certaines fonctions d'aide que vous pouvez écrire (vous verrez bientôt quel code est toujours répété) –