Bu sırada web.config, Panel Nesnesi, Stored Procedure gibi konulara da
değineceğiz.
Aşağıda verdiğim örnek, çoğu zaman kullandığımız Kayıt Formu ile Login Formundan oluşuyor. Kayıt olurken, email adresi ve parola bilgileri soruluyor. Bunun sonrasında parola bilgisi MD5 algoritması ile şifrelenip veritabanına veriler yazılıyor.
Login Formumuzda ise, aynı veriler istenerek, yine parolamız MD5 algoritması ile veritabanına gönderiliyor. Yani SQL'deki "Select" cümlesi aracılığı ile kontrolümüzü yapıyoruz.
Örneğimize geçmeden önce örneğimiz içerisinde kullandığımız Panel nesnemizin bazı özelliklerini inceleyelim.
Height = Panelimizin yüksekliği (pixel cinsinden)
Width = Panelimizin genişliği (pixel cinsinden)
BackColor = Panelimizin arkafon rengi
BackImageUrl = Panelimizin arkasında resim göstermek istiyorsak
BorderColor = Panelimizin sınır çizgisinin rengi
BorderWidth = Panelimizin sınır çizgisinin genişliği (pixel cinsinden)
Font = Panelimizin içerisinde gösterilecek metinlerin Font adı
Visible = Panelimizin görüntülenme ayarı (true/false değerleri alır)
Şimdi de veritabanına bağlanmak amaçlı kullandığımız bağlantı satırımızı nasıl kullandığımıza bakalım.
Klasik ASP içerisinde veritabanına bağlanmak istediğimizde bunu çoğu zaman asp dosyamızın içerisine yazıyorduk. Veya başka bir sayfaya yazıp, onu kullanacağımız sayfaya dahil ediyorduk. Hatırlarsanız bu yönteme "Include File" yöntemi deniyordu. Bu durum güvenlik açısından birçok açık ortaya çıkartmak ile beraber, yetersiz de kalıyordu.
.Net'te ise bu sıkıntılar atlatıldı. Şimdi projemiz ile ilgili birçok veriyi saklayabileceğimiz, güvenli bir dosyaya kavuştuk. İşte bu dosyanın adı web.config
Web.config dosyasının ayrıntılarını burada işleyemeyeceğim. Sadece veritabanı bağlantı satırımızı nasıl web.config sayfamıza yazmamız gerektiğini ve aspx dosyamızdan nasıl çağırıldığını göstereceğim.
Örneğin web.config dosyamızın içeriği:
Aşağıda verdiğim örnek, çoğu zaman kullandığımız Kayıt Formu ile Login Formundan oluşuyor. Kayıt olurken, email adresi ve parola bilgileri soruluyor. Bunun sonrasında parola bilgisi MD5 algoritması ile şifrelenip veritabanına veriler yazılıyor.
Login Formumuzda ise, aynı veriler istenerek, yine parolamız MD5 algoritması ile veritabanına gönderiliyor. Yani SQL'deki "Select" cümlesi aracılığı ile kontrolümüzü yapıyoruz.
Örneğimize geçmeden önce örneğimiz içerisinde kullandığımız Panel nesnemizin bazı özelliklerini inceleyelim.
Height = Panelimizin yüksekliği (pixel cinsinden)
Width = Panelimizin genişliği (pixel cinsinden)
BackColor = Panelimizin arkafon rengi
BackImageUrl = Panelimizin arkasında resim göstermek istiyorsak
BorderColor = Panelimizin sınır çizgisinin rengi
BorderWidth = Panelimizin sınır çizgisinin genişliği (pixel cinsinden)
Font = Panelimizin içerisinde gösterilecek metinlerin Font adı
Visible = Panelimizin görüntülenme ayarı (true/false değerleri alır)
Şimdi de veritabanına bağlanmak amaçlı kullandığımız bağlantı satırımızı nasıl kullandığımıza bakalım.
Klasik ASP içerisinde veritabanına bağlanmak istediğimizde bunu çoğu zaman asp dosyamızın içerisine yazıyorduk. Veya başka bir sayfaya yazıp, onu kullanacağımız sayfaya dahil ediyorduk. Hatırlarsanız bu yönteme "Include File" yöntemi deniyordu. Bu durum güvenlik açısından birçok açık ortaya çıkartmak ile beraber, yetersiz de kalıyordu.
.Net'te ise bu sıkıntılar atlatıldı. Şimdi projemiz ile ilgili birçok veriyi saklayabileceğimiz, güvenli bir dosyaya kavuştuk. İşte bu dosyanın adı web.config
Web.config dosyasının ayrıntılarını burada işleyemeyeceğim. Sadece veritabanı bağlantı satırımızı nasıl web.config sayfamıza yazmamız gerektiğini ve aspx dosyamızdan nasıl çağırıldığını göstereceğim.
Örneğin web.config dosyamızın içeriği:
<configuration> <appSettings> <add
key="strConn"
value="server=localhost;uid=dtuser;pwd=dtpass;database=dotnet" />
</appSettings> </configuration>
Gelelim aspx
dosyamızdan nasıl çağırabileceğimize:
string dbConnStr = ConfigurationSettings.AppSettings["strConn"];
Sanırım artık
konumuza dönebiliriz. İlgili tüm açıklamaları kod satırları arasında anlatmağa
çalıştım. Ayrıca CodeBehind yönetimi kullanarak kodladım. Bu yöntemden de kısaca
bahsetmek gerekirse, CodeBehind yöntemi ile kodumuz ile görselliğimizi tamamen
ayırıyoruz. Böylelikle tasarım değişikliği gibi durumlarda hiçbir sıkıntı
çekmiyoruz. Örneği incelediğinizde durumu da farkedeceksiniz.
Fakat öncelikle, veritabanamızın yapısını, stored procedure ve web.config dosyamızın ilgili kodlarını verelim.
Tablomuz:
registerUser
Fakat öncelikle, veritabanamızın yapısını, stored procedure ve web.config dosyamızın ilgili kodlarını verelim.
Tablomuz:
registerUser
user_id int
(IDENTITY) user_email varchar 255 user_password binary 16
Stored
Procedure:
sp_ins_regUser
sp_ins_regUser
CREATE PROCEDURE
sp_ins_regUser @user_email varchar(255), @user_password binary(16) AS INSERT
INTO registerUser (user_email, user_password) VALUES (@user_email,
@user_password) GO
sp_sel_loginCheck
CREATE PROCEDURE
sp_sel_loginCheck @uemail varchar(255), @upwd binary(16) AS SELECT user_id FROM
registerUser WHERE user_email = @uemail AND user_password = @upwd GO
Web.config
<configuration> <appSettings> <add
key="strConn"
value="server=localhost;uid=dtuser;pwd=dtpass;database=dotnet" />
</appSettings> </configuration>
İlk önce görsel
arayüzümün bulunduğu, kişinin kayıt olduğu sayfa olan:
register.aspx
<%@ Page Language="c#"
Inherits="registerForm.regForm" Src="register.aspx.cs"%> <html> <body> <asp:Panel
id="register" runat="server"> <form id="regForm"
method="post" runat="server"> <table cellspacing="0" cellpadding="3"
border="0"> <tr> <td colspan="2">Kayıt Formu</td>
</tr> <tr> <td><b>E-posta
Adresiniz</b></td> <td><asp:TextBox
id="emailAdr" runat="server"
MaxLength="255"></asp:TextBox></td> </tr>
<tr> <td><b>Parolanız</b></td> <td><asp:TextBox runat="server"
MaxLength="10" id="parola"
TextMode="Password"></asp:TextBox></td>
</tr> <tr> <td align="right" colspan="2"><asp:Button id="btnOk"
OnClick="doRegister" runat="server" text="Formu
Gönder"/></td> </tr> </table> </form> </asp:Panel> <asp:Panel
id="registerStatus" runat="server"> <asp:Label
id="lblInfo" runat="server"></asp:Label>
</asp:Panel> </body>
</html>
Bu sayfanın
kodlarını işleyen:
register.aspx.cs
using System; using System.IO; using System.Web.UI; //web textbox larına ulaşabilmemiz için gereken class
using System.Security.Cryptography; //md5 için gerekli
class using System.Text; //UTF fonksiyonu için
gerekli class using System.Data; //veritabanı işlemleri
için gerekli class using System.Data.SqlClient; //veritabanı
işlemleri için gerekli class using System.Configuration; //web.config dosyamızdan veri okuyabilmek amaçlı class
namespace registerForm { public class regForm : System.Web.UI.Page { //kodlamada kullanacağımız nesnelerimizi tanımlıyoruz.
protected System.Web.UI.WebControls.TextBox emailAdr; protected
System.Web.UI.WebControls.TextBox parola; protected
System.Web.UI.WebControls.Panel register; protected
System.Web.UI.WebControls.Panel registerStatus; protected
System.Web.UI.WebControls.Label lblInfo; public void Page_Load(Object Src,
EventArgs E) { //sayfa yüklendiğinde panellerimizin
görüntülenme ayarlarını yapıyoruz. //form ekranı ilk olarak görüntülenecek.
register.Visible = true; registerStatus.Visible = false; lblInfo.Text =
""; } //Formu Gönder butonuna tıklandığında
çalışan fonksiyonumuz protected void doRegister(object sender, System.EventArgs
e) { //girilen verileri alıyoruz. string
txtEmailAdr = emailAdr.Text; string txtParola = parola.Text; //işlem sonucu göstermek amaçlı ikinci panelimizi görünür kılıyoruz.
register.Visible = false; registerStatus.Visible = true; try { //parolanız şifrelenmesi için fonksiyona gönderiyoruz. //şifrelenmiş
verimiz byte haline geleceği için değişkenimizi //byte olarak tanımlıyoruz.
byte[] encyrptedPassword = md5Password(txtParola); //veritabanına
Email adresini ve şifrelenmiş Parolayı kayıt ediyoruz. SqlConnection
conn = new
SqlConnection(ConfigurationSettings.AppSettings["strConn"]);
conn.Open(); SqlCommand sc = new SqlCommand (); sc.Connection = conn;
sc.CommandType = CommandType.StoredProcedure; sc.CommandText =
"sp_ins_regUser"; sc.Parameters.Add("@user_email",
SqlDbType.VarChar, 255, "user_email");
sc.Parameters["@user_email"].Value = txtEmailAdr;
sc.Parameters.Add("@user_password", SqlDbType.Binary, 16,
"user_password"); sc.Parameters["@user_password"].Value =
encyrptedPassword; sc.ExecuteNonQuery(); conn.Close(); //try-catch
bloğuna soktuğumuz işlemimizde bir sorun çıkmadı ise //ziyaretçimizi
bilgilendiriyoruz. lblInfo.Text = "Kayıt işleminiz başarı ile
gerçekleştirilmiştir"; } catch { //veritabanında
bir hata oluştuysa ziyaretçimizi bilgilendiriyoruz. lblInfo.Text =
"Kayıt işleminiz sırasında bir hata oluştu. Lütfen tekrar
deneyiniz."; } } byte[] md5Password(string pass) { //md5 şifrelenmesi için verimizin byte haline gelmesi gerekli. //veri
8-bit şeklinde dönüştürülmesi için ilk önce UTF fonksiyonuna gönderiliyor.
UTF8Encoding encoder = new UTF8Encoding(); //md5 şifrelemesi için nesnemizi oluşturuyoruz.
MD5 md5 = new MD5CryptoServiceProvider(); //verimizi
md5 ile çalıştırıyoruz. //dikkat
ederseniz UTF fonksiyonundan dönen değeri GetBytes ile alabildik. byte[] donenDeger =
md5.ComputeHash(encoder.GetBytes(pass)); //şifrelenmiş
değerimizi geri gönderiyoruz. return donenDeger; } } }
Kullanıcı adı,
parola verilerinin girildiği görsel sayfa olan:
login.aspx
<%@ Page Language="c#"
Inherits="loginForm.Login" Src="login.aspx.cs"%> <html> <body> <asp:Panel
id="loginStatus" runat="server"> <asp:Label
id="lblInfo" runat="server"></asp:Label>
</asp:Panel> <asp:Panel
id="pnlLogin" runat="server"> <form
id="loginForm" method="post" runat="server"> <table cellspacing="0" cellpadding="3"
border="0"> <tr> <td colspan="2">Siteye Giriş</td>
</tr> <tr> <td><b>E-posta
Adresiniz</b></td> <td><asp:TextBox
id="emailAdr" runat="server"
MaxLength="255"></asp:TextBox></td> </tr>
<tr> <td><b>Parolanız</b></td> <td><asp:TextBox id="parola"
runat="server" MaxLength="10"
TextMode="Password"></asp:TextBox></td>
</tr> <tr> <td align="right" colspan="2"><asp:Button id="btnLogin"
OnClick="doLogin" runat="server" text="Formu
Gönder"/></td> </tr> </table> </form> </asp:Panel> </body> </html>
login.aspx
dosyamızı işleyen sayfamız:
login.aspx.cs
login.aspx.cs
using System; using System.IO; using System.Web.UI; //web textbox larına ulaşabilmemiz için gereken class
using System.Security.Cryptography; //md5 için gerekli
class using System.Text; //UTF fonksiyonu için
gerekli class using System.Data; //veritabanı işlemleri
için gerekli class using System.Data.SqlClient; //veritabanı
işlemleri için gerekli class using System.Configuration; //web.config dosyamızdan veri okuyabilmek amaçlı class namespace
loginForm { public class Login : System.Web.UI.Page { //kodlamada
kullanacağımız nesnelerimizi tanımlıyoruz. protected
System.Web.UI.WebControls.TextBox emailAdr; protected
System.Web.UI.WebControls.TextBox parola; protected System.Web.UI.WebControls.Panel
pnlLogin; protected System.Web.UI.WebControls.Panel loginStatus; protected
System.Web.UI.WebControls.Label lblInfo; public void Page_Load(object sender,
System.EventArgs e) { //sayfa yüklendiğinde
panellerimizin görüntülenme ayarlarını yapıyoruz. //form ekranı ilk olarak görüntülenecek. pnlLogin.Visible = true;
loginStatus.Visible = false; lblInfo.Text = ""; } //Formu Gönder butonuna tıklandığında çalışan fonksiyonumuz
protected void doLogin(object sender, System.EventArgs e) { //girilen verileri alıyoruz. string uid =
emailAdr.Text; string pwd = parola.Text; //işlem
sonucu göstermek amaçlı ikinci panelimizi görünür kılıyoruz.
pnlLogin.Visible = false; loginStatus.Visible = true; //parolanız
şifrelenmesi için fonksiyona gönderiyoruz. //şifrelenmiş verimiz byte haline
geleceği için değişkenimizi //byte olarak tanımlıyoruz. byte[]
encyrptedPwd = md5Password(pwd); //veritabanına ilgili
verileri göndererek kontrolümüzü yaparız. SqlConnection conn = new
SqlConnection(ConfigurationSettings.AppSettings["strConn"]);
conn.Open(); SqlCommand sc = new SqlCommand (); sc.Connection = conn;
sc.CommandType = CommandType.StoredProcedure; sc.CommandText =
"sp_sel_loginCheck"; sc.Parameters.Add("@uemail",
SqlDbType.VarChar, 255, "uemail");
sc.Parameters["@uemail"].Value = uid;
sc.Parameters.Add("@upwd", SqlDbType.Binary, 16, "upwd");
sc.Parameters["@upwd"].Value = encyrptedPwd; try { //Elimizdeki verilerle çalıştırdığımız SP'mizden geri bir
kolon, bir satır döndüğü //için SqlCommand nesnesinin ExecuteScalar() metodunu kullanıyoruz.
//user_id şuanda bizim işimize yaramıyor, fakat nasıl çekildiğini göstermek
amacı ile //bu satırı da kodumuza ekledim. string user_id =
sc.ExecuteScalar().ToString(); //Email ve parola doğru
ise bilgilendiriyoruz. lblInfo.Text = "Hoşgeldiniz "; } catch
{ //Email ve parola yanlışsa tekrar girmesini
istiyoruz. lblInfo.Text = "Yanlış E-posta Adresi/Parola. Lütfen
bilgilerinizi kontrol edip tekrar deneyiniz."; } conn.Close(); } byte[]
md5Password(string pass) { //md5 şifrelenmesi için
verimizin byte haline gelmesi gerekli. //veri 8-bit şeklinde dönüştürülmesi
için ilk önce UTF fonksiyonuna gönderiliyor. UTF8Encoding encoder = new
UTF8Encoding(); //md5 şifrelemesi için nesnemizi oluşturuyoruz.
MD5 md5 = new MD5CryptoServiceProvider(); //verimizi
md5 ile çalıştırıyoruz. //dikkat ederseniz UTF fonksiyonundan dönen değeri
GetBytes ile alabildik. byte[] donenDeger =
md5.ComputeHash(encoder.GetBytes(pass)); //şifrelenmiş
değerimizi geri gönderiyoruz. return donenDeger; } } }
Hiç yorum yok:
Yorum Gönder