Parametry Vazba: Co se děje pod kapotou?

hlasů
6

.NET, Java a další databázové vysokou úroveň API v různých jazykových často poskytují technik známých jako připravených příkazů a parametrů závazných jako protiklad k odeslání prostý text příkazy databázový server. Co bych rád věděl, co se stane při spuštění příkazu takto:

SqlCommand cmd = new SqlCommand(GetMemberByID);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter param = new SqlParameter(@ID, memberID);
para.DbType = DbType.Integer;
cmd.Parameters.Add(param);

Vím, že to je nejlepší praxe. SQL injection útoky jsou minimalizovány tímto způsobem. Ale co přesně se děje pod kapotou Při spuštění tyto výroky? Je konečný výsledek stále SQL bezpečné řetězec? Pokud ne, jaký je konečný výsledek? A je to dost, aby se zabránilo SQL injection útoky?

Položena 18/08/2008 v 18:11
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
5

Manuál str MySQL na připravených příkazů obsahuje velké množství informací (které by měly platit pro jakoukoli jinou RDBMS).

Zjednodušeně řečeno, vaše tvrzení je analyzován a zpracován dopředu, a parametry jsou odesílány samostatně, místo aby byly řešeny spolu s SQL kódu. To eliminuje SQL injection útoků, protože SQL je analyzován předtím, než jsou parametry dokonce nastavit.

Odpovězeno 18/08/2008 v 18:18
zdroj uživatelem

hlasů
0

V laik hlediska: v případě, že byla odeslána připravený příkaz, pak DB bude používat plán, pokud je k dispozici, není ani nutné obnovit plán vypracovaný pro pokaždé, když tento dotaz je odeslán přes ale pouze hodnoty params změnily. To je velmi podobné tomu, jak PROC práce, další výhoda se procs je, že můžete dát svolení přes procs a nikoli k podkladové tabulky vůbec

Odpovězeno 18/08/2008 v 18:53
zdroj uživatelem

hlasů
0

Pokud používáte MS SQL, naložit na profilování a uvidíte, co SQL příkazy jsou generovány při použití parametrované dotazy. Zde je příklad (já používám Enterprise Libary 3.1, ale výsledky jsou stejné jako používají SqlParameters přímo) proti SQL Server 2005:

string sql = "SELECT * FROM tblDomains WHERE DomainName = @DomName AND DomainID = @Did";
Database db = DatabaseFactory.CreateDatabase();
using(DbCommand cmd = db.GetSqlStringCommand(sql))
{
  db.AddInParameter(cmd, "DomName", DbType.String, "xxxxx.net");
  db.AddInParameter(cmd, "Did", DbType.Int32, 500204);

  DataSet ds = db.ExecuteDataSet(cmd);
}

To vytváří:

exec sp[underscore]executesql N'SELECT * FROM tblDomains WHERE DomainName = @DomName AND DomainID = @Did',
  N'@DomName nvarchar(9),
  @Did int',
  @DomName=N'xxxxx.net',
  @Did=500204

Můžete si také prohlédnout zde, pokud kotace postavy byly předány jako parametry, které jsou odpovídajícím způsobem unikl:

db.AddInParameter(cmd, "DomName", DbType.String, "'xxxxx.net");

exec sp[underscore]executesql N'SELECT * FROM tblDomains WHERE DomainName = @DomName AND DomainID = @Did',
  N'@DomName nvarchar(10),
  @Did int',
  @DomName=N'''xxxxx.net',
  @Did=500204
Odpovězeno 18/08/2008 v 18:48
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more