Prévention de l'injection SQL dans ASP.Net
J'ai ce code
UPDATE OPENQUERY (db,'SELECT * FROM table WHERE ref = ''"+ Ref +"'' AND bookno = ''"+ Session("number") +"'' ')
Comment pourrais-je empêcher les Injections SQL?
Mise à JOUR
Voici ce que je suis en train
SqlCommand cmd = new SqlCommand("Select * from Table where ref=@ref", con);
cmd.Parameters.AddWithValue("@ref", 34);
Pour quelque raison que tout ce que j'ai essayer et d'ajouter qu'il ne semble pas fonctionner, je reçois des SQL Command
mentionnés ci-dessous.
L'erreur est ce
'SqlCommand' is a type and cannot be used as an expression
Je prends quelqu'un d'autre travail, donc c'est tout nouveau pour moi et je voudrais faire les choses de la bonne façon, donc si quelqu'un peut fournir plus d'aide sur comment faire ma requête ci-dessus, à l'abri de SQL injections alors s'il vous plaît.
MISE À JOUR N ° 2
J'ai ajouté dans le code VasilP dit comme ça
Dim dbQuery As [String] = "SELECT * FROM table WHERE ref = '" & Tools.SQLSafeString(Ref) & "' AND bookno = '" & Tools.SQLSafeString(Session("number")) & "'"
Mais j'obtiens une erreur Tools is not declared
ai-je besoin de spécifier l'espace de noms pour que cela fonctionne?
Mise à JOUR
Quiconque a des idées sur le meilleur, de faire ma requête à l'abri de l'injection SQL sans les erreurs que je suis en train de vivre?
Mise à JOUR
Je l'ai donc fonctionner sans les paramètres bits voici mon code mis à jour une idée pourquoi ne pas ajouter de la valeur du paramètre?
Dim conn As SqlConnection = New SqlConnection("server='server1'; user id='w'; password='w'; database='w'; pooling='false'")
conn.Open()
Dim query As New SqlCommand("Select * from openquery (db, 'Select * from table where investor = @investor ') ", conn)
query.Parameters.AddWithValue("@investor", 69836)
dgBookings.DataSource = query.ExecuteReader
dgBookings.DataBind()
Il fonctionne comme ceci
Dim conn As SqlConnection = New SqlConnection("server='server1'; user id='w'; password='w'; database='w'; pooling='false'")
conn.Open()
Dim query As New SqlCommand("Select * from openquery (db, 'Select * from table where investor = 69836') ", conn)
dgBookings.DataSource = query.ExecuteReader
dgBookings.DataBind()
L'erreur que j'obtiens est ce
An error occurred while preparing a query for execution against OLE DB provider 'MSDASQL'.
Et c'est parce qu'il n'est pas de remplacer le @investor
avec le 69836
Des idées?
SOLUTION
Voici comment j'ai résolu mon problème
Dim conn As SqlConnection = New SqlConnection("server='h'; user id='w'; password='w'; database='w'; pooling='false'")
conn.Open()
Dim query As New SqlCommand("DECLARE @investor varchar(10), @sql varchar(1000) Select @investor = 69836 select @sql = 'SELECT * FROM OPENQUERY(db,''SELECT * FROM table WHERE investor = ''''' + @investor + ''''''')' EXEC(@sql)", conn)
dgBookings.DataSource = query.ExecuteReader
dgBookings.DataBind()
Maintenant, je peux écrire des requêtes sans avoir le souci de l'injection SQL
source d'informationauteur Jamie Taylor
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser un requête paramétrée voici un lien http://www.aspnet101.com/2007/03/parameterized-queries-in-asp-net/
Aussi, ne pas utiliser la fonction OpenQuery... utiliser le présent pour exécuter l'sélectionnez
Plus d'articles décrivant certaines de vos options:
http://support.microsoft.com/kb/314520
Quelle est la syntaxe de T-SQL pour se connecter à un autre Serveur SQL?
Édité
Remarque: Votre question initiale a été de demander à propos de requêtes distribuées et les serveurs Liés. Cette nouvelle déclaration ne fait pas référence à une requête distribuée. Je ne peux que supposer que vous êtes connecter directement à la base de données. Voici un exemple qui devrait fonctionner.
Voici un autre site de référence pour l'utilisation de SqlCommand.Paramètres
Édité:
Ok Jamie taylor, je vais essayer de répondre à votre question.
Vous utilisez OpenQuery parce que vous utilisez probablement lié DB
Fondamentalement, le problème est le OpenQuery Méthode prend une chaîne, vous ne pouvez pas passer une variable en tant que partie de la chaîne que vous avez envoyé à OpenQuery.
Vous pouvez formater votre requête comme ceci à la place. La notation suit servername.databasename.schemaname.tablename. Si vous utilisez un serveur lié via odbc puis omettre databasename et schemaname, comme illustré ci-dessous
Utilisez les paramètres au lieu de la concaténation de votre requête SQL.
En supposant que votre moteur de base de données SQL Server, voici un morceau de code qui je l'espère pourra vous aider.
Pour résumer le tout, éviter de l'instruction SQL de la concaténation à tout prix, et l'utilisation paramétrée quesries!
Voici un lien intéressant qui vous amène par injection de code SQL de la résolution de problème sur MSDN:
Comment faire: Protéger contre l'Injection SQL dans ASP.NET
utilisation sqlparameters comme:
vous pouvez utiliser des requêtes paramétrées.
http://www.functionx.com/aspnet/sqlserver/parameterized.htm
il ne fonctionne pas car il est écrit en C#, pas de VB.
Essayer quelque chose comme
Mon manière préférée est de permettre à Visual Studio à gérer tout cela par la création d'un DAL:
http://www.asp.net/data-access/tutorials/creating-a-data-access-layer-cs
Utiliser LINQ. Il parametrizes requêtes automatiquement.
Découvrez ORM comme une alternative (très bonne façon d'aller si vous êtes à la construction de quelque chose de taille moyenne ou grande). Il faut un peu de temps pour le configurer, mais ensuite, le développement devient TRÈS rapide. Vous choisissez à partir de la maternelle, Linq to SQL ou Entity FrameworkOU, essayez toute autre ORM qui fonctionne avec .NET.