basit bir tablomuz olsun.
CREATE TABLE [dbo].[users]( [rid] [int] NOT NULL, [username] [varchar](50) NOT NULL, [userpwd] [varchar](50) NOT NULL, CONSTRAINT [PK_users] PRIMARY KEY CLUSTERED ( [rid] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
ve tabloya 2-3 kayıt girelim.
===== Login formu için =====
<table> <tr> <td> usr name </td> <td> : </td> <td> <asp:TextBox ID="txtUserName" runat="server"></asp:TextBox> </td> </tr> <tr> <td> usr password </td> <td> : </td> <td> <asp:TextBox ID="txtUserPwd" runat="server" TextMode="Password"></asp:TextBox> </td> </tr> <tr> <td> </td> <td> </td> <td> <asp:Button ID="Button1" runat="server" Text="Ok" OnClick="Button1_Click" /> <asp:Button ID="Button2" runat="server" Text="Cancel" /> </td> </tr> </table> ===== Login Formunda blunan Button için ===== protected void Button1_Click(object sender, EventArgs e) { String query = String.Empty; Int32 retVl = -1;
query = String.Format("Select rcx=Count(rid) From dbo.users Where (username = \'{0}\' ) and (userpwd = \'{1}\')", txtUserName.Text, txtUserPwd.Text);
Label1.Text = query; //gonderilecek sorguyu incelemek icin gostertelim.
String sscon = "Data Source=THEBLACKSEA\\SQLEXPRESS;Initial Catalog=DBTmp;Persist Security Info=True;User ID=sa;Password=123456";
using (var scon = new SqlConnection(sscon)) { scon.Open();
using (SqlCommand scom = new SqlCommand(query, scon)) { try { retVl = Convert.ToInt32(scom.ExecuteScalar()); } catch (Exception exx) { Label3.Text = exx.Message; } }
scon.Close(); }
//girilen bilgiler SQL server 'dan kontrol edildi. normal koşullarda geriye 1 //dönmüş ise (bir kayıt bulunduysa) kayıt var mantığı güdülüp sisteme giriş sağlanabilir. //bu bloktan sonra geriye dönen kayıt sayısına göre sisteme girişe izin verilecek //ve gerekli atamalar yapılıp Response.Redirect("..."); }
şimdi alternatif 1: kullanıcı adını biliyormuyuz; biliyorsak "txtUserName" nesnesine kullanıcı adını girdik. "txtUserPwd" nesnesine 1' or '1'='1 değerini girdik. bu değer girişleri sonucu Ok dediğinizde girdiğimiz kullanıcının şifresini bilmediğimiz halde geriye 1 değer döndürecek buda sanki girilen bilgiler geçerli gibi bir etki yaratacak. kullanıcı adınıda biliyorsanız her iki kutuya benzer değerleri irebilirsiniz.
oları bir adım ilerletelim. kullanıcıların tutulduğutabloyu biliyoruz sayın.
kullanıcı adını girin parola kısmına aşağıdaki değeri girin. a'); drop table users;--
bu işlem SQL Server dan "users" tablosunu silecektir. bu ciddi bir atak!
projeler de sadece Login formları için güvenliği sağlamak yeterli değil, bu tür dışarıdan girilebilecek ve sisteme erişmeyi sağlana mekanizmaları devre dışı bırakmanız gerekiyor. sistem bu kontrol mekanizmasını "Stored Procedure" ile yapsaydık bu girişler hiçbir işe yaramayacaktı.
==== olayı birde procedur ile yapalım;
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE cUsers @username varchar(50), @userpwd varchar(50) AS BEGIN SET NOCOUNT ON;
SELECT COUNT(rid) FROM dbo.users WHERE(username = @username) AND (userpwd = @userpwd); END GO
login formuna yazacağımız kod; (procedure erişeceğiz)
protected void Button2_Click(object sender, EventArgs e) { Int32 retVl = -1;
String sscon = "Data Source=THEBLACKSEA\\SQLEXPRESS;Initial Catalog=DBTmp;Persist Security Info=True;User ID=sa;Password=123456";
using (var scon = new SqlConnection(sscon)) { scon.Open();
using (SqlCommand scom = new SqlCommand("cUsers", scon)) { scom.CommandType = System.Data.CommandType.StoredProcedure; scom.Parameters.Add(new SqlParameter("@username", System.Data.SqlDbType.VarChar,50)).Value = txtUserName.Text; scom.Parameters.Add(new SqlParameter("@userpwd", System.Data.SqlDbType.VarChar,50)).Value = txtUserPwd.Text;
try { retVl = Convert.ToInt32(scom.ExecuteScalar()); } catch (Exception exx) { Label3.Text = exx.Message; } }
scon.Close(); }
//dönen değere göre işlem yaptıracağız... } işlem procedure ile yapıldığında üste bahsettiğimiz iki işlemde işe yaramaz hale geliyor...
------------- http://www.kasatakip.com - Kasa Takip | http://www.caritakip.com - Cari Takip | http://www.evraktakip.com - Evrak Takip | http://www.etasqlmobil.com - ETA SQL Mobil
|