Qu'est-ce que le passage de paramètres à SQL et pourquoi en ai-je besoin?
Débutant ici:
Dans ce réponse à ma question de comment faire pour insérer des données dans SQL Server, il a mentionné en passant des paramètres au lieu de concaténation de chaîne que j'ai actuellement.
Est-ce vraiment nécessaire pour la sécurité? Si oui, quelle est exactement passage de paramètres? Quand je recherche sur google, je reçois beaucoup sur les procédures stockées. C'est ce que je veux, je ne sais pas à propos de procédures stockées....encore.
Si vous pouvez me diriger dans la bonne direction, j'apprécierais que.
Grâce.
EDIT:
Ok, voici ce que j'ai. Il semble pour mettre à jour la base de données correctement et finalement je vais changer le codage en dur ints pour les entrées à partir d'un label. S'il vous plaît confirmer si la façon dont je l'ai fait ce n'est pas vulnérable à n'importe quel sql injection ou de hacks.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;
public partial class Stats : System.Web.UI.Page
{
public SqlDataReader DataReader;
public SqlCommand Command;
string queryString = ("INSERT INTO UserData (UserProfileID, ConfidenceLevel, LoveLevel, HappinessLevel) VALUES (@UID, @CL, @LL, @HL);");
//string queryString = ("INSERT INTO UserData (UserProfileID, ConfidenceLevel, LoveLevel, HappinessLevel) VALUES ('a051fc1b-4f51-485b-a07d-0f378528974e', 2, 2, 2);");
protected void Page_Load(object sender, EventArgs e)
{
LabelUserID.Text = Membership.GetUser().ProviderUserKey.ToString();
}
protected void Button1_Click(object sender, EventArgs e)
{
//connect to database
MySqlConnection database = new MySqlConnection();
database.CreateConn();
//create command object
Command = new SqlCommand(queryString, database.Connection);
//add parameters. used to prevent sql injection
Command.Parameters.Add("@UID", SqlDbType.UniqueIdentifier);
Command.Parameters["@UID"].Value = Membership.GetUser().ProviderUserKey;
Command.Parameters.Add("@CL", SqlDbType.Int);
Command.Parameters["@CL"].Value = 9;
Command.Parameters.Add("@LL", SqlDbType.Int);
Command.Parameters["@LL"].Value = 9;
Command.Parameters.Add("@HL", SqlDbType.Int);
Command.Parameters["@HL"].Value = 9;
Command.ExecuteNonQuery();
}
}
J'aime les petits Bobby Tables. Se classe juste là-haut avec leur bande d'environ Gotos.
Nice....
En plus de l'apprentissage de l'écriture des requêtes paramétrées, je vous recommande aussi la lecture d'un livre par Justin Clarke appelé "les Attaques par Injection SQL et de la Défense", où il décrit en détail comment l'Injection SQL qui se passe, comment s'en protéger dans différentes langues, notamment .NET, comment faire pour tester et ainsi de suite. Une assez bonne lecture.
Sonne bien. Je vais devoir prendre le temps en quelque sorte....Je suis un one man show sur ce projet de mine!
OriginalL'auteur Greg McNulty | 2010-07-09
Vous devez vous connecter pour publier un commentaire.
Passer des paramètres à SQL vous évite d'avoir à construire une chaîne SQL dynamique.
Construction dynamique des instructions SQL est un ÉNORME risque de sécurité, car les gens peuvent injecter leur propre code SQL dans votre application, éventuellement, de l'exécution indésirables des commandes par rapport à vos données.
Il y a quelques bons échantillons de possibles attaques par Injection SQL:
Les Attaques par Injection SQL par Exemple
Il y a deux façons de passer des paramètres aux instructions SQL. L'une est d'utiliser des Procédures Stockées comme vous l'avez mentionné. L'autre est d'utiliser des requêtes paramétrées (qui est en fait ce que je préfère).
Une requête paramétrée est en fait assez facile .NET:
Dans cet exemple, le paramètre a été
@Username
et nous avons utilisé leParameters
collection de laSqlCommand
objet pour passer de la valeur.il est à peu près aussi facile que ça en a l'air.
ok, cool, merci.
OriginalL'auteur Justin Niessner
Il va vous protéger contre peu de Bobby Tables.
http://xkcd.com/327/
OriginalL'auteur StriplingWarrior
Voici un exemple:
À l'aide de Paramètres est un bon moyen d'éviter certaines erreurs, et à aider à arrêter l'injection de vecteurs. Il permet également de paramètres de SORTIE, comme dans l'exemple ci-dessus où cGroupID revient avec une valeur que je puisse y accéder.
OriginalL'auteur Fosco
Le principal problème avec simplement de la concaténation de chaînes est qu'il vous laisse vulnérable à des attaques par Injection SQL.
Google Injection SQL ou lire ici.
OriginalL'auteur CodingWithSpike
En plus de l'injection SQL et autres, des requêtes paramétrées toujours regarder la même chose pour le serveur SQL. La plupart probable que le plan d'exécution de requête sera mis en cache, donc si vous envoyez la même requête à nouveau, il sera exécuté plus rapidement. Ce serait très sensible si vous exécutez la même requête plusieurs fois dans une boucle ou vous avez de nombreux clients de l'interrogation de votre serveur.
OriginalL'auteur Nelson Rothermel