Èκζ¯Ì¬µÄÖ´ÐÐSQL ¶¼ÓÐ×¢ÈëµÄ·çÏÕ£¬ÒòΪ¶¯Ì¬Òâζ×Ų»ÖØÓÃÖ´Ðмƻ®£¬¶øÈç¹û²»ÖØÓÃÖ´Ðмƻ®µÄ»°£¬ÄÇô¾Í»ù±¾ÉÏÎÞ·¨±£Ö¤ÄãдµÄSQLËù±íʾµÄÒâ˼¾ÍÊÇÄãÒª±í´ïµÄÒâ˼¡£
ºÜ¶àÈ˶¼ÖªµÀSQL×¢È룬Ҳ֪µÀSQL²ÎÊý»¯²éѯ¿ÉÒÔ·ÀÖ¹SQL×¢È룬¿ÉΪʲôÄÜ·ÀÖ¹×¢ÈëÈ´²¢²»ÊǺܶàÈ˶¼ÖªµÀµÄ¡£
±¾ÎÄÖ÷Òª½²ÊöµÄÊÇÕâ¸öÎÊÌ⣬ҲÐíÄãÔÚ²¿·ÖÎÄÕÂÖп´µ½¹ýÕâ¿éÄÚÈÝ£¬µ±È»ÁË¿´¿´Ò²ÎÞ·Á¡£
Ê×ÏÈ£ºÎÒÃÇÒªÁ˽âSQLÊÕµ½Ò»¸öÖ¸ÁîºóËù×öµÄÊÂÇ飺
¾ßÌåϸ½Ú¿ÉÒԲ鿴ÎÄÕ£ºSql Server ±àÒë¡¢ÖØ±àÒëÓëÖ´Ðмƻ®ÖØÓÃÔÀí
ÔÚÕâÀÎÒ¼òµ¥µÄ±íʾΪ£º ÊÕµ½Ö¸Áî -> ±àÒëSQLÉú³ÉÖ´Ðмƻ® ->Ñ¡ÔñÖ´Ðмƻ® ->Ö´ÐÐÖ´Ðмƻ®¡£
¾ßÌå¿ÉÄÜÓе㲻һÑù£¬µ«´óÖµIJ½ÖèÈçÉÏËùʾ¡£
½Ó×ÅÎÒÃÇÀ´·ÖÎöΪʲôƴ½ÓSQL ×Ö·û´®»áµ¼ÖÂSQL×¢ÈëµÄ·çÏÕÄØ£¿
Ê×ÏÈ´´½¨Ò»ÕűíUsers:
CREATE TABLE [dbo].[Users](
[Id] [uniqueidentifier] NOT NULL,
[UserId] [int] NOT NULL,
[UserName] [varchar](50) NULL,
[Password] [varchar](50) NOT NULL,
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE
= OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS
= ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
|

²åÈëһЩÊý¾Ý£º
INSERT INTO [Test].[dbo].[Users]([Id],[UserId],[UserName],[Password])VALUES (NEWID(),1,'name1','pwd1');
INSERT INTO [Test].[dbo].[Users]([Id],[UserId],[UserName],[Password])VALUES (NEWID(),2,'name2','pwd2');
INSERT INTO [Test].[dbo].[Users]([Id],[UserId],[UserName],[Password])VALUES (NEWID(),3,'name3','pwd3');
INSERT INTO [Test].[dbo].[Users]([Id],[UserId],[UserName],[Password])VALUES (NEWID(),4,'name4','pwd4');
INSERT INTO [Test].[dbo].[Users]([Id],[UserId],[UserName],[Password])VALUES (NEWID(),5,'name5','pwd5');
|
¼ÙÉèÎÒÃÇÓиöÓû§µÇ¼µÄÒ³Ãæ£¬´úÂëÈçÏ£º
ÑéÖ¤Óû§µÇ¼µÄsql ÈçÏ£º
select COUNT(*) from Users where Password = 'a' and UserName = 'b' |
Õâ¶Î´úÂë·µ»ØPassword ºÍUserName¶¼Æ¥ÅäµÄÓû§ÊýÁ¿£¬Èç¹û´óÓÚ1µÄ»°£¬ÄÇô¾Í´ú±íÓû§´æÔÚ¡£
±¾ÎIJ»ÌÖÂÛSQL ÖеÄÃÜÂë²ßÂÔ£¬Ò²²»ÌÖÂÛ´úÂë¹æ·¶£¬Ö÷ÒªÊǽ²ÎªÊ²Ã´Äܹ»·ÀÖ¹SQL×¢È룬ÇëһЩͬѧ²»Òª¾À½áÓëijЩ´úÂ룬»òÕߺÍSQL×¢ÈëÎ޹صÄÖ÷Ìâ¡£
¿ÉÒÔ¿´µ½Ö´Ðнá¹û£º

Õâ¸öÊÇSQL profile ¸ú×ÙµÄSQL Óï¾ä¡£

×¢ÈëµÄ´úÂëÈçÏ£º
select COUNT(*) from Users where Password = 'a' and
UserName = 'b' or 1=1¡ª'
ÕâÀïÓÐÈ˽«UserNameÉèÖÃΪÁË ¡°b' or 1=1 ¨C¡±.
ʵ¼ÊÖ´ÐеÄSQL¾Í±ä³ÉÁËÈçÏ£º


¿ÉÒÔºÜÃ÷ÏԵĿ´µ½SQL×¢Èë³É¹¦ÁË¡£
ºÜ¶àÈ˶¼ÖªµÀ²ÎÊý»¯²éѯ¿ÉÒÔ±ÜÃâÉÏÃæ³öÏÖµÄ×¢ÈëÎÊÌ⣬±ÈÈçÏÂÃæµÄ´úÂ룺
class Program
{
private static string connectionString = "Data Source=.;Initial Catalog=Test;Integrated Security=True";
static void Main(string[] args)
{
Login("b", "a");
Login("b' or 1=1--", "a");
}
private static void Login(string userName, string password)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand comm = new SqlCommand();
comm.Connection = conn;
//ΪÿһÌõÊý¾ÝÌí¼ÓÒ»¸ö²ÎÊý
comm.CommandText = "select COUNT(*) from Users where Password
= @Password and UserName = @UserName";
comm.Parameters.AddRange(
new SqlParameter[]{
new SqlParameter("@Password", SqlDbType.VarChar) { Value = password},
new SqlParameter("@UserName", SqlDbType.VarChar) { Value = userName},
});
comm.ExecuteNonQuery();
}
}
}
|
ʵ¼ÊÖ´ÐеÄSQL ÈçÏÂËùʾ£º
xec sp_executesql N'select COUNT(*) from Users where Password
= @Password and UserName
= @UserName',N'@Password varchar(1),@UserName varchar(1)',@Password='a',@UserName='b'
exec sp_executesql N'select COUNT(*) from Users where Password
= @Password and UserName
= @UserName',N'@Password varchar(1),@UserName varchar(11)',@Password='a',@UserName='b'' or 1=1¡ª'
|
¿ÉÒÔ¿´µ½²ÎÊý»¯²éѯÖ÷Òª×öÁËÕâЩÊÂÇ飺
1£º²ÎÊý¹ýÂË£¬¿ÉÒÔ¿´µ½ @UserName='b'' or 1=1¡ª'
2£ºÖ´Ðмƻ®ÖØÓÃ
ÒòΪִÐмƻ®±»ÖØÓã¬ËùÒÔ¿ÉÒÔ·ÀÖ¹SQL×¢Èë¡£
Ê×ÏÈ·ÖÎöSQL×¢ÈëµÄ±¾ÖÊ£¬
Óû§Ð´ÁËÒ»¶ÎSQL ÓÃÀ´±íʾ²éÕÒÃÜÂëÊÇaµÄ£¬Óû§ÃûÊÇbµÄËùÓÐÓû§µÄÊýÁ¿¡£
ͨ¹ý×¢ÈëSQL£¬Õâ¶ÎSQLÏÖÔÚ±íʾµÄº¬ÒåÊDzéÕÒ(ÃÜÂëÊÇaµÄ£¬²¢ÇÒÓû§ÃûÊÇbµÄ£¬) »òÕß1=1 µÄËùÓÐÓû§µÄÊýÁ¿¡£
¿ÉÒÔ¿´µ½SQLµÄÓïÒâ·¢ÉúÁ˸ı䣬Ϊʲô·¢ÉúÁ˸ıäÄØ£¿£¬ÒòΪûÓÐÖØÓÃÒÔǰµÄÖ´Ðмƻ®£¬ÒòΪ¶Ô×¢ÈëºóµÄSQLÓï¾äÖØÐ½øÐÐÁ˱àÒ룬ÒòÎªÖØÐÂÖ´ÐÐÁËÓï·¨½âÎö¡£ËùÒÔÒª±£Ö¤SQLÓïÒå²»±ä£¬¼´ÎÒÏëÒª±í´ïSQL¾ÍÊÇÎÒÏë±í´ïµÄÒâ˼£¬²»ÊDZðµÄ×¢ÈëºóµÄÒâ˼£¬¾ÍÓ¦¸ÃÖØÓÃÖ´Ðмƻ®¡£
Èç¹û²»Äܹ»ÖØÓÃÖ´Ðмƻ®£¬ÄÇô¾ÍÓÐSQL×¢ÈëµÄ·çÏÕ£¬ÒòΪSQLµÄÓïÒâÓпÉÄÜ»á±ä»¯£¬Ëù±í´ïµÄ²éѯ¾Í¿ÉÄܱ仯¡£
ÔÚSQL Server ÖвéѯִÐмƻ®¿ÉÒÔʹÓÃÏÂÃæµÄ½Å±¾£º
DBCC FreeProccache
select total_elapsed_time / execution_count ƽ¾ùʱ¼ä,total_logical_reads/execution_count Âß¼¶Á,
usecounts ÖØÓôÎÊý,SUBSTRING(d.text, (statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(text)
ELSE statement_end_offset END
- statement_start_offset)/2) + 1) Óï¾äÖ´ÐÐ from sys.dm_exec_cached_plans a
cross apply sys.dm_exec_query_plan(a.plan_handle) c
,sys.dm_exec_query_stats b
cross apply sys.dm_exec_sql_text(b.sql_handle) d
--where a.plan_handle=b.plan_handle and total_logical_reads/execution_count>4000
ORDER BY total_elapsed_time / execution_count DESC;
|

ÔÚÕâÆªÎÄÕÂÖÐÓÐÕâôһ¶Î£º

ÕâÀï×÷ÕßÓÐÒ»¾ä»°£º¡±²»¹ýÕâÖÖд·¨ºÍÖ±½ÓÆ´SQLÖ´ÐÐûɶʵÖÊÐÔµÄÇø±ð¡±
ÈÎºÎÆ´½ÓSQLµÄ·½Ê½¶¼ÓÐSQL×¢ÈëµÄ·çÏÕ£¬ËùÒÔÈç¹ûûÓÐʵÖÊÐÔµÄÇø±ðµÄ»°£¬ÄÇôʹÓÃexec ¶¯Ì¬Ö´ÐÐSQLÊDz»ÄÜ·ÀÖ¹SQL×¢ÈëµÄ¡£
±ÈÈçÏÂÃæµÄ´úÂ룺
private static void TestMethod()
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand comm = new SqlCommand();
comm.Connection = conn;
//ʹÓÃexec¶¯Ì¬Ö´ÐÐSQL¡¡
//ʵ¼ÊÖ´ÐеIJéѯ¼Æ»®Îª(@UserID varchar(max))select * from Users(nolock) where UserID in (1,2,3,4)
//²»ÊÇÔ¤ÆÚµÄ(@UserID varchar(max))exec('select * from Users(nolock) where UserID in ('+@UserID+')')
comm.CommandText = "exec('select * from Users(nolock) where UserID in ('+@UserID+')')";
comm.Parameters.Add(new SqlParameter("@UserID", SqlDbType.VarChar, -1) { Value = "1,2,3,4" });
//comm.Parameters.Add(new SqlParameter("@UserID", SqlDbType.VarChar, -1)
{ Value = "1,2,3,4); delete from Users;--" });
comm.ExecuteNonQuery();
}
} |
Ö´ÐеÄSQL ÈçÏ£º
exec sp_executesql N'exec(''select * from Users(nolock) where UserID in
(''+@UserID+'')'')',N'@UserID varchar(max) ',@UserID='1,2,3,4' |

¿ÉÒÔ¿´µ½SQLÓï¾ä²¢Ã»ÓвÎÊý»¯²éѯ¡£
Èç¹ûÄ㽫UserIDÉèÖÃΪ¡±
1,2,3,4); delete from Users;¡ª-
¡±,ÄÇôִÐеÄSQL¾ÍÊÇÏÂÃæÕâÑù£º
exec sp_executesql N'exec(''select * from Users(nolock) where UserID in
(''+@UserID+'')'')',N'@UserID varchar(max) ',@UserID='1,2,3,4); delete from Users;--' |
²»ÒªÒÔΪ¼ÓÁ˸ö@UserID ¾Í´ú±íÄܹ»·ÀÖ¹SQL×¢È룬ʵ¼ÊÖ´ÐеÄSQL
ÈçÏ£º

Èκζ¯Ì¬µÄÖ´ÐÐSQL ¶¼ÓÐ×¢ÈëµÄ·çÏÕ£¬ÒòΪ¶¯Ì¬Òâζ×Ų»ÖØÓÃÖ´Ðмƻ®£¬¶øÈç¹û²»ÖØÓÃÖ´Ðмƻ®µÄ»°£¬ÄÇô¾Í»ù±¾ÉÏÎÞ·¨±£Ö¤ÄãдµÄSQLËù±íʾµÄÒâ˼¾ÍÊÇÄãÒª±í´ïµÄÒâ˼¡£
Õâ¾ÍºÃÏñСʱºòµÄÌî¿ÕÌ⣬²éÕÒÃÜÂëÊÇ(____) ²¢ÇÒÓû§ÃûÊÇ(____)µÄÓû§¡£
²»¹ÜÄãÌîµÄÊÇʲôֵ£¬ÎÒËù±í´ïµÄ¾ÍÊÇÕâ¸öÒâ˼¡£
×îºóÔÙ×ܽáÒ»¾ä£ºÒòΪ²ÎÊý»¯²éѯ¿ÉÒÔÖØÓÃÖ´Ðмƻ®£¬²¢ÇÒÈç¹ûÖØÓÃÖ´Ðмƻ®µÄ»°£¬SQLËùÒª±í´ïµÄÓïÒå¾Í²»»á±ä»¯£¬ËùÒԾͿÉÒÔ·ÀÖ¹SQL×¢Èë,Èç¹û²»ÄÜÖØÓÃÖ´Ðмƻ®£¬¾ÍÓпÉÄܳöÏÖSQL×¢È룬´æ´¢¹ý³ÌÒ²ÊÇÒ»ÑùµÄµÀÀí£¬ÒòΪ¿ÉÒÔÖØÓÃÖ´Ðмƻ®¡£ |