<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tunahan.net &#187; SQL</title>
	<atom:link href="http://www.tunahan.net/tag/sql/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.tunahan.net</link>
	<description>Tunahan H. MADEN Personal Page</description>
	<lastBuildDate>Thu, 01 Jul 2010 23:48:59 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>SQL &#8211; Stored Prosedür Oluşturmak</title>
		<link>http://www.tunahan.net/2010/01/29/sql-stored-prosedur-olusturmak/</link>
		<comments>http://www.tunahan.net/2010/01/29/sql-stored-prosedur-olusturmak/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 17:25:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ASP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[EXEC]]></category>
		<category><![CDATA[ISBN]]></category>
		<category><![CDATA[Kod]]></category>
		<category><![CDATA[Oluşturmak]]></category>
		<category><![CDATA[Procedure]]></category>
		<category><![CDATA[Prosedür]]></category>
		<category><![CDATA[Source]]></category>
		<category><![CDATA[Stored]]></category>

		<guid isPermaLink="false">http://www.tunahan.net/?p=136</guid>
		<description><![CDATA[Prosedür ne demektir?
Nesneye dayalı programlama bu kadar popüler değilken, programlar sadece prosedür denilen parçacıklardan oluşurdu. Her bir prosedür, belli bir işlevi yerine getimrke için özenle yapılandırılmış program parçacığıdır. Mesela, iki sayı alıp bunların toplamlarını hesaplayan bir kod parçasını toplayıcı adında bir prosedür içerisine paketleyebiliriz. Bir prosedür, başka bir prosedür içerisinden çağrılabilir. Bu da sık kullanılan [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Prosedür ne demektir?</p>
<p></strong>Nesneye dayalı programlama bu kadar popüler değilken, programlar sadece prosedür denilen parçacıklardan oluşurdu. Her bir prosedür, belli bir işlevi yerine getimrke için özenle yapılandırılmış program parçacığıdır. Mesela, iki sayı alıp bunların toplamlarını hesaplayan bir kod parçasını toplayıcı adında bir prosedür içerisine paketleyebiliriz. Bir prosedür, başka bir prosedür içerisinden çağrılabilir. Bu da sık kullanılan işlemler için yazılmış kodların bir defa yazılıp çok defa kullanılmasını böylelikle de programlamayı kolyalaştırmayı amaçlar.</p>
<p>Saklı prosedürler, bir çok gelişmiş programlama dilindeki fonksiyon yapılarına karşılık gelir. Birden fazla işlemi, paketlenmiş bir halde bir tek komut ile çalıştırmamız gerektiğinde stored procedures kullanılır. İşlemden kasıt T-SQL ile yapılabilen her şeydir.</p>
<p>Stored procedure, 1980’li yılların sonunda Sybase SQLServer ile birlikte kullanıma girdi. En büyük özelliği sorguların önceden hazırlanması(derlenemesi) ve VTYS ile aynı uzayda çalışmasından dolayı daha hızlı sonuç vermesidir.</p>
<p>Bir SP oluşturulduktan sonra, veritabanı sunucusunda saklanır. Her ihtiyaç duyulduğunda aynı sp defalarca çağrılabilir. Cursor gibi oturum kapandığında silinmez.</p>
<p>Network bazlı çalışmalarda ağ trafiği ve sistem kaynaklarının kullanımın düzenleyerek de performans artışı sağlar. Bir dize işlem, bir tek paket içerisinde yer alır. Gerektiğinde bir tek komut ile tetiklenebilir. Paketin tamamı çalışıncaya kadar istemde bulunan terminale hiçbir şey gönderilmez. Tüm komutlar bittiğinde bir tek sonuç gönderilir. Bu da bazı durumlarda ağ trafiğini rahatlatır.<br />
Bir SP sistem tarafından oluşturulduğu anda şu aşamalara tabi tutulur:</p>
<p><strong>1.</strong> SP’nin bileşenleri parçalara ayrıştırılır<br />
<strong>2.</strong> Veritabanı içerisinde table,view gibi başka nesnelere atıfta bulunan referanslar varsa, geçerli olup olmadıkları kontrol edilir.(Geçerli:1-nesne varmı, 2-izin var mı)<br />
<strong>3.</strong> Kontrollerden geçen SP’nin adı sysobjects tablosuna, kodları ise syscomments tablosuna saklanır.<br />
<strong>4.</strong> Bu işlemlerle birlikte derleme işlemi yapılır. Normalizasyon işlemleri olarak da anılan bu işlemler sonucunda, ağaç şeması elde edilir. Bu şema da sysprocedures tablosunda saklanır.<br />
<strong>5.</strong> SP herhangi bir anda çağrıldığında, ilk kez çalışıyorsa bu işlemler gerçekleştirilir. İlk sefa çağrılmıyorsa, kontrol, sorgulama ağacı oluşturma işlemleri yapılmaz ve oldukça hızlı bir şekilde SP’nin derlenmiş hali çalışır. Bundan dolayı sp’ler derlenen nesnelerden biri olarak anılır.</p>
<p><strong>SP’ler şu faydaları sağlar:</strong></p>
<p><strong>1.</strong> Uygulamanın getirdiği bazı iş kuralları prosedür içinde tanımlanabilir. Bir kez oluştuktan sonra bu kurallar birden çok uygulama tarafından kullanılarak daha tutarlı bir veri yönetimi sağlanır. Ayrıca bir fonksiyonelliğin değişmesi ihtiyacı doğduğunda her uygulama için değişiklik yapmak yerine, sadece bir platformda değişiklik yapılır.</p>
<p><strong>2.</strong> Tüm prosedürler üstün performansla çalışır ancak birden fazla çalıştırılacak olan prosedürler sorgulama planları procedure cache içinde saklandığından daha da hızlı çalışırlar.<br />
<strong>3.</strong> Stored Procedure’ ler SQL Server start ettikten sonra otomatik olarak çalıştırılmak üzere ayarlanabilirler.<br />
4. Stored Procedure’ ler harici olarak kullanılırlar. Trigger’ lardan farklı olarak prosedürler uygulama tarafından ya da script tarafından bir şekilde çağrılmak zorundadırlar. Otomatik devreye giremezler.<br />
<strong>5.</strong> Stored Procedure’ lerın içinde SQL sorgulama diline ek olarak T-SQL komutlarını kullanabiliriz.<br />
<strong>6.</strong>Kullanıcının bir tabloya erişim izni olmasa bile o tablo üzerinde işlem yapan bir stored procedure’ ü kullanma izni olabilir.</p>
<p><strong>SP oluşturma:</strong></p>
<p><span style="background-color: #ffffff;">CREATE PROC [ EDURE ] procedure_name [ ; number ]<br />
[ { @parameter data_type }<br />
[ VARYING ] [ = default ] [ OUTPUT ]  ]<br />
[ ,...n ]</span><br />
<strong>Örnek:<br />
</strong>Çalıştırıldığı tarih itibariyle, aldığı kitapları getirmeyen üyelerin adını veren bir SP yazalım:</p>
<p>CREATE  PROCEDURE sp_cezaliUye<br />
AS<br />
&#8211; Bugünün tarihini al<br />
DECLARE @buGun DATETIME<br />
SET  @buGun = GetDate()</p>
<p>SELECT uyeAdi FROM odunc<br />
WHERE geldiMi=0 AND VermeTarihi + VermeSuresi &lt; @buGun<br />
&#8211; bugünden önce gelmesi gereken ödünç işlemlerindeki üye adını seç.</p>
<p><strong>Daha sonra bu SP şu komut ile çağrılır:</strong></p>
<p><strong>EXEC sp_cezaliUye</strong><br />
&#8211; sp_cezaliUye stored procedure&#8217;ünü çalıştır.</p>
<p>SP üstünde değişiklik yapmak istediğimizde ise,</p>
<p><strong>Sp_helptext sp_adi</strong></p>
<p>Diyerek SP’nin içeriğini görebiliriz.<br />
Daha sonra bu içeriği Query Analyzer kod penceresine yapıştırıp,</p>
<p>ALTER PROCEDURE sp_cezaliUye<br />
AS</p>
<p>DECLARE @buGun DATETIME<br />
SET  @buGun = GetDate()</p>
<p>SELECT uyeAdi FROM odunc<br />
WHERE geldiMi=0 AND VermeTarihi + VermeSuresi &lt; @buGun</p>
<p>Diyerek yeni halini kaydettirebiliriz.</p>
<p><strong>İPUCU:</strong><br />
Bir çok işlemi kod yazmaksızın yapmayı sağlayan Enterprise Manager’i kullanarak sp’leri de kolayca değiştirebilirisiniz. Bunun için Enterprise manager ile bir sp’yi seçip çift tıklamak yeterlidir.</p>
<p><strong>SP’ye parametre yollama:<br />
</strong>Bazen SP’ler dışarıdan parametre alabilirler:</p>
<p><strong>Örnek:</strong><br />
Herhangi bir tarih verildiğinde, bu tarihte süresi bittiği halde teslim edilmeyen kitapları bulan bir SP yazalım ancak tarih olarak bu günden daha büyük bir parametre alamasın. Böyle bir durum olduğunda, bu günün tarihini versin.</p>
<p>CREATE  PROCEDURE <a style="color: #000000; font-family: Arial; text-decoration: none;" href="mailto:sp_cezaliUye_1@referansTarih">sp_cezaliUye_1@referansTarih</a> DATETIMEASDECLARE @buGun DATETIME SET @buGun = GetDate()IF @referansTarih &gt; @buGun SET @referansTarih = @buGun &#8212; şayet, bugünün tarihi referans tarihten küçük ise,<br />
referans tarihi bugünün tarihi ile değiştir.<br />
SELECT uyeAdi FROM odunc<br />
WHERE geldiMi=0 AND VermeTarihi + VermeSuresi &lt; @referansTarih<br />
&#8211; bugün veya daha eski bir tarihte, gelmemiş kitapları alan üyelerin listesini veren sorgu</p>
<p>Bazen dışarıdan gelen parametrelerin isteğe bağlı olması istenebilir.<br />
Bu durumda DEFAULT değer atama seçeneği kullanılır. Şayet dışarıdan parametreye değer atanmazsa, geçerli değer default atanmış değer olarak alınır ve işlem yapılır:</p>
<p><strong>Örnek:</strong><br />
CREATE  PROCEDURE sp_cezaliUye_2<br />
@referansTarih DATETIME = NULL<br />
&#8211; dışarıdan referans tarihi gelmedi ise, NULL olarak kabul et.<br />
AS</p>
<p>DECLARE @buGun DATETIME<br />
SET  @buGun = GetDate()</p>
<p>IF (@referansTarih IS NULL) OR (@referansTarih&gt;@buGun)<br />
SET @referansTarih = @buGun<br />
&#8211; Referans tarih gelmedi ise veya bugünün tarihinden büyük ise, bugünün tarihini al.</p>
<p>SELECT uyeAdi FROM odunc<br />
WHERE geldiMi=0 AND VermeTarihi + VermeSuresi &lt; @referansTarih<br />
Go</p>
<p>şeklinde yazabiliriz. Daha sonra</p>
<p>EXEC sp_cezaliUye_2 @referansTarih=’01.01.2003’</p>
<p><strong>İle veya</strong></p>
<p>EXEC sp_cezaliUye_2<br />
Diyerek sp’yi çağırabiliriz.</p>
<p><strong>DİKKAT:</strong><br />
SP’de bir parametre için default değer tanımı yaparken, bu değerin sabit bir değer veya NULL olması gerektiğine dikkat etmelidir.</p>
<p><strong>İPUCU:</strong><br />
Bazı durumlarda, SP içerisinde SQL ifadesini bir değişkene atamak suretiyle durumlara göre dinamik olarak meydana getirip, daha sonra da onu çalıştırabiliriz. Bu durumda da EXEC fonksiyonu kullanılır. EXEC fonksiyonu, bir stored procedure batch&#8217;in ilk ifadesi değil ise de stored procedure çalıştırılırken kullanılmak zorundadır.</p>
<p><strong>Örnek:</strong></p>
<p>&#8212; Yanlış ifade(çalışmaz):<br />
DECLARE @isim VARCHAR(10)<br />
&#8230;<br />
sp_cezaliUye_2</p>
<p>&#8211; Doğru ifade(çalışır)<br />
DECLARE @isim VARCHAR(10)<br />
&#8230;.<br />
EXEC sp_cezaliUye_2</p>
<p><strong>Örnek:</strong><br />
Kitaplar tablosu üstünde aşağıdaki parametrelere göre arama yapabilecek bir SP yazalım. Parametrelerden gelenler için filtreleme yapılsın.<br />
Dışarıdan alınabilecek Parametreler: ISBNNo, KitapAdi, Yazari, Ozeti</p>
<p>CREATE  PROCEDURE sp_kitapBul<br />
@ISBNNo CHAR(16) =NULL,<br />
@KitapAdi VARCHAR(55)=NULL,<br />
@kitapYazari VARCHAR(55)=NULL,<br />
@KitapOzeti VARCHAR(55)=NULL<br />
AS</p>
<p>DECLARE @sSQL VARCHAR(500)<br />
&#8211; Bir SQL değişkeni tanımlıyoruz<br />
Set @sSQL= &#8216;SELECT * FROM Kitap WHERE 1=1 &#8216;<br />
IF @ISBNNo IS NOT NULL<br />
SET @sSQL = @sSQL + &#8216;  AND ISBNNo = &#8221;&#8217; + @ISBNNo + &#8221;&#8221;<br />
&#8211; ISBNNo parametresi null değilse sorguya ekliyoruz.</p>
<p>IF @KitapAdi IS NOT NULL<br />
SET @sSQL <a style="color: #000000; font-family: Arial; text-decoration: none;" href="mailto:=@sSQL">=@sSQL</a> + &#8216; AND KitapAdi  LIKE  &#8221;%&#8217;  + @KitapAdi +  &#8216;%&#8221;&#8217;<br />
&#8211; KitapAdi parametresi NULL değil ise sorguya ekliyoruz.</p>
<p>IF @KitapYazari IS NOT NULL<br />
SET @sSQL = @sSQL + &#8216; AND KitapYazari  LIKE  &#8221;%&#8217;  + @KitapYazari +  &#8216;%&#8221;&#8217;<br />
&#8212;KitapYazari Null değil ise sorguya ekliyoruz.</p>
<p>IF @KitapOzeti   IS NOT NULL<br />
SET @sSQL = @sSQL + &#8216;  AND KitapOzeti  LIKE  &#8221;%&#8217;  + @KitapOzeti +  &#8216;%&#8221;&#8217;<br />
&#8211; kitapOzeti null değil ise sorguya ekliyoruz.<br />
print @sSQL &#8211;nasıl bir SQL oluşturduğumuzu yazdırıyoruz.</p>
<p>EXEC(@sSQL)<br />
&#8211; bir VARCHAR değişkenin içerdiği T-SQL ifadesini çalıştırıyoruz.</p>
<p>Farklı parametre değerleri ile SP’yi çağırabiliriz:</p>
<p>&#8211; sadece ISBN vererek çağıralım<br />
EXEC Sp_kitapBul @ISBNNo=’12345’<br />
&#8211; ISBN ve KitapAdi parametreleri ile çağırma<br />
EXEC Sp_kitapBul @ISBNNo=’12345’, @kitapAdi=’Yol’</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tunahan.net/2010/01/29/sql-stored-prosedur-olusturmak/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL Injection &#8211; Korunma Yollari</title>
		<link>http://www.tunahan.net/2010/01/29/sql-injection-korunma-yollari/</link>
		<comments>http://www.tunahan.net/2010/01/29/sql-injection-korunma-yollari/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 17:21:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ASP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Injection]]></category>
		<category><![CDATA[Korunma]]></category>
		<category><![CDATA[Şifre]]></category>
		<category><![CDATA[Yollari]]></category>

		<guid isPermaLink="false">http://www.tunahan.net/?p=133</guid>
		<description><![CDATA[Yazıya başlamadan önce belirtmek istediğim şey; bu makale bazı SQL injeksiyon yöntemlerinin nasıl yapıldığı konusunda öğretici bilgi içerebilir. Bu bilgileri ben sadece olası yapılabilecek hataların düzeltilmesi maksadıyla yayınlıyorum. Bu yazı kötü amaçlı olarak yazılmamıştır.
Dünyanin her tarafinda, kullanicilarina; kredi karti numaralari, kullanici bilgileri gibi gizli kalmasi gereken bilgilerin, ürünlere ve siparislere ait verilerin saklandigi uç-arka veri [...]]]></description>
			<content:encoded><![CDATA[<p><em><strong>Yazıya başlamadan önce belirtmek istediğim şey; bu makale bazı SQL injeksiyon yöntemlerinin nasıl yapıldığı konusunda öğretici bilgi içerebilir. Bu bilgileri ben sadece olası yapılabilecek hataların düzeltilmesi maksadıyla yayınlıyorum. Bu yazı kötü amaçlı olarak yazılmamıştır.</strong></em></p>
<p>Dünyanin her tarafinda, kullanicilarina; kredi karti numaralari, kullanici bilgileri gibi gizli kalmasi gereken bilgilerin, ürünlere ve siparislere ait verilerin saklandigi uç-arka veri depolariyla hizmet veren web siteleri bulunmaktadir. Ve genel olarak, web sitelerindeki form araciligi ile alinan girdi ile veritabanindaki bilgiler filtrelendikten sonra sonucu kullaniciya gönderen bu tür sistemlerde Yapisal Sorgulama Dili (Structured Query Language &#8211; SQL) kullanilmaktadir. Uygulama içerisinde kullanilacak parametre degerleri alinirken kullanilan formun SQL Deyimini yeniden yapilandirabilecek bazi özel karakterlere izin vermesiyle güvenlik problemleri ortaya çikmaktadir.</p>
<p>Bu güvenlik problemleri kullanilarak bir uygulamanin arkasinda, bu uygulamaya destek veren veri tabani üzerindeki bütün bilgilere ulasilabilir veya bilgiler üzerinde degisiklik yapilabilir. Veya veri tabani sisteminin komutlari kullanilarak kullanilan sunucular üzerinde uygulama harici istenen islemler de yapilabilir. Bu problemlerden korunmak için de uygulama girdilerini bu tür karakterlere karsi kontrol eden fonksiyonlarin kullanilmali ve genis çapli uygulamalarin bu güvenlik açiklarini tasiyip tasimadigini anlamak için güvenlik denetimine tabi tutulmalidir..</p>
<p>Ilgilendiren Sektör ve Sirketler:</p>
<p>Özel olarak gelistirilmis uygulamalar kullanan tüm kurum ve kuruluslar<br />
Internet / Intranet üzerinde uygulama gelistiren kuruluslar</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>1. Bir Uygulama Güvenligi Problemi &#8211; &#8216;Yapisal Sorgulama Dili Kullanimi&#8217;</p>
<p>Yapisal Sorgulama Dili SQL&#8217;in uygulamalarda kullanimina örnek vermek gerekirse;</p>
<p>select Name, Address FROM Users WHERE UserID = &#8216;2081&#8242;</p>
<p>Seklindeki SQL Deyimi &#8216;Users&#8217; adli tablodan &#8216;2081&#8242; ürün ID si ile veritabanina kayitli olan kisiye ait olan isim ve adres bilgilerini dönecektir. Bu noktada muhtemel zayiflik, kullanilan formun SQL Deyimini yeniden yapilandirabilecek bazi özel karakterlere izin vermesiyle ortaya çikmaktadir. Çözümü ise girdilerden bu özel karakterlerin filtrelenmesini saglayan fonksiyonlardir.</p>
<p>Hizla gelisen internet teknolojileri karsisinda yeni pazarda geç olmadan yerini almak isteyen müsterilerine daha kisa sürede daha kullanisli ve ucuz çözümler sunmak zorunda olan uygulama gelistiriciler bu süreçte güvenlik gibi önemli bir faktörü ikinci plana atmaktadirlar.</p>
<p>Giderek yayginlasan ve medyanin haber potansiyelini olusturan; çalinan kredi karti numaralari, yer alti sitelerde dagitilan müsteri bilgileri, sirket projeleri &#8211; yazismalari yaklasan tehlikenin habercisi olmakla beraber halen bu tür kayiplarin yaratabilecegi maddi sonuçlari kavrayamayan ve hala &#8216;az maliyetle kurtarilan güvenlik projeleri&#8217; &#8216;yle övünen yöneticilere uyari niteligi tasimaktadir. Öyleki -herzaman bir adim önde olmayi amaçlayan- saldirganlar güvenligin en üst seviyede olmasi beklenen devlet siteleri de dahil olmak üzere pek çok sisteme yönelik saldirilarina da ara vermeksizin devam etmektedirler.</p>
<p>Maddi ve manevi degere sahip sirketinizi bir anlamda is ortaklarini olan uygulama gelistiricilerin hazirladiklari uygulama ürünlerine emanet edildigini düsünürsek, &#8216;uygulamalariniza ne kadar güvenirsiniz?&#8217; gibi bir soruya verilecek cevap büyük önem tasimaktadir.</p>
<p>Böyle bir ortamda uygun güvenlik çözümü için ayrilmis bütçe bir lüks degil her an yapilabilecek bir saldirida sirketin ugrayacagi zarari ortadan kaldirmak için alinmasi gereken önlem niteligi tasimaktadir.</p>
<p>2. Örnek Saldirilar &#8211; &#8216;Yapilacak Hamleleri Önceden Tahmin Edebilmek&#8230;&#8217;</p>
<p>Güvenlikte sikça kullanilan bir deyim; &#8216;Saldirganlardan korunabilmek için onlar gibi düsünmelisiniz!..&#8217;. Saldirganin sisteminize girmek için kullanabilecegi yöntemleri bilmek bu saldirilardan korunabilmek için alinan önlemleri daha saglikli kilacaktir.</p>
<p>Örneklerde kullanacagimiz hedef ; Microsoft® Internet Information Server™&#8217; dan Microsoft® SQL Server™&#8217;a varsayilan sistem hesabi&#8217;ndan (sa) baglanan ASP tabanli bir kullanici hesabi yöneticisi olacak.<br />
Form.asp : Username ve Password girdisini alan form.Solda&#8230;<br />
Login.asp : Veritabani ile baglantiya geçen ve girdinin dogrulugunu kontrol eden ASP kodu.</p>
<p>2.1. Kötü Amaçli (&#8217;) Imleçleri Yardimiyla Izinsiz Giris Saglama:</p>
<p>Kullanici &#8216;Username&#8217; &amp; &#8216;Password&#8217; verisini Login.asp ye yolladiktan sonra .asp kodunun yapacagi is verilen yoldaki veritabani ile baglanti kurup ilgili tabloda Username ve Password sütünlarinda gönderilen verinin dogrulugunu kontrol etmek olacaktir. Bu islem sonucunda eger sonuç olumluysa kullaniciya; &#8216;Giris Yapildi&#8217; olumsuzsa; &#8216;Geçersiz Kullaniciadi &amp; Sifre&#8217; mesaji verilecektir.<br />
Örnekleyecek olursak;</p>
<p>Username : ilkay<br />
Password : 2081</p>
<p>Seklindeki kullanici girdisi asagidaki SQL Deyimini olusturacaktir;</p>
<p>select count(*) FROM Users WHERE Username = &#8216;ilkay&#8217; AND Password = &#8216;2081&#8242;</p>
<p>Ilk bakista sorun olmayan bir SQL Deyimi&#8230; Fakat saldirganin;</p>
<p>Username : ilkay<br />
Password : &#8216; OR 1=1&#8211;</p>
<p>Seklindeki girdilerle olusturacagi SQL Deyimi ise;</p>
<p>select count(*) FROM Users WHERE Username = &#8216;ilkay&#8217; AND Password = &#8221; OR 1=1 &#8211;&#8217;</p>
<p>Olacaktir ki, bu durumda girisin saglanmasi için sart &#8216;ilkay&#8217; kullanici adina ait sifrenin hiçbirsey* olmasi veya ikinci bir opsiyon olarak 1=1 esitliginin saglanmasidir.</p>
<p>* Hiçbisey = Bosluk</p>
<p>Sonuç : 1=1 esitligi saglandigina göre saldiri basariyla sonuçlanacak ve &#8216;Giris Yapildi&#8217; mesaji verilecektir.</p>
<p>Not : Microsoft® SQL Server™ &#8216;&#8211;&#8217; imlecinden sonra gelen yersiz kullanilmis tirnak isaretlerini göz ardi edecektir. Ilk bakista basit gibi görünen ve sadece SQL Server&#8217;a ait olan bu özellik ilerde örneklerden de anlasilacagi üzere saldirgana büyük kolaylik saglayacaktir..</p>
<p>2.2. Uzaktan Çalistirilmasi Mümkün Olan Prosedürler:</p>
<p>MS SQL Server&#8217;a varsayilan sistem hesabindan yaptigimiz baglanti SQL Enjeksiyon saldirisinda muhtemel saldirgana sunucuda saklanan prosedürleri çalistirabilmesi için gerekli haklari taniyacaktir. Saldirganin kullanabilecegi prosedürlerden bir tanesi; &#8216;master..xp_cmdshell&#8217; olabilir.</p>
<p>Username : ilkay<br />
Password : &#8216;; EXEC master..xp_cmdshell &#8216;dir c:&#8217;&#8211;</p>
<p>Girdileriyle olusacak SQL Deyimi;</p>
<p>select count(*) FROM Users WHERE Username = &#8216;ilkay&#8217; AND Password = &#8221;; EXEC master..xp_cmdshell &#8216;dir c:&#8217;&#8211;&#8217;</p>
<p>Sonuç : SQL Server Kullaniciadi ve Sifreyi bulunduran sütunlari arayacaktir bulamadigi için &#8216;Yanlis Kullaniciadi &amp; Sifre&#8217; mesajini verecektir fakat bu arada arka planda &#8216;dir c:&#8217; komutunu çalistiracak ve saldirgan C sürücüsünün içerigine ulasacaktir.</p>
<p>2.3. SQL Server Hedef Alinarak Yapilan Saldirilar:</p>
<p>Yönetici haklarina sahip saldirgan silme,ekleme,degistirme&#8230;vb gibi komutlari rahatlikla çalistirabilecektir.</p>
<p>SHUTDOWN WITH NOWAIT SQL Server&#8217;in kritik komutlarindan bir tanesidir. Komutla beraber SQL Server görevine son verir.</p>
<p>Username : &#8216;; SHUTDOWN WITH NOWAIT&#8211;<br />
Password : [Bos]</p>
<p>Bu girdilerle olusturulan SQL Deyimi;</p>
<p>select Username FROM Users WHERE Username=&#8221;; SHUTDOWN WITH NOWAIT; &#8211;&#8217; AND Password=&#8221;</p>
<p>Sonuç : SQL Server kullaniciadinin bulunamadigi mesajini verecektir. Fakat bununla beraber arka planda diger komutu çalistirdigi için SQL Server kapanacaktir.</p>
<p>2.4. ODBC Hatalarindan Faydalanarak Yapilan Saldirilar:</p>
<p>SQL Server&#8217;in verdigi hatalardan faydalanarak veritabanindaki neredeyse tüm bilgilere ulasmak mümkündür.</p>
<p>Hedef; http://Victim/Default.asp?id=10 seklinde ürün ID leri ile çalisan ASP tabanli bir websitesi.</p>
<p>Saldiri SQL Server&#8217;in integer ve string cinsinden verileri birlikte gönderememesinden faydalinarak yapilabilir;</p>
<p>Gönderilen &#8216;10&#8242; sayisina veritabanindan herhangi bir string eklenir.</p>
<p>http://Victim/Default.asp?id=10 UNION select TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES&#8211;</p>
<p>Not: &#8216;INFORMATION_SCHEMA.TABLES&#8217; sistem tablosu, sistemde bulunan diger tüm tablolar hakkinda bilgi içerir. Deyimde kullanilan &#8216;TABLE_NAME&#8217; de yine tüm tablo isimlerini içerir.</p>
<p>Olusacak SQL Deyimi;</p>
<p>select TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES</p>
<p>String -&gt; Integer dönüsümünü yapamayan SQL Server asagidaki hatayi verecektir.</p>
<p>Microsoft OLE DB Provider for ODBC Drivers error &#8216;80040e07&#8242;<br />
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value &#8216;Table1&#8242; to a column of data type int.<br />
/Default.asp, line 5</p>
<p>Hata, saldirgana &#8216;Table1&#8242; olarak buldugu cevabi integer a çeviremedigini (dolayisiyla veritabanindaki ilk tablo adinin &#8216;Table1&#8242; oldugunu) belirtmektedir. Saldirgan diger tablolarin adini asagidaki sekilde ögrenebilir&#8230;</p>
<p>http://Victim/Default.asp?id=10 UNION select TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN (&#8217;Table1&#8242;)&#8211;</p>
<p>Veya dogrudan LIKE komutunu kullanarak aradigi seye daha kolay yoldan ulasabilir;</p>
<p>http://Victim/Default.asp?id=10 UNION select TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE &#8216;%/%25Login%/%25&#8242;&#8211;</p>
<p>SQL Server&#8217;in verecegi hata;</p>
<p>Microsoft OLE DB Provider for ODBC Drivers error &#8216;80040e07&#8242;<br />
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value &#8216;Admin_Login&#8217; to a column of data type int.<br />
/Default.asp, line 5</p>
<p>Admin_Login adinda bir tablo oldugunu ögrenen saldirgan muhtemelen tablodaki ilk kullaniciadi ve sifreye ulasmak isteyecektir. Izleyebilecegi yol ise;</p>
<p>http://Victim/Default.asp?id=10 UNION select TOP 1 Username FROM Admin_Login&#8211;</p>
<p>Hata;</p>
<p>Microsoft OLE DB Provider for ODBC Drivers error &#8216;80040e07&#8242;<br />
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value &#8216;ilkay&#8217; to a column of data type int.<br />
/Default.asp, line 5</p>
<p>Bu sekilde &#8216;admin&#8217; kullaniciadinin varligini dogrulayan saldirganin sifreyi ele geçirmek için kullanacagi girdi;</p>
<p>http://Victim/Default.asp?id=10 UNION select TOP 1 Password FROM Admin_Login WHERE Username=&#8217;ilkay&#8217;&#8211;</p>
<p>Hata;</p>
<p>Microsoft OLE DB Provider for ODBC Drivers error &#8216;80040e07&#8242;<br />
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value &#8216;2081&#8242; to a column of data type int.<br />
/Default.asp, line 5</p>
<p>Sonuç :<br />
Username : ilkay<br />
Password : 2081</p>
<p>2.5. Veritabanina Ekleme Yapma veya Veri Düzenleme:</p>
<p>Kullaniciadi ve sifre bilgisine ulasan muhtemel saldirgan benzer yöntemleri ve UPDATE,insert komutlarini kullanarak sifreyi degistirebilir veya daha temizi baska bir kullanici hesabi açabilir&#8230;</p>
<p>http://Victim/Default.asp?id=10; UPDATE &#8216;Admin_Login&#8217; SET &#8216;Password&#8217; = &#8216;NewPwd&#8217; WHERE Username=&#8217;ilkay&#8217;&#8211;</p>
<p>Yeni bir kullanici hesabi için;</p>
<p>http://Victim/Default.asp?id=10; insert INTO &#8216;Admin_Login&#8217; (&#8217;UserID&#8217;, &#8216;Username&#8217;, &#8216;Password&#8217;, &#8216;Details&#8217;) VALUES (666,&#8217;Desperate_Cry&#8217;,'2081&#8242;,&#8217;N /A&#8217;)&#8211;</p>
<p>3. Nasil Korunmali? &#8211; &#8216;Aksi Dogrulanincaya Kadar Tüm Kullanici Girdileri Kötüdür&#8230;&#8217;</p>
<p>Gelebilecek SQL Enjeksiyon saldirilarindan korunabilmek için alinan önlemlerde temel alinmasi geren nokta&#8230; &#8216;Aksi dogrulanincaya kadar tüm kullanici girdileri kötüdür!&#8217;.</p>
<p>3.1. Kullanici Haklarinin Sinirlandirilmasi</p>
<p>Yaygin olarak yapilan hata; Web Server dan SQL Server a yapilan baglantilarda varsayilan sistem hesabi kullanilmasi&#8230; Bu sekilde yönetici haklarina sahip olan saldirgan örneklerde de görülebilecegi üzere istegi komutu çalistirip istedigi ekleme,silme,düzeltme eylemini gerçeklestirebilecektir. Bunu yerine yapilmasi gereken yeni bir kullanici hesabi olusturup kullanicinin çalistirabilecegi komutlari sinirlandirmak olacaktir.</p>
<p>Mesela sitenizden ürünlerinizin incelenmesine ve bunlar arasindan siparis verilmesine izin verecekseniz, &#8216;web_user&#8217; gibi bir kullanici adi olusturup ürünleri incelemek için; ürünler sütununda sadece &#8217;select&#8217; kullanimina ve siparisleri için; siparisler sütununda sadece &#8216;insert&#8217; kullanimina izin vermeniz uygun olacaktir.</p>
<p>3.2. Girdilerde Tirnak Imleçlerinin (&#8217;) Kötü Amaçli Kullaniminin Engellenmesi</p>
<p>Yaygin SQL Enjeksiyon saldirilari SQL deyimlerinin girdilerdeki gereksiz (&#8217;) tirnak isaretleri yardimiyla yeniden olusturulmasi sayesinde yapilir.</p>
<p>Küçük bir filtreleme fonksiyonu veya tek tirnagi çift tirnaga çeviren bir fonksiyon muhtemel bir saldiriyi engellmek için yeterli olabilir.</p>
<p>ASP Kullanarak girdileri kontrol ederek degistiren bir fonksiyon kolaylikla yazilabilir;</p>
<p>Bu fonksiyonu bastaki örnekte kullanirsak;</p>
<p>select count(*) FROM Users WHERE Username=&#8217;ilkay&#8217; AND Password=&#8221; OR 1=1 &#8211;&#8217;</p>
<p>seklinde olan deyim&#8230;</p>
<p>select count(*) FROM Users WHERE Username=&#8217;ilkay&#8217; AND Password=&#8221; OR 1=1 &#8211;&#8217;</p>
<p>&#8216;e dönüsecektir.</p>
<p>3.3. Form Girdilerinden Gereksiz Karakterlerin Elenmesi</p>
<p>SQL Enjeksiyon saldirilari genelde &#8216;;, &#8211;,select, insert ve xp_&#8217; gibi karakterlerin-kelimelerin kullanilmasiyla yapildigi için gönderilecek girdinin önce bir filtreleme fonksiyonundan geçirilmesi muhtemel zayifligi engelleyebilir.Örnegin kullanicidan E &#8211; Mail adresini girmesi isteniyorsa harfler ve sayilarin yaninda sadece &#8216; @,-,_,.&#8217; karakterlerinin kullanilmasina izin verilmelidir.</p>
<p>Ve sunucuda saklanan xp_cmdshell ve xp_grantlogin gibi genel prosedürler,C/C++ tabanli DLL ler, kullanici tarafli fonksiyonlar&#8230;vb, izole edilmis bir sunucuya tasinmalidir. Bazi zararli kelime-harfleri filteleyen ASP fonksiyonu asagida örneklenmistir;</p>
<p>Tirnak degistirme fonksiyonu ve filtreleme fonksiyonu beraber kullanilirsa;</p>
<p>select Username FROM Users WHERE Usename=&#8221;; EXEC master..xp_cmdshell &#8216;dir c&#8217;; &#8211;&#8217; AND Password=&#8221;</p>
<p>Seklindeki SQL Deyimi&#8230;</p>
<p>select Username FROM Users WHERE Usename=&#8221; EXEC master.. cmdshell &#8216;dir c:&#8217; &#8216; AND Password=&#8221;</p>
<p>e dönüsecektir ki bu da herhangi bir kayit bulumadigi hatasini vermekten öteye gitmeyecektir.</p>
<p>Bu fonksiyonu kullanicidan gelen bütün girdilere, adres satiri ifadelerine ve çerezlerden gelen tüm veriye uygulamamiz gelebilecek saldirinin önüne geçecektir.</p>
<p>3.4. Girdi Uzunlugunun Sinirlandirilmasi</p>
<p>Veritabanindaki ayrilan alanin uzunlugu 10 karakterlikse, formunuzda bu alan için 50 karakter sigan bir text kutusuna sahip olmaniz sakincali olabilir. Ve mümkün oldugu kadar girdi uzunluklarini kisa tutmak muhtemel saldiriyi engellemek için önlem sayilabilir.</p>
<p>3.5. Girdi Cinsinin Kontrol Edilmesi</p>
<p>Formunuzdan girilen verinin istediginiz türden bir veri olup olmadigini kontrol eden bir fonksiyon kötü amaçli kullanimlarda saldirganin kullanabilecegi harf/sayi seçenegini kisitlayacaktir. Mesela, eger Ürün ID si için formunuzdan girdi aliyorsaniz girdinin sayisal bir ifade olup olmadigini kontrol eden bir fonksiyon fayda saglayacaktir.</p>
<p>3.6. Girdi Cinsinin Kontrol Edilmesi</p>
<p>Formunuz araciligi ile topladiginiz verileri yollarken mutlaka &#8216;POST&#8217; metodunu kullanin ki kullanicilariniz adres çubugunda girdikleri verilerle beraber form degerlerini gördüklerinde akillarina farkli fikirler gelmesin.</p>
<p>4. Son Söz &#8211; &#8216;Herzaman bir adim önde!&#8217;</p>
<p>Aldiginiz güvenlik önlemleri veya (en iyi ihtimalle) yazip da kullanmayi bir aliskanlik haline getiremediginiz güvenlik politikalari sizi güvenlik problemlerine karsi koruyabilir mi? Eger güvenlik ile ilgili problemleri yönetmeyi süreç temelli bir güvenlik bilinci içerisinde ele almiyorsaniz hiçbir güvenlik ürünü, bir güvenlik kaybina ugramanizi engelleyemez.</p>
<p>Bilgi sistemleri altyapinizi tasidiklari güvenlik zaaflarina karsi düzenli olarak kontrol ettirmek, risklerinizi takip etmek, dogru teknolojiyi dogru yerde ve dogru sekilde kullanmanizi saglayacak güvenlik politikalarinizi olusturup güvenlik probleminizi sürekli yönetebilecek olgunluga ulasmak hedeflenmelidir. Bilgi sistemlerinin önemli bir kismini olusturan uygulamalarin tasiyabilecegi güvenlik sorunlari uzun süredir ihmal edilmelerinden dolayi, günümüzün en popüler sistem sizma noktalarini teskil etmektedirler. Bu nedenle uygulama güvenligine iliskin gereken önemi vermeniz, güvenlik denetimi yaptirmaniz ve kurumunuzun bilgi güvenligi yönetim sistemini olusturmaya bir yerinden baslamanizi öneriyorum&#8230;</p>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td><strong><strong>SQL Injection Ataklarından Nasıl Korunuruz?</strong></strong></p>
<p>Bu makalemizin konusu başlıktan da anlaşılacağı gibi, web uygulamalarımıza yapılan saldırılara karşı nasıl önlem almamız gerektiği. Aslında web uygulamamıza yapılabilecek bir çok saldırı metotları vardır. Bu makalede, bu saldırı çeşidinden biri olan Sql Injection (Sql Aşılama) ataklarına karşı savunma taktiklerini anlatacağım. Peki sql injection atakları nasıl yapılır?? Sql Injection atakları, web uygulamalarımızda yer alan veri girişleri için kullandığımız TextBox form elemanlarının içine yazılan bazı sql komut deyimlerinin yazılması ile olur.</p>
<p>Web uygulamalarımızın en zayıf bölümü kullanıcı girişlerinin yapıldığı ve sonucunda yetkilendirme yapıldığı bölümlerdir. Yani login sayfalarıdır. Web uygulamaları ile ilgilenen herkes mutlaka bir login sayfası yapmıştır. Temel olarak iki tane TextBox ve bir tane Button yer alır. Kullanıcı TextBox&#8217;lara gerekli verileri girdikten sonra Button&#8217;a tıklar ve Button&#8217;un OnClick olayı devreye girer. OnClick olayında ise veritabanına bağlantı gerçekleştirilir, gerekli sorgu komutu yazılır ve eğer TextBox&#8217;lara girilen veriler ile veritabanındaki tabloda yer alan herhangi bir kayıt eşleştiyse (veya en az bir kayıt döndürüyorsa) bu kullanıcı için web uygulamasına giriş başarılı olmuştur. Yani kullanıcının Authenticate işlemi gerçekleştirilmiştir. Aslında her şey düzgün çalıştığını zannederken kötü niyetli kişiler tarafından web uygulamalarınızın tehdit altında olduğunu farketmezsiniz. Bende web uygulamaları ile çalışmaya yeni başlarken eğer kod düzgün çalışıyorsa her şey bitmiş gibi düşünürdüm. Güvenlik kısmını herzaman arka plana atmıştım. Bazen makelelerimizde esas konuya yoğunlaşmak için bazı güvenlik ilkelerini ihlal ederiz. Fakat siz uygulamalarınızda güvenlikten asla ödün vermeyin.</p>
<p>Sizlere bu makalede kötü yazılmış bir kod ve iyi yazılmış bir kodun karşılaştırmasını yapacağım. Fakat en önce Sql Injection ataklarına karşı koymanız için gereken 5 temel savunma prensibini bilmeniz gerekir:</td>
</tr>
</tbody>
</table>
<table border="1" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td width="47%"><strong><strong>Prensipler</strong></strong></td>
<td width="53%"><strong><strong>Neler Yapmalısınız?</strong></strong></td>
</tr>
<tr>
<td>Kullanıcı girdilerine asla güvenmeyin.</td>
<td>Tüm TextBox girişlerinin değerlerini Validator Kontrolleri, Regular Expressions veya kod ile kontrol edin.</td>
</tr>
<tr>
<td>Veritabanına asla admin düzeyinde bağlanmayın.</td>
<td>Veritabanına gerekli düzeyde kısıtlı erişim ile bağlanın.</td>
</tr>
<tr>
<td>Asla dinamik Sql sorguları kullanmayın.</td>
<td>Parametre göndererek veya Stored Procedure Kullanın.</td>
</tr>
<tr>
<td>Veritabanına verilerinizi asla açık şekilde yazmayın.</td>
<td>Verilerinizi şifreleme algoritması kullanarak veritabanına kaydedin.</td>
</tr>
<tr>
<td>Web uygulamalarınızda meydana gelebilecek istisnalarla(Exceptions) veya hatalarla ilgili bilgileri en düşük düzeyde kullanıcıya aktarın.</td>
<td>Web uygulamalarınızda meydana gelebilecek olası her hataya karşı özel bir hata sayfası hazırlayın.</td>
</tr>
</tbody>
</table>
<p>Şimdi sıra geldi web uygulamalarınızı nasıl yazmanız ve yazmamanız gerektiğine.<br />
login.aspx sayfamızda yer alan Button&#8217;un OnClick olayına şu şekilde kod yazılmış olduğunu farzedelim.</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr height="326">
<td height="326" valign="top" bgcolor="#cccccc">private void Button1_Click(object sender, System.EventArgs e)<br />
{<br />
string strCnx = ConfigurationSettings.AppSettings["BadconnStr"];<br />
SqlConnection conn = new SqlConnection(strCnx);</p>
<p>conn.Open();<br />
SqlCommand cmd = new SqlCommand();<br />
cmd.Connection = conn;<br />
cmd.CommandText = &#8220;Select * From users Where username = &#8216;&#8221;+ txtusername.Text +&#8221;&#8216; AND password = &#8216;&#8221;+ txtpassword.Text +&#8221;&#8216; &#8220;;</p>
<p>SqlDataReader dr;<br />
dr = cmd.ExecuteReader();<br />
if(dr.Read())<br />
{<br />
FormsAuthentication.RedirectFromLoginPage(txtusername.Text,false);<br />
}<br />
else<br />
{<br />
ErrLabel.Text = &#8220;Başarısız İşlem&#8221;;<br />
}</td>
</tr>
</tbody>
</table>
<p>Eğer kullanıcı kendi kullanıcı adı ve şifresini girerse her şey normal şekilde sürer. Fakat eğer iyi yazılmamış bir login sayfasında aşağıdaki gibi bir ifade girilirse ne olur görelim.</p>
<p><strong><strong>&#8216;or 1=1&#8211;</strong></strong></p>
<p>şeklinde bir Sql ifadesi kullanıcı adının girileceği TextBox&#8217;a girilir ve şifre kısmına da rastgele bir değer girilirse, veritabanımızdaki tabloda böyle bir kullanıcı olmasa bile yetkilendirme işlemi başarılı olacaktır. Çünkü &#8216;or 1=1&#8211; ifadesinin TextBox&#8217;a girilmesi sonucu sorgu ifadesi şu şekle dönüşmüş olur.</p>
<p><strong><strong>Select * From users Where username = &#8216; &#8216;or 1=1&#8211;&#8217; AND password = &#8216;&#8221;+ txtpassword.Text +&#8221;&#8216; </strong></strong></p>
<p>Kullanıcı adını yazdığımız TextBox nesnesine girilen &#8216;or 1=1&#8211; ifadesinde yer alan &#8212; işaretlerinin anlamı; &#8212; işaretlerinden gelen sonraki ifadeleri yoksay olacaktır. Yani sonuç olarak ifademiz;</p>
<p><strong><strong>Select * From users Where username = &#8216; &#8216;or 1=1&#8211;</strong></strong></p>
<p>şekline dönüşecektir.Bu ifadede yer alan or 1=1 ifadesi sürekli doğru sonucu vereceğinden sonuç olarak sorgu işlemi bir kayıt döndürecektir. Bizim if döngümüzde yer alan dr.Read() ifadesi de true değerini alacağından if deyimi çalıştırılacak ve kullanıcı Authenticate işlemini başarı ile geçecektir.</p>
<p>Peki bu Sql Injection saldırısının çalışmasını sağlayan hatalar neydi? Kodumuzu satır satır inceleyelim.</p>
<p><strong><strong>string</strong></strong><strong><strong> strCnx = ConfigurationSettings.AppSettings["BadconnStr"]; </strong></strong><strong><br />
<strong><strong>SqlConnection conn = new SqlConnection(strCnx);</strong></strong></strong></p>
<p>bu ifadede BadconnStr değerini Web.config sayfamızdan almaktayız. Web.config sayfamızda yer alan ConnectionString ifademiz şu şekildedir.</p>
<p>Bu ConnectionString ifadesindeki hata veritabanına sa olarak bağlanmamızdır. Hiçbir zaman veritabanına sa kullanıcısı olarak bağlanmayın. Çünkü sa veritabanı üzerinde çok yüksek haklara sahiptir. Oysa bize gerekli olan sadece <strong><strong>SELECT</strong></strong> sorgusu.</p>
<p>Diğer bir hata ise sorgu işleminin dinamik olarak yapılması. Eğer bu şekilde dinamik olarak SQL sorguları yaratılırsa yukarıda girilen &#8216;or 1=1&#8211; ifadesinin girilmesi ile çok büyük güvenlik açıklarına neden olursunuz. Peki ne yapacağız. Yukarıda bahsettiğim prensiplere göre parametre olarak veri göndermeli veya Stored Procedure kullanmalıyız.</p>
<p>Aslında yukarıda TextBox&#8217;lara girilen değerleri de kontrol etmemiz gerekir. Yine aynı şekilde TextBox&#8217;ın MaxLength özelliğinin mutlaka kısıtlanması gerekir. Yani TextBox&#8217;lara sınırsız karakter girilmesini önlemeliyiz. TextBox&#8217;lara girilebilecek özel karakterleri de kontrol etmeliyiz. Yani &#8216; &#8221; &#8211; + # % &amp; gibi bir çok karakterlerin girilmemesini sağlamalıyız.</p>
<p>Sadece &#8216;or 1=1&#8211; ifadesinden farklı Sql Injection saldırıları da olabilir. Örneğin yine kullanıcı adını girdiğimiz TextBox nesnesinin içine,<br />
<strong><br />
</strong><strong><strong>&#8216;; UPDATE users SET password = &#8216;deneme&#8217; WHERE username = &#8216;mehmet&#8217; &#8212; </strong></strong></p>
<p>ifadesi de girilebilir. Peki bu Sql Injection ne gibi zararlara neden olur?</p>
<p>Bu ifade ile çoklu Sql deyimleri noktalı virgül yardımı ile aynı anda çalıştırılabilir. Bu ifade ile users tablosunda yer alan kullanıcı adı mehmet olan kişinin şifresini deneme olarak değiştiriyor. Eğer yukarıdaki gibi kötü yazılmış bir kod varsa bu işlem başarı ile gerçekleştiriliyor. Yine aynı şekilde buna benzer bir ifade ile, veritabanında yeni kullanıcılar yaratılabilr, bir tablo silinebilir, veya herhangi bir stored procedure yazılarak çok farklı işlemler gerçekleştirilebilir. Bunu önlemenin yolu veritabanına bağlantı yaptığımız ConnectionString&#8217;inde yer alan user&#8217;a sadece ve sadece gerekli izinler verilmelidir. Örneğin, burada user&#8217;ın sadece SELECT ifadesi için izin verilseydi hiç bir sorun olmayacaktı.</p>
<p>Şimdi daha güvenli login işleminin nasıl gerçekleşeceğini görelim.</p>
<p><strong><strong>Daha Güvenli Login Sayfamız</strong></strong></p>
<p>Öncelikle sayfamızın tasarım kısmının neye benzediğine bakalım. Daha iyi görebilmek için şeklin üzerine tıklayıp büyütebilirsiniz</p>
<p><a href="http://www.capraz.net/aspnetimages/Sqlinjection_1.gif" target="_blank"></a></p>
<p>LOGIN Butonuna tıkladığımızda çalışacak kodu görmeden önce Web.config dosyasında yer alan ConnectionString ifadesini görelim.</p>
<p>Button&#8217;umuzun OnClick olayında çalışacak kod ise şu şekildedir.</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr height="537">
<td height="537" valign="top" bgcolor="#cccccc">private void Button1_Click(object sender, System.EventArgs e)<br />
{<br />
if(Page.IsValid)<br />
{<br />
string strCnx = ConfigurationSettings.AppSettings["BetterconnStr"];<br />
SqlConnection conn = new SqlConnection(strCnx);</p>
<p>conn.Open();<br />
SqlCommand cmd = new SqlCommand();<br />
cmd.Connection = conn;<br />
cmd.CommandType = CommandType.StoredProcedure;<br />
cmd.CommandText = &#8220;UserControl&#8221;;</p>
<p>SqlParameter prm;<br />
prm = new SqlParameter(&#8221;@username&#8221;,SqlDbType.NVarChar,50);<br />
prm.Direction = ParameterDirection.Input;<br />
prm.Value = FormsAuthentication.HashPasswordForStoringInConfigFile(txtusername.Text,&#8221;SHA1&#8243;);<br />
cmd.Parameters.Add(prm);</p>
<p>prm = new SqlParameter(&#8221;@password&#8221;,SqlDbType.NVarChar,50);<br />
prm.Direction = ParameterDirection.Input;<br />
prm.Value = FormsAuthentication.HashPasswordForStoringInConfigFile(txtpassword.Text,&#8221;SHA1&#8243;);<br />
cmd.Parameters.Add(prm);</p>
<p>SqlDataReader dr;<br />
dr = cmd.ExecuteReader();<br />
if (dr.Read())<br />
{<br />
FormsAuthentication.RedirectFromLoginPage(txtusername.Text, false);<br />
}<br />
else<br />
{<br />
ErrLabel.Text = &#8220;Başarısız İşlem&#8221;;<br />
}<br />
}<br />
}</td>
</tr>
</tbody>
</table>
<p>Yukarıda makalenin ilk başında bahsettiğim 5 temel prensibin hepsi bu login işleminde uygulandı. TextBox nesnelerine girilebilecek max karakter sayısının kısıtlanması ile çalışabileck Sql deyimleri girilemez. Aynı şekilde RegularExpressionValidator ifadeleri ile özel karakterlerin girilmesi önlenlenmiş oldu. Yine ConnectionString ifademizde benim yarattığım bir kullanıcı ile bağlanılıyor. Bu kullanıcıya sadece StoredProcedure&#8217;leri çalıştırılmasına izin veriliyor. Böylece başka herhangi bir sql komutunun çalışmasına olanak tanınmıyor. Çünkü veritabanına bağlanan kullanıcının yapabildikleri kısıtlanmıştır. SqlCommandType&#8217;in özelliği Stored Procedure olarak ayarlanmış ve böylece dinamik SQL ifadelerinin kullanılması engellenmiş olur. Stored Procedure&#8217;e aktarılan parametrelerde şifrelenerek veritabanında, şifrelenmiş olarak duran kayıtlarla karşılaştırlır.</p>
<p>Elbette web uygulamasının içerisinde, login sayfasından farklı sayfalarda yer alan TextBox nesneleri ile kötü niyetli kullanıcılar veritabanımıza dolayısıyla web uygulamamıza zarar verebilirler. Örneğin, herkesin bildiği site içerisinde arama yapabilmemizi sağlayan TextBox nesnelerine girilen değerlerde kontrol edilmelidir.</p>
<p>Bu makalenin içerisinde yer alan kodları daha iyi anlayabilmek için, makale içinde geçen bazı konuları (FormsAuthentication, Verileri Şifreleme, RegularExpressionValidator, Stored Procedure) yine aspnedir.com sitesinden okumanızı tavsiye ederim.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tunahan.net/2010/01/29/sql-injection-korunma-yollari/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML Formlarıyla Çalışma</title>
		<link>http://www.tunahan.net/2009/12/15/html-formlariyla-calisma/</link>
		<comments>http://www.tunahan.net/2009/12/15/html-formlariyla-calisma/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 03:03:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ASP]]></category>
		<category><![CDATA[Html]]></category>
		<category><![CDATA[QueryString]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.tunahan.net/?p=20</guid>
		<description><![CDATA[ASP Request nesnesini kullanarak, HTML formlarıyla birleştirilmiş verileri toplamak ve işletmek için, basit ama güçlü betikler oluşturabilirsiniz. Bu başlık altında, sadece temel form işletim betiklerini öğrenmekle kalmayacak, aynı zamanda, hem Web sunucunuz hem de kullanıcı tarayıcısı üzerinde form bilgisi onaylamak için yararlı teknikleri de öğrenmiş olacaksınız.
HTML Formları Hakkında
HTML formları, Web bilgilerini toparlamanın en iyi metodu [...]]]></description>
			<content:encoded><![CDATA[<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">ASP Request nesnesini kullanarak, HTML formlarıyla birleştirilmiş verileri toplamak ve işletmek için, basit ama güçlü betikler oluşturabilirsiniz. Bu başlık altında, sadece temel form işletim betiklerini öğrenmekle kalmayacak, aynı zamanda, hem Web sunucunuz hem de kullanıcı tarayıcısı üzerinde form bilgisi onaylamak için yararlı teknikleri de öğrenmiş olacaksınız.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">HTML Formları Hakkında</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">HTML formları, Web bilgilerini toparlamanın en iyi metodu budur, özel HTML etiketlerinin (ki bunlar Web sayfası üzerindeki arayüz kontrollerini sağlar) düzenlemesidir. Metin kutuları, düğmeler, ve onay kutuları kullanıcının bir Web sayfasıyla iletişimini ve Web sunucuya bilgi onayı sağlayan kontrollere örneklerdir.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Aşağıdaki HTML örneği kullanıcının adı, soyadı ve yaşı bilgilerini girmesini ve Web sunucuya bu bilgilerin onaylanmasını sağlayan bir de düğmesi bulunan bir formu oluşturur. Form ayrıca Web sunucuya ek bilgiler iletebilen bir saklı kontrol de içerir.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;FORM METHOD=&#8221;POST&#8221; ACTION=&#8221;dosyam.asp&#8221;&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;INPUT TYPE=&#8221;text&#8221; NAME=&#8221;adi&#8221;&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;INPUT TYPE=&#8221;text&#8221; NAME=&#8221;soyadi&#8221;&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;INPUT TYPE=&#8221;text&#8221; NAME=&#8221;yasi&#8221;&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;INPUT TYPE=&#8221;hidden&#8221; NAME=&#8221;userstatus&#8221; VALUE= &#8220;new&#8221;&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;INPUT TYPE=&#8221;submit&#8221; VALUE=&#8221;Enter&#8221;&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;/FORM&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">ASP ile Form Girişlerini Ele Almak</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Bir form Web sunucuya bilgi onaylayınca, kullanıcı tarayıcısı HTML &lt;FORM &gt; etiketinin ACTION özelliği ile belirtilen .asp dosyasını ister. .asp dosyası form değer işletimini ele alan betikler içerir. Sonuçlar tablosu görüntülemek ya da veri tabanından veri sorgulamak gibi&#8230;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">HTML form değerlerini biriktirmek için .asp dosyaları kullanmanın üç yolu vardır:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">· Bir .asp dosyası bilgileri başka bir .asp dosyasına ileten bir form oluşturabilir.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">· Bir statik .htm dosyası değerlerini .asp dosyasına ileten bir form içerebilir.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">· Bir .asp dosyası bilgileri kendine iletebilir.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">İlk iki metod diğer giriş programlarıyla çalışan formlarla aynı şekilde çalışır. Fakat Asp ile kullanıcı seçimlerini okuyan ve cevaplayan komutlar da kullanabilirsiniz.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Bilgiyi kendine yollayan bir form tanımı içeren .asp dosyası oluşturmak daha karmaşık ama daha güçlü bir formlarla çalışma yoludur. Bu işlem &#8220;Form Girişi Onaylamak&#8221; kısmında anlatılmaktadır.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Form Girişi</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">ASP Request nesnesi iki yığın sağlar ki bunlar bir URL istemine eklenmiş form bilgilerini yeniden elde etme işini basitleştirir.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&#8220;QueryString&#8221; Yığını</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">QueryString yığını Web sunucunuza iletilen form değerlerini, istem URLsinde soru işareti ile biten bir metin olarak getirir. Form değerleri istem URLsine ya HTTP GET metodu ile ya da elle form değerlerini URLye ekleyerek ilave edilebilir.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Örneğin, bir önceki form örneğinde GET metodu (ACTION = &#8220;GET&#8221;) kullanılsa ve kullanıcı Jeff, Smith, ve 30 yazmış olsaydı, aşağıdaki URL istemi sunucuya yollanmış olurdu:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">http://scripts/Myfile.asp?adi=Jeff&amp;soyadi=Smith&amp;yasi=30&amp;userstatus=new</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Myfile.asp aşağıdaki form işletim betiğini içerebilir:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Merhaba, &lt;%= Request.QueryString(&#8221;adi&#8221;) %&gt; &lt;%= Request.QueryString(&#8221;soyadi&#8221;) %&gt;.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Siz &lt;%= Request.QueryString(&#8221;yasi&#8221;) %&gt; yasindasiniz.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;%</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">If Request.QueryString(&#8221;userstatus&#8221;) = &#8220;new user&#8221; then</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Response.Write&#8221;Bu Web sitesine ilk gelişiniz!&#8221;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">End if</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">%&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Bu durumda, Web sunucunuz kullanıcı Web tarayıcısına aşağıdaki metini döndürür:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Merhaba, Jeff Smith. Siz 30 yasindasiniz. Bu Web sitesine ilk gelişiniz!</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">QueryString yığınının aynı zamanda bir de istem gövdesinde yer alabilen çoklu değerlerden birine erişmek için kullanılacak seçimlik bir parametresi vardır. Ayrıca Count özelliğini de belli bir türün kullanılma sayısını saymak için kullanabilirsiniz.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Örneğin, birçok maddesi bulunan bir liste kutusunu içeren bir form, aşağıdaki istemi oluşturur:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">http://list.asp?yiyecek=elma&amp;yiyecek=zeytin&amp;yiyecek=ekmek</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Ayrıca, çoklu değerleri saymak için aşağıdaki komutu da kullanabilirsiniz:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Request.QueryString(&#8221;yiyecek&#8221;).Count</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Çoklu değer türlerini görüntülemek için, List.asp aşağıdaki betiği içerir:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;%Total = Request.QueryString(&#8221;yiyecek&#8221;).Count%&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;%For i = 1 to Total%&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;%= Request.QueryString(&#8221;yiyecek&#8221;)(i) %&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;%Next%&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Yukarıdaki betik görüntüsü:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">apples</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">olives</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">bread</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Form Yığını</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">HTTP GET metodunu Web sunucuya karışık ve uzun form değerlerini ileteceğiniz zaman, bilgiyi kaybetme riskiniz vardır. Çoğu Web sunucular URL sorgu dizgisi boyunu kısıtlamaya eğilimlidir. Bu yüzden, uzun form değerlerinin kısaltılması için GET metodu kullanılır. Eğer bir formdan bir Web sunucuya büyük miktarda bir bilgi gönderecekseniz, HTTP POST metodunu kullanmalısınız. HTTP istem gövdesinde form verisi gönderen POST metodu, sunucuya sınırsız sayıda karakteri sanal olarak yollar. ASP Request nesnesinin Form yığınını POST metodu ile yollanmış değerleri elde etmek için kullanabilirsiniz.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Form yığını, değerleri QueryString yığını ile aynı mantıkla saklar. Örneğin, eğer bir kullanıcı uzun bir liste halinde isimler girerek bir formu doldurduysa, isimleri aşağıdaki betik ile elde edebilirsiniz:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;% For i = 1 to Request.Form.Count %&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;% =Request.Form(&#8221;isimler&#8221;)(i) %&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;% Next %&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Form Girişi Onaylamak</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">İyi bir işletim betiği, verileri işlemeden önce girilen bilgiyi onaylar. Onaylama betiği, kullanıcının forma girdiği bilgilerin doğru türlerde olup olmadığını kontrol eder. Örneğin, eğer Web siteniz kullanıcıya finansal bilgileri hesaplama imkanı veren bir form içeriyorsa, sonuçların işletimden önce kullanıcının metin değil sayısal değerler girdiğini onaylanmasını isteyebilirsiniz.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Form girişini onaylamanın iyi bir yolu da bilgiyi kendine veren bir form yaratmaktır. Bu durumda, .asp dosyası bilgiyi getiren formu içerir. Örneğin, aşağıdaki betik, bilgiyi kendine yollayarak, &#8220;yaş&#8221; alanına sayı girilip girilmediğini saptar:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;% If Isnumeric(Request.QueryString(&#8221;yasi&#8221;)) then %&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;p&gt;Merhaba,yaşınız &lt;%=Request.QueryString(&#8221;age&#8221;)%&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;%Else %&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;p&gt;Lütfen sayısal bir değer giriniz.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;%End If %&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;FORM METHOD= &#8220;POST&#8221; ACTION=&#8221;verify.asp&#8221; &gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Name: &lt;INPUT TYPE=&#8221;text&#8221; NAME=&#8221;adi&#8221; &gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Age: &lt;INPUT TYPE=&#8221;text&#8221; NAME=&#8221;yasi&#8221; &gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;INPUT TYPE=&#8221;submit&#8221; VALUE=&#8221;Enter&#8221;&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;/FORM&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Bu örnekte, betik Verify.asp isimli bir dosyanın, formu içeren aynı dosya, içindedir. Form bilgiyi kendine ACTION özelliğinde Verify.asp&#8217;yi belirterek yollar.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Ayrıca, kullanıcının uygun bilgiler girdiğini kontrol etmek için istemci-taraflı betikler de oluşturabilirsiniz. Form giriş hatalarını kullanıcılara daha hızlı bildirmek için form girişini kullanıcı Web tarayıcısında onaylamak, Web sunucunuzun ağ trafiğini azaltacaktır. Aşağıdaki betik, kullanıcı Web tarayıcısı üzerinde çalışır ve bilgiyi Web sunucunuza bildirmeden önce kullanıcı bilgilerini onaylar.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;SCRIPT LANGUAGE=&#8221;VBScript&#8221;&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;!&#8211;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Sub btnEnter_OnClick</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Dim Form</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Set Form = Document.MyForm</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">If IsNumeric(Form.yasi.Value) Then</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Form.submit<span style="white-space: pre;"> </span></div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Else</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Msgbox &#8220;Lütfen sayısal bir değer giriniz.&#8221;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">End if</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">End Sub</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">//&#8211;&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;/SCRIPT&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;FORM METHOD= &#8220;POST&#8221; NAME= Formum ACTION=&#8221;dosyam.asp&#8221; &gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">adi: &lt;INPUT TYPE=&#8221;text&#8221; NAME=&#8221;adi&#8221; &gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">yasi: &lt;INPUT TYPE=&#8221;text&#8221; NAME=&#8221;yasi&#8221; &gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;INPUT TYPE=&#8221;button&#8221; NAME=&#8221;btnEnter&#8221; VALUE=&#8221;Enter&#8221;&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;/FORM&gt;</div>
<p><span style="font-family: verdana; line-height: normal; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">ASP Request nesnesini kullanarak, HTML formlarıyla birleştirilmiş verileri toplamak ve işletmek için, basit ama güçlü betikler oluşturabilirsiniz. Bu başlık altında, sadece temel form işletim betiklerini öğrenmekle kalmayacak, aynı zamanda, hem Web sunucunuz hem de kullanıcı tarayıcısı üzerinde form bilgisi onaylamak için yararlı teknikleri de öğrenmiş olacaksınız.</span></p>
<p>HTML Formları Hakkında</p>
<p>HTML formları, Web bilgilerini toparlamanın en iyi metodu budur, özel HTML etiketlerinin (ki bunlar Web sayfası üzerindeki arayüz kontrollerini sağlar) düzenlemesidir. Metin kutuları, düğmeler, ve onay kutuları kullanıcının bir Web sayfasıyla iletişimini ve Web sunucuya bilgi onayı sağlayan kontrollere örneklerdir.</p>
<p>Aşağıdaki HTML örneği kullanıcının adı, soyadı ve yaşı bilgilerini girmesini ve Web sunucuya bu bilgilerin onaylanmasını sağlayan bir de düğmesi bulunan bir formu oluşturur. Form ayrıca Web sunucuya ek bilgiler iletebilen bir saklı kontrol de içerir.</p>
<blockquote><p><span style="font-family: verdana; line-height: normal; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "> </span></p>
<p>&lt;FORM METHOD=&#8221;POST&#8221; ACTION=&#8221;dosyam.asp&#8221;&gt;<br />
&lt;INPUT TYPE=&#8221;text&#8221; NAME=&#8221;adi&#8221;&gt;<br />
&lt;INPUT TYPE=&#8221;text&#8221; NAME=&#8221;soyadi&#8221;&gt;<br />
&lt;INPUT TYPE=&#8221;text&#8221; NAME=&#8221;yasi&#8221;&gt;<br />
&lt;INPUT TYPE=&#8221;hidden&#8221; NAME=&#8221;userstatus&#8221; VALUE= &#8220;new&#8221;&gt;<br />
&lt;INPUT TYPE=&#8221;submit&#8221; VALUE=&#8221;Enter&#8221;&gt;<br />
&lt;/FORM&gt;</p></blockquote>
<p><span style="font-family: verdana; line-height: normal; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><br />
ASP ile Form Girişlerini Ele Almak<br />
Bir form Web sunucuya bilgi onaylayınca, kullanıcı tarayıcısı HTML &lt;FORM &gt; etiketinin ACTION özelliği ile belirtilen .asp dosyasını ister. .asp dosyası form değer işletimini ele alan betikler içerir. Sonuçlar tablosu görüntülemek ya da veri tabanından veri sorgulamak gibi&#8230;</span></p>
<p>HTML form değerlerini biriktirmek için .asp dosyaları kullanmanın üç yolu vardır:</p>
<p>· Bir .asp dosyası bilgileri başka bir .asp dosyasına ileten bir form oluşturabilir.<br />
· Bir statik .htm dosyası değerlerini .asp dosyasına ileten bir form içerebilir.<br />
· Bir .asp dosyası bilgileri kendine iletebilir.<br />
İlk iki metod diğer giriş programlarıyla çalışan formlarla aynı şekilde çalışır. Fakat Asp ile kullanıcı seçimlerini okuyan ve cevaplayan komutlar da kullanabilirsiniz.</p>
<p>Bilgiyi kendine yollayan bir form tanımı içeren .asp dosyası oluşturmak daha karmaşık ama daha güçlü bir formlarla çalışma yoludur. Bu işlem &#8220;Form Girişi Onaylamak&#8221; kısmında anlatılmaktadır.</p>
<p>Form Girişi<br />
ASP Request nesnesi iki yığın sağlar ki bunlar bir URL istemine eklenmiş form bilgilerini yeniden elde etme işini basitleştirir.</p>
<p>&#8220;QueryString&#8221; Yığını<br />
QueryString yığını Web sunucunuza iletilen form değerlerini, istem URLsinde soru işareti ile biten bir metin olarak getirir. Form değerleri istem URLsine ya HTTP GET metodu ile ya da elle form değerlerini URLye ekleyerek ilave edilebilir.</p>
<p>Örneğin, bir önceki form örneğinde GET metodu (ACTION = &#8220;GET&#8221;) kullanılsa ve kullanıcı Jeff, Smith, ve 30 yazmış olsaydı, aşağıdaki URL istemi sunucuya yollanmış olurdu:</p>
<p>http://scripts/Myfile.asp?adi=Jeff&amp;soyadi=Smith&amp;yasi=30&amp;userstatus=new</p>
<p>Myfile.asp aşağıdaki form işletim betiğini içerebilir:</p>
<blockquote><p><span style="font-family: verdana; line-height: normal; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "> </span></p>
<p>Merhaba, &lt;%= Request.QueryString(&#8221;adi&#8221;) %&gt; &lt;%= Request.QueryString(&#8221;soyadi&#8221;) %&gt;.<br />
Siz &lt;%= Request.QueryString(&#8221;yasi&#8221;) %&gt; yasindasiniz.<br />
&lt;%<br />
If Request.QueryString(&#8221;userstatus&#8221;) = &#8220;new user&#8221; then<br />
Response.Write&#8221;Bu Web sitesine ilk gelişiniz!&#8221;<br />
End if<br />
%&gt;</p></blockquote>
<p><span style="font-family: verdana; line-height: normal; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><br />
Bu durumda, Web sunucunuz kullanıcı Web tarayıcısına aşağıdaki metini döndürür:</span></p>
<p>Merhaba, Jeff Smith. Siz 30 yasindasiniz. Bu Web sitesine ilk gelişiniz!</p>
<p>QueryString yığınının aynı zamanda bir de istem gövdesinde yer alabilen çoklu değerlerden birine erişmek için kullanılacak seçimlik bir parametresi vardır. Ayrıca Count özelliğini de belli bir türün kullanılma sayısını saymak için kullanabilirsiniz.</p>
<p>Örneğin, birçok maddesi bulunan bir liste kutusunu içeren bir form, aşağıdaki istemi oluşturur:</p>
<p>http://list.asp?yiyecek=elma&amp;yiyecek=zeytin&amp;yiyecek=ekmek</p>
<p>Ayrıca, çoklu değerleri saymak için aşağıdaki komutu da kullanabilirsiniz:</p>
<p>Request.QueryString(&#8221;yiyecek&#8221;).Count</p>
<p>Çoklu değer türlerini görüntülemek için, List.asp aşağıdaki betiği içerir:</p>
<blockquote><p><span style="font-family: verdana; line-height: normal; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "> </span></p>
<p>&lt;%Total = Request.QueryString(&#8221;yiyecek&#8221;).Count%&gt;<br />
&lt;%For i = 1 to Total%&gt;<br />
&lt;%= Request.QueryString(&#8221;yiyecek&#8221;)(i) %&gt;<br />
&lt;%Next%&gt;</p></blockquote>
<p><span style="font-family: verdana; line-height: normal; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "> </span></p>
<p>Yukarıdaki betik görüntüsü:<br />
apples<br />
olives<br />
bread</p>
<p>Form Yığını<br />
HTTP GET metodunu Web sunucuya karışık ve uzun form değerlerini ileteceğiniz zaman, bilgiyi kaybetme riskiniz vardır. Çoğu Web sunucular URL sorgu dizgisi boyunu kısıtlamaya eğilimlidir. Bu yüzden, uzun form değerlerinin kısaltılması için GET metodu kullanılır. Eğer bir formdan bir Web sunucuya büyük miktarda bir bilgi gönderecekseniz, HTTP POST metodunu kullanmalısınız. HTTP istem gövdesinde form verisi gönderen POST metodu, sunucuya sınırsız sayıda karakteri sanal olarak yollar. ASP Request nesnesinin Form yığınını POST metodu ile yollanmış değerleri elde etmek için kullanabilirsiniz.</p>
<p>Form yığını, değerleri QueryString yığını ile aynı mantıkla saklar. Örneğin, eğer bir kullanıcı uzun bir liste halinde isimler girerek bir formu doldurduysa, isimleri aşağıdaki betik ile elde edebilirsiniz:</p>
<blockquote><p><span style="font-family: verdana; line-height: normal; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "> </span></p>
<p>&lt;% For i = 1 to Request.Form.Count %&gt;<br />
&lt;% =Request.Form(&#8221;isimler&#8221;)(i) %&gt;<br />
&lt;% Next %&gt;</p></blockquote>
<p><span style="font-family: verdana; line-height: normal; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><br />
Form Girişi Onaylamak<br />
İyi bir işletim betiği, verileri işlemeden önce girilen bilgiyi onaylar. Onaylama betiği, kullanıcının forma girdiği bilgilerin doğru türlerde olup olmadığını kontrol eder. Örneğin, eğer Web siteniz kullanıcıya finansal bilgileri hesaplama imkanı veren bir form içeriyorsa, sonuçların işletimden önce kullanıcının metin değil sayısal değerler girdiğini onaylanmasını isteyebilirsiniz.</span></p>
<p>Form girişini onaylamanın iyi bir yolu da bilgiyi kendine veren bir form yaratmaktır. Bu durumda, .asp dosyası bilgiyi getiren formu içerir. Örneğin, aşağıdaki betik, bilgiyi kendine yollayarak, &#8220;yaş&#8221; alanına sayı girilip girilmediğini saptar:</p>
<blockquote><p><span style="font-family: verdana; line-height: normal; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "> </span></p>
<p>&lt;% If Isnumeric(Request.QueryString(&#8221;yasi&#8221;)) then %&gt;<br />
&lt;p&gt;Merhaba,yaşınız &lt;%=Request.QueryString(&#8221;age&#8221;)%&gt;<br />
&lt;%Else %&gt;<br />
&lt;p&gt;Lütfen sayısal bir değer giriniz.<br />
&lt;%End If %&gt;</p>
<p>&lt;FORM METHOD= &#8220;POST&#8221; ACTION=&#8221;verify.asp&#8221; &gt;<br />
Name: &lt;INPUT TYPE=&#8221;text&#8221; NAME=&#8221;adi&#8221; &gt;<br />
Age: &lt;INPUT TYPE=&#8221;text&#8221; NAME=&#8221;yasi&#8221; &gt;<br />
&lt;INPUT TYPE=&#8221;submit&#8221; VALUE=&#8221;Enter&#8221;&gt;<br />
&lt;/FORM&gt;</p></blockquote>
<p><span style="font-family: verdana; line-height: normal; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "> </span></p>
<p>Bu örnekte, betik Verify.asp isimli bir dosyanın, formu içeren aynı dosya, içindedir. Form bilgiyi kendine ACTION özelliğinde Verify.asp&#8217;yi belirterek yollar.</p>
<p>Ayrıca, kullanıcının uygun bilgiler girdiğini kontrol etmek için istemci-taraflı betikler de oluşturabilirsiniz. Form giriş hatalarını kullanıcılara daha hızlı bildirmek için form girişini kullanıcı Web tarayıcısında onaylamak, Web sunucunuzun ağ trafiğini azaltacaktır. Aşağıdaki betik, kullanıcı Web tarayıcısı üzerinde çalışır ve bilgiyi Web sunucunuza bildirmeden önce kullanıcı bilgilerini onaylar.</p>
<blockquote><p><span style="font-family: verdana; line-height: normal; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">&lt;SCRIPT LANGUAGE=&#8221;VBScript&#8221;&gt;<br />
&lt;!&#8211;<br />
Sub btnEnter_OnClick<br />
Dim Form<br />
Set Form = Document.MyForm<br />
If IsNumeric(Form.yasi.Value) Then<br />
Form.submit<br />
Else<br />
Msgbox &#8220;Lütfen sayısal bir değer giriniz.&#8221;<br />
End if<br />
End Sub<br />
//&#8211;&gt;<br />
&lt;/SCRIPT&gt;</span></p>
<p>&lt;FORM METHOD= &#8220;POST&#8221; NAME= Formum ACTION=&#8221;dosyam.asp&#8221; &gt;<br />
adi: &lt;INPUT TYPE=&#8221;text&#8221; NAME=&#8221;adi&#8221; &gt;<br />
yasi: &lt;INPUT TYPE=&#8221;text&#8221; NAME=&#8221;yasi&#8221; &gt;<br />
&lt;INPUT TYPE=&#8221;button&#8221; NAME=&#8221;btnEnter&#8221; VALUE=&#8221;Enter&#8221;&gt;<br />
&lt;/FORM&gt;</p></blockquote>
<p>Not; Bu yazı 04 Aralık 2003 tarihinde <a href="http://www.sorucevap.com/uyeler/dersler.asp?maxiturk">http://www.sorucevap.com/uyeler/dersler.asp?maxiturk</a> adresinde tarafımca yayınlanmıştır.</p>
<p>Kolay Gelsin <img src='http://www.tunahan.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.tunahan.net/2009/12/15/html-formlariyla-calisma/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Veri Tabanı Erişimi</title>
		<link>http://www.tunahan.net/2009/12/15/veri-tabani-erisimi/</link>
		<comments>http://www.tunahan.net/2009/12/15/veri-tabani-erisimi/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 02:25:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[Veri Tabanı]]></category>

		<guid isPermaLink="false">http://www.tunahan.net/?p=14</guid>
		<description><![CDATA[ActiveX Data Objects (ADO), Web sayfalarınızda veri tabanı erişimini sağlamada kullanılan kolay kullanılır bir teknolojidir. ADO&#8217;yu Open Database Connectivity (ODBC) veri tabanına ve OLE DB veri kaynaklarına bağlantı kurmak için özlü ve ölçümsel betikler yazmak için kullanılabilir.
ODBC&#8217;de DSN (Data Source Name_Veri Kaynağı İsmi) Oluşturmak
Veri tabanı betiklerini tanımlamadan önce, ADO&#8217;yu yerleştirmeli, tanımlamalı ve veri tabanınızla iletişimini [...]]]></description>
			<content:encoded><![CDATA[<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">ActiveX Data Objects (ADO), Web sayfalarınızda veri tabanı erişimini sağlamada kullanılan kolay kullanılır bir teknolojidir. ADO&#8217;yu Open Database Connectivity (ODBC) veri tabanına ve OLE DB veri kaynaklarına bağlantı kurmak için özlü ve ölçümsel betikler yazmak için kullanılabilir.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">ODBC&#8217;de DSN (Data Source Name_Veri Kaynağı İsmi) Oluşturmak</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Veri tabanı betiklerini tanımlamadan önce, ADO&#8217;yu yerleştirmeli, tanımlamalı ve veri tabanınızla iletişimini sağlamalısınız. Web uygulamanızdan veri tabanına veri ileten veri tabanı sürücüleri, ODBC veri tabanını yerleştirmek ve tanımlamak için bir DSN kullanırlar. Tipik olarak, DSN, veri tabanı konfigürasyonunu, kullanıcı güvenliğini, ve konum bilgisini içerir ve Windows NT kayıtlarında bir kayıt ya da metin biçimini alabilirler.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">ODBC ile oluşturmak istediğiniz DSN türünü seçebilirsiniz: User, System, ya da File. User ve System DSNleri Windows NT kayıtlarında yer alır. System DSN, sunucuya giren her kullanıcının veri tabanına erişmesine izin verir. Oysa User DSN veri tabanı erişiminde, belirli güvenlik kriterlerine göre belirli kullanıcılara izin verir. File DSN, metin biçimini alır, çoklu kullanıcı erişimine izin verir ve bir sunucudan diğerine geçirilmesi, DSN&#8217;i kopyalayarak, kolaydır. Bu sebeple, bu konudaki örneklerde File DSN kullanılmaktadır.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Dosya tabanlı bir DSN&#8217;i oluşturmak için Windows Başlat menüsünden Denetim Masasını açın. ODBC ikonuna çift tıklayın, ve File DSN özelliğini seçin. Adde tıklayın, veri tabanı sürücünüzü seçin, ve Nexte tıklayın. Özel veri tabanı yazılımınız için bir DSN konfigüre etmek için aşağıdaki adımları takip edin.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">1. Create New Data Source diyalog kutusunda, liste kutusundan Microsoft Access Driver&#8217;ı seçin ve Nexte tıklayın.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">2. DSN dosyanız için bir isim yazın ve Nexte tıklayın..</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">3. Veri kaynağını oluşturmak için Finishe tıklayın.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">4. ODBC Microsoft Access 97 Setup diyalog kutusunda Selecte tıklayın. Bir Microsoft Access veri tabanı ismi (*.mdb) seçin, ve OKe tıklayın.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">ASP, uygun veri kaynakları olarak, paylaşılan veri tabanlarını (Microsoft ® Access ya da Microsoft ® FoxPro) destekler. Paylaşılan dosyalı veri tabanlarının tavsiye edilmesine rağmen bu tür veri tabanı motorlarını sadece geliştirme amaçlı kullanınız. Paylaşımlı dosyalı veri tabanları, yüksek istemler için sunucu-istemci veri tabanları kadar uygun olmayabilir.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Bir SQL Server Database File(Sunucu veri tabanı dosyası) DSN&#8217;i tanımlamak için:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Not: Eğer veri tabanı uzak bir sunucuda yeralıyorsa, detaylı konfigürasyon bilgileri için sunucu yöneticinize başvurunuz. Aşağıdaki adımlar SQL sunucusu için varsayılan ODBC ayarlarını kullanır. Bu ayarlar sizin donanımınızda çalışmayabilir.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">1. Create New Data Source diyalog kutusunda, liste kutusundan SQL Server&#8217;ı seçin ve Nexte tıklayın.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">2. DSN dosyası isminizi yazın ve Nexte tıklayın.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">3. Veri kaynağını oluşturmak için Finishe tıklayın.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">4. SQL sunucu adını, giriş kimliğinizi ve şifrenizi girin.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">5. Create a New Data Source to SQL Server diyalog kutusunda, Server liste kutusundaki SQL sunucu veri tabanını içeren sunucunun adını seçin ve Nexte tıklayın.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">6. Giriş numarası güvenliği için bir metod seçin.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">7. Eğer SQL Sunucu güveliğini seçtiyseniz, bir giriş kimliği ve şifre girin, Nexte tıklayın.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">8. Create a New Data Source to SQL Server diyalog kutusunda, varsayılan veri tabanınızı, sürücü saklama yordam ayarlarını, ve ANSI tanımlarını kurun ve Nexte tıklayın.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">9. Diyalog kutusundan (Create a New Data Source to SQL Server), bir karakter çevrim metodu seçin, ve Nexte tıklayın.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">10. Bir sonraki diyalog kutusundan (Create a New Data Source to SQL Server), giriş opsiyonlarını seçin.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">11. ODBC Microsoft SQL Server Setup diyalog kutusundan, Test Data Sourcea tıklayın. Eğer DSN doğru olarak oluşturulmuşsa, Test Results diyalog kutusu testin doğru olarak tamamlandığını belirtecektir.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Bir Oracle Database File DSN&#8217;i konfigüre etmek için:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">DSN&#8217;i yaratmak istediğiniz bilgisayarda Oracle istemci yazılımının doğru olarak kurulduğuna emin olun.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">1. Create New Data Source diyalog kutusunda, liste kutusundan Microsoft ODBC for Oracle&#8217;ı seçin ve Nexte tıklayın.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">2. DSN dosya isminizi yazın ve Nexte tıklayın.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">3. Veri kaynağını yaratmak için Finishe tıklayın</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">4. Bir kullanıcı adı, şifre ve sunucu ismi girip, OKe tıklayın.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Not: DSN dosyalarının .dsn uzantıları vardır ve \Programs\Common Files\ODBC\Data Sources dizininde yer alırlar.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Bir Veri Tabanına Bağlanmak</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">İlk adım veri tabanı kaynağı ile bir bağlantı kurmaktır. Uygulamalarınız ve ODBC veri tabanları arasında bağlantı kurmak için ADO&#8217;nun Connection nesnesini kullanabilirsiniz. Connection nesnesi veri tabanı bağlantısı kurma, koparma ve günleme için sorgu yapmada kullanılan birçok özellik ve metodu içerir.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Bir veri tabanı bağlantısı kurmak için öncelikle bir Connection nesnesi oluşturun.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Örneğin, aşağıdaki betik Connection nesnesini oluşturur ve bir bağlantı kurar:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Connection Nesnesi ile Sorgu İşlemek</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Connection nesnesinin Execute metodu ile, Structured Query Language (SQL) sorgularınızı veri tabanı kaynağına iletip sonuçları elde edebilirsiniz. Aşağıdaki betik Connection nesnesinin Execute metodunu kullanarak SQL INSERT komutu formundaki bir sorguyu iletir. Bu durumda, betik bloğu Jose Lugo ismini Musteriler isimli veri tabanı tablosuna ekliyor.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">SQL INSERT komutunun yanısıra, SQL UPDATE ve DELETE komutları da kullanılabilir.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Sonuçları İşlemek için Recordset Nesnesini Kullanmak</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Connection nesnesinin birtakım sınırlamaları vardır. Özellikle Connection nesnesiyle veri tabanından veri getiren ve görüntüleyen betikler yazamazsınız. Veri getirmek, sonuçları incelemek ve veri tabanınız üzerinde değişiklikler yapmak için, ADO&#8217;da Recordset nesnesi vardır. Recordset nesnesinin veri getirmek ve birtakım veri tabanı satır veya kayıtlarını görüntülemek gibi özellikleri vardır. Recordset nesnesi sorgu sonucu dönen her kayıtın pozisyonunu tuttuğu için, sonuçlar üzerinde gezebilme imkanınız vardır.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Recordset nesnenizin cursor türü özelliğine göre kayıtlar üzerinde gezip, günleme yapabilirsiniz. Veri tabanı imleçleri göstergeler gibi davranarak, kayıt grubu içinde belli bir yere konumlanabilir. İmleçler, özellikle, kayıtları getirme ve incelem için kullanışlıdır.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Recordset nesnesinin imleç hareketlerini kontrol etme, dolayısıyla sonuçları inceleme ve günleme özelliği vardır. Örneğin, CursorType ve CursorLocation özelliklerini, istemci uygulamanıza sonuçlar döndüren imleç türlerini konfigüre etme ve diğer kullanıcıların veri tabanına yaptığı en son değişiklikleri görmek için kullanabilirsiniz.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Record Set (kayıt grubu) Getirmek</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Başarılı veri tabanı uygulamaları, bağlantı kurmak için Connection nesnesini ve dönen veriyi işlemek için Recordset nesnesini kullanır. Örneğin, aşağıdaki sunucu-taraflı betik bir SQL SELECT komutunu çalıştırmak için Recordset nesnesini kullanır. SELECT komutu sorgu kriterlerine göre belli bir grup bilgi getirir. Sorgu ayrıca SQL WHERE ifadesini de içerir ki bu ifade sorguyu belirli kriterlere göre kısıtlamayı sağlar. Bu örnekte, WHERE ifadesi sorguyu Musteriler veri tabanı tablosundaki soyadı Smith olanlarla sınırlıyor.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Yukarıdaki örnekte, Connection nesnesi veri tabanı bağlantısını kurdu ve Recordset nesnesi de aynı bağlantıyı sonuçları veri tabanından getirmek için kullandı. Bu metod, veri tabanı bağlantısı kurulduğunda hassas konfigürasyonlar yapılacağı zaman avantajlı olur.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Örneğin, bağlantı kopmadan önceki gecikme zamanını belirlemeniz gerekiyorsa, bu özelliği ayarlamak için Connection nesnesini kullanmanız gerekecektir. Ancak, sadece ADO&#8217;nun varsayılan bağlantı özellikleri ile bir bağlantı kurmak istiyorsanız, Recordset nesnesinin Open metodu ile bir bağlantı kurabilirsiniz:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Recordset nesnesinin Open metodu ile bağlantı kuruyorsanız, dolayısıyla bağlantı güvenliğini de Connection nesnesi ile sağlıyorsunuz demektir.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Command Nesnesi ile Sorgu Geliştirmek</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">ADO Command nesnesi ile sorguları, Connection ve Recordset nesnelerinin kullanıldığı yolla çalıştırabilirsiniz. Fakat Command nesnesi ile sorgunuzu veri tabanı kaynağında hazırlayıp ya da derleyip, sorguyu değişik değerlerle de yeniden kullanabilirsiniz. Sorguyu derlemenin faydası, hazırda bulunan bir sorguyu değiştirmek için gerekli sürenin önemli ölçüde azaltılmasıdır. Ayrıca, SQL sorgularınızı, işletimden önce sorgu değiştirme opsiyonu sayesinde, kısmen tanımsız bırakabilirsiniz.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Command nesnesinin Parameters yığını, sorguyu her yeniden kullanışınızda yeniden oluşturma sorununu ortadan kaldırır. Örneğin, Web tabanlı envanter uygulamanızda, malzeme ve fiyat bilgilerini düzenli olarak günlemeniz gerekiyorsa, sorgunuzu aşağıda gösterilen şekilde yeniden tanımlayabilirsiniz:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Yukardaki örneği inceleyecek olursak, sorgu veri tabanı kaynağına tekrar yollanmadan ve tekrar tanımlanmadan, sorgu, değişik değerlerle yeniden kullanılıyor. Sorgularınızı Command nensnesi ile derlemenin bir avantajı da, SQL sorgularını oluşturen dizgileri birleştirirken yaşanabilecek problemleri önlemesidir. Command nesnesinin Parameter yığınını kullanarak, belli dizgi, tarih ve saat türleri tanımlamada yaşanabilecek problemeler kısmen ortadan kalkmış olur. Örneğin, kesme işareti (&#8217;) içeren SQL sorgu değerleri, sorgunun çalışmamasına sebep olabilir:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">strSQL = &#8220;INSERT INTO Musteriler (adi,soyadi) VALUES (&#8217;Robert&#8217;,'O&#8217;Hara&#8217;)&#8221;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Soyadi O&#8217;Hara içinde kesme işareti var ve bu işaret SQL VALUES anahtar kelimesinde verileri belirten kesme işareti ile karışabilir. Command nesnesi kullanınca bu tür problemeler ortadan kalkar.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">HTML Formlarını ve Veri Tabanı Erişimini Birleştirmek</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">HTML formları içeren Web sayfaları, kullanıcılara uzaktan veri tabanına erişip belli bilgilerin getirilmesine olanak verir. ADO ile kullanıcı form bilgilerini biriktiren, bazı veri tabanı sorguları yapabilen ve kullanıcıya bilgi döndürebilen basit betikler yazılabilir. ASP Request nesnesini kullanarak, HTML formuna girilen bilgileri getirebilir, bu bilgiyi SQL ifadelerinize katabilirsiniz. Örneğin, aşağıdaki betik bloğu HTML formundan elde edilmiş bilgileri veri tabanı tablosuna ekler. Betik kullanıcı bilgilerini, Request nesnesinin Form yığını ile biriktirir.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Formlar ve ASP Request nesnesi hakkında daha fazla bilgi için, &#8220;HTML Formlarıyla Çalışmak&#8221;a bakınız.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Veri Tabanı Bağlantısı Başarımı</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Binlerce müşterinin çevrimiçi girişlerini takip etme gibi bir Web veri tabanı uygulamasında asıl önemli olan veri tabanı bağlantısı başarımıdır. Veri tabanı bağlantısını açmak ve kullanmak, hiç bilgi iletimi olmasa bile, veri tabanı kaynaklarını zorlayıp, bağlantı problemlerini yol açabilir. İyi tasarlanmış bir Web veri tabanı uygulaması, veri tabanı bağlantısını geri elde edip, ağ trafiği yüzünden oluşan gecikmeleri telafi edebilmelidir.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Bağlantının Zaman Aşımı</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Bir veri tabanı sunucusu işletim sırasında aniden fazla yüklenmiş olabilir. Böylece yeniden giriş yapılması hatta bağlantının da yeniden kurulması gerekir. Sonuç olarak, aşırı miktarda oluşan bağlantı gecikmeleri uygulamanızın performansını düşürecektir.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Connection nesnesinin ConnectionTimeout&#8217;u, yeniden bağlantı kurma çabaları ve hata mesajları için harcanan zamanı sınırlar. Örneğin, aşağıdaki betik ConnectionTimeout özelliğini bağlantı kurma denemesini yirmi saniye bekledikten sonra iptal edecek şekilde ayarlamaktadır:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Set cn = Server.CreateObject(&#8221;ADODB.Connection&#8221;)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">cn.ConnectionTimeout = 20</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">cn.Open &#8220;FILEDSN=MyDatabase.dsn&#8221;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">ConnectionTimeout özelliğinin varsayılan değeri 30 saniyedir.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Bağlantıları Havuzlama</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Sık sık bağlantı kurup, kesen Web veri tabanı uygulamaları, veri tabanı sunucusunun performansını düşürür. ASP, ODBC 3.5 kullanarak, bağlantı başarımını verimli bir şekilde destekler. Connection biriktirmek, performansı yükseltmek ve boş bağlantı sayısını azaltmak için, açık veri tabanı bağlantılarını korur ve değişik kullanıcılar arasında bağlantı paylaşımını sağlar. Her bağlantı isteminde, bağlantı havuzu öncelikle havuzda boş bağlantı olup olmadığını kontrol eder. Varsa, yeni bağlantı yerine bu bağlantı döndürülür.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Eğer ODBC sürücünüzün bağlantı havuzuna katılmasını istiyorsanız, veri tabanı sürücünüzü konfigüre etmeli ve sürücünün CPTimeout özelliğini Windows NT kayıtlarında ayarlamalısınız. ODBC bir bağlantıyı kesmek isterse, bağlantı koparılmak yerine havuzda saklanır. CPTimeout özelliği, bağlantının havuzda ne kadar süre tutulabileceğini belirler.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Eğer bağlantı CPTimeout&#8217;da belirlenenden daha uzun durmak isterse, bağlantı koparılır ve havuzdan çıkarılır.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Aşağıdaki ayarlarla bir Windows kaydı yaratarak,CPTimeout özelliğine sırayla değer atamak suretiyle bir ODBC veri tabanı sürücüsü için bağlantı havuzlama yapabilirsiniz:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">\HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\driver-name\CPTimeout = timeout</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">(REG_SZ, birimler saniye cinsinden )</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Örneğin, aşağıdaki anahtar, SQL sunucu sürücüsü için, bağlantı havuzu zaman aşımını 180 saniyeye kurar.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">\HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\SQL Server\CPTimeout = 180</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Not: Varsayılmış olarak, Web sunucunuz CPTimeout değerini 60 saniye olarak kurar.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Bağlantıyı Birçok Sayfa Arasında Kullanmak</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Bağlantıyı bir çok sayfa arasında, ASP&#8217;nin Application nesnesi içinde bağlantıyı saklamak suretiyle yeniden kullanabilirsiniz. Ancak bu durumda, bir bağlantıyı gerekmediği halde boşuna açık tutmuş olursunuz. Eğer aynı ASP veri tabanı uygulmasına birden fazla kullanıcı erişmek istiyorsa, bu durumd ASP&#8217;nin Application nesnesinin içine bağlantı dizgisini yerleştirerek, çeşitli Web sayfaları arası veri tabanı bağlantısını yeniden kullanabilirsiniz. Örneğin, bağlantı dizgisini Global.asa dosyasını Application_OnStart olay yordamında belirleyebilirsiniz. Aşağıdaki betikte bu durum örneklenmektedir:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Application.lock</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Application(&#8221;ConnectionString&#8221;) = &#8220;FILEDSN=Veritabanım.dsn&#8221;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Application.unlock</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Artık veri tabanına erişen her ASP dosyasında, sayfada bağlantı nesnesi örneği oluşturmak için, şöyle yazabilirsiniz:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;OBJECT RUNAT=Server ID=cn PROGID=&#8221;ADODB.Connection&#8221;&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;/OBJECT&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Bağlantıyı açmak için şu betiği kullanın:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">cn.Open Application(&#8221;ConnectionString&#8221;)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Ve sayfanın sonunda bağlantıyı koparmak için:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">cn.Close</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Tek bir kullanıcını birçok Web sayfası arasındaki bağlantıyı yeniden kullanmak istemesi durumunda, bağlantı dizgesini saklamak için Application nesnesi yerine Session nesnesini kullanmak daha avantajlıdır.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Bağlantıyı Koparmak</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Bağlantı havuzlamayı en iyi şekilde kullanmak için, veri tabanı bağlantısını olabildiğince çabuk bir şekilde kapatın. Varsayılmış olarak, betiğinizin çalışması bitince bağlantı da kesilir. Ancak, ihtiyaç bitince bağlantınızı kapatırsanız, veri tabanı sunucusunun iş yükünü azaltmış ve bağlantıyı diğer kullanıcıların kullanımına bırakmış olursunuz.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Connection nesnesinin Close metodunu kullanarak, Connection nesnesinin veri tabanı ile olan bağlantısını kesmiş olursunuz. Aşağıdaki betik, bir bağlantıyı açar ve kapar:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;% strDSN = &#8220;FILEDSN=VeriTabanım.dsn&#8221;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Set cn = Server.CreateObject(&#8221;ADODB.Connection&#8221;)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">cn.Open</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">cn.Close</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">%&gt;</div>
<p>ActiveX Data Objects (ADO), Web sayfalarınızda veri tabanı erişimini sağlamada kullanılan kolay kullanılır bir teknolojidir. ADO&#8217;yu Open Database Connectivity (ODBC) veri tabanına ve OLE DB veri kaynaklarına bağlantı kurmak için özlü ve ölçümsel betikler yazmak için kullanılabilir.</p>
<p>ODBC&#8217;de DSN (Data Source Name_Veri Kaynağı İsmi) Oluşturmak</p>
<p>Veri tabanı betiklerini tanımlamadan önce, ADO&#8217;yu yerleştirmeli, tanımlamalı ve veri tabanınızla iletişimini sağlamalısınız. Web uygulamanızdan veri tabanına veri ileten veri tabanı sürücüleri, ODBC veri tabanını yerleştirmek ve tanımlamak için bir DSN kullanırlar. Tipik olarak, DSN, veri tabanı konfigürasyonunu, kullanıcı güvenliğini, ve konum bilgisini içerir ve Windows NT kayıtlarında bir kayıt ya da metin biçimini alabilirler.</p>
<p>ODBC ile oluşturmak istediğiniz DSN türünü seçebilirsiniz: User, System, ya da File. User ve System DSNleri Windows NT kayıtlarında yer alır. System DSN, sunucuya giren her kullanıcının veri tabanına erişmesine izin verir. Oysa User DSN veri tabanı erişiminde, belirli güvenlik kriterlerine göre belirli kullanıcılara izin verir. File DSN, metin biçimini alır, çoklu kullanıcı erişimine izin verir ve bir sunucudan diğerine geçirilmesi, DSN&#8217;i kopyalayarak, kolaydır. Bu sebeple, bu konudaki örneklerde File DSN kullanılmaktadır.</p>
<p>Dosya tabanlı bir DSN&#8217;i oluşturmak için Windows Başlat menüsünden Denetim Masasını açın. ODBC ikonuna çift tıklayın, ve File DSN özelliğini seçin. Adde tıklayın, veri tabanı sürücünüzü seçin, ve Nexte tıklayın. Özel veri tabanı yazılımınız için bir DSN konfigüre etmek için aşağıdaki adımları takip edin.</p>
<p>1. Create New Data Source diyalog kutusunda, liste kutusundan Microsoft Access Driver&#8217;ı seçin ve Nexte tıklayın.</p>
<p>2. DSN dosyanız için bir isim yazın ve Nexte tıklayın..</p>
<p>3. Veri kaynağını oluşturmak için Finishe tıklayın.</p>
<p>4. ODBC Microsoft Access 97 Setup diyalog kutusunda Selecte tıklayın. Bir Microsoft Access veri tabanı ismi (*.mdb) seçin, ve OKe tıklayın.</p>
<p>ASP, uygun veri kaynakları olarak, paylaşılan veri tabanlarını (Microsoft ® Access ya da Microsoft ® FoxPro) destekler. Paylaşılan dosyalı veri tabanlarının tavsiye edilmesine rağmen bu tür veri tabanı motorlarını sadece geliştirme amaçlı kullanınız. Paylaşımlı dosyalı veri tabanları, yüksek istemler için sunucu-istemci veri tabanları kadar uygun olmayabilir.</p>
<p>Bir SQL Server Database File(Sunucu veri tabanı dosyası) DSN&#8217;i tanımlamak için:</p>
<p>Not: Eğer veri tabanı uzak bir sunucuda yeralıyorsa, detaylı konfigürasyon bilgileri için sunucu yöneticinize başvurunuz. Aşağıdaki adımlar SQL sunucusu için varsayılan ODBC ayarlarını kullanır. Bu ayarlar sizin donanımınızda çalışmayabilir.</p>
<p>1. Create New Data Source diyalog kutusunda, liste kutusundan SQL Server&#8217;ı seçin ve Nexte tıklayın.</p>
<p>2. DSN dosyası isminizi yazın ve Nexte tıklayın.</p>
<p>3. Veri kaynağını oluşturmak için Finishe tıklayın.</p>
<p>4. SQL sunucu adını, giriş kimliğinizi ve şifrenizi girin.</p>
<p>5. Create a New Data Source to SQL Server diyalog kutusunda, Server liste kutusundaki SQL sunucu veri tabanını içeren sunucunun adını seçin ve Nexte tıklayın.</p>
<p>6. Giriş numarası güvenliği için bir metod seçin.</p>
<p>7. Eğer SQL Sunucu güveliğini seçtiyseniz, bir giriş kimliği ve şifre girin, Nexte tıklayın.</p>
<p>8. Create a New Data Source to SQL Server diyalog kutusunda, varsayılan veri tabanınızı, sürücü saklama yordam ayarlarını, ve ANSI tanımlarını kurun ve Nexte tıklayın.</p>
<p>9. Diyalog kutusundan (Create a New Data Source to SQL Server), bir karakter çevrim metodu seçin, ve Nexte tıklayın.</p>
<p>10. Bir sonraki diyalog kutusundan (Create a New Data Source to SQL Server), giriş opsiyonlarını seçin.</p>
<p>11. ODBC Microsoft SQL Server Setup diyalog kutusundan, Test Data Sourcea tıklayın. Eğer DSN doğru olarak oluşturulmuşsa, Test Results diyalog kutusu testin doğru olarak tamamlandığını belirtecektir.</p>
<p>Bir Oracle Database File DSN&#8217;i konfigüre etmek için:</p>
<p>DSN&#8217;i yaratmak istediğiniz bilgisayarda Oracle istemci yazılımının doğru olarak kurulduğuna emin olun.</p>
<p>1. Create New Data Source diyalog kutusunda, liste kutusundan Microsoft ODBC for Oracle&#8217;ı seçin ve Nexte tıklayın.</p>
<p>2. DSN dosya isminizi yazın ve Nexte tıklayın.</p>
<p>3. Veri kaynağını yaratmak için Finishe tıklayın</p>
<p>4. Bir kullanıcı adı, şifre ve sunucu ismi girip, OKe tıklayın.</p>
<p>Not: DSN dosyalarının .dsn uzantıları vardır ve \Programs\Common Files\ODBC\Data Sources dizininde yer alırlar.</p>
<p>Bir Veri Tabanına Bağlanmak</p>
<p>İlk adım veri tabanı kaynağı ile bir bağlantı kurmaktır. Uygulamalarınız ve ODBC veri tabanları arasında bağlantı kurmak için ADO&#8217;nun Connection nesnesini kullanabilirsiniz. Connection nesnesi veri tabanı bağlantısı kurma, koparma ve günleme için sorgu yapmada kullanılan birçok özellik ve metodu içerir.</p>
<p>Bir veri tabanı bağlantısı kurmak için öncelikle bir Connection nesnesi oluşturun.</p>
<p>Örneğin, aşağıdaki betik Connection nesnesini oluşturur ve bir bağlantı kurar:</p>
<p>Connection Nesnesi ile Sorgu İşlemek</p>
<p>Connection nesnesinin Execute metodu ile, Structured Query Language (SQL) sorgularınızı veri tabanı kaynağına iletip sonuçları elde edebilirsiniz. Aşağıdaki betik Connection nesnesinin Execute metodunu kullanarak SQL INSERT komutu formundaki bir sorguyu iletir. Bu durumda, betik bloğu Jose Lugo ismini Musteriler isimli veri tabanı tablosuna ekliyor.</p>
<p>SQL INSERT komutunun yanısıra, SQL UPDATE ve DELETE komutları da kullanılabilir.</p>
<p>Sonuçları İşlemek için Recordset Nesnesini Kullanmak</p>
<p>Connection nesnesinin birtakım sınırlamaları vardır. Özellikle Connection nesnesiyle veri tabanından veri getiren ve görüntüleyen betikler yazamazsınız. Veri getirmek, sonuçları incelemek ve veri tabanınız üzerinde değişiklikler yapmak için, ADO&#8217;da Recordset nesnesi vardır. Recordset nesnesinin veri getirmek ve birtakım veri tabanı satır veya kayıtlarını görüntülemek gibi özellikleri vardır. Recordset nesnesi sorgu sonucu dönen her kayıtın pozisyonunu tuttuğu için, sonuçlar üzerinde gezebilme imkanınız vardır.</p>
<p>Recordset nesnenizin cursor türü özelliğine göre kayıtlar üzerinde gezip, günleme yapabilirsiniz. Veri tabanı imleçleri göstergeler gibi davranarak, kayıt grubu içinde belli bir yere konumlanabilir. İmleçler, özellikle, kayıtları getirme ve incelem için kullanışlıdır.</p>
<p>Recordset nesnesinin imleç hareketlerini kontrol etme, dolayısıyla sonuçları inceleme ve günleme özelliği vardır. Örneğin, CursorType ve CursorLocation özelliklerini, istemci uygulamanıza sonuçlar döndüren imleç türlerini konfigüre etme ve diğer kullanıcıların veri tabanına yaptığı en son değişiklikleri görmek için kullanabilirsiniz.</p>
<p>Record Set (kayıt grubu) Getirmek</p>
<p>Başarılı veri tabanı uygulamaları, bağlantı kurmak için Connection nesnesini ve dönen veriyi işlemek için Recordset nesnesini kullanır. Örneğin, aşağıdaki sunucu-taraflı betik bir SQL SELECT komutunu çalıştırmak için Recordset nesnesini kullanır. SELECT komutu sorgu kriterlerine göre belli bir grup bilgi getirir. Sorgu ayrıca SQL WHERE ifadesini de içerir ki bu ifade sorguyu belirli kriterlere göre kısıtlamayı sağlar. Bu örnekte, WHERE ifadesi sorguyu Musteriler veri tabanı tablosundaki soyadı Smith olanlarla sınırlıyor.</p>
<p>Yukarıdaki örnekte, Connection nesnesi veri tabanı bağlantısını kurdu ve Recordset nesnesi de aynı bağlantıyı sonuçları veri tabanından getirmek için kullandı. Bu metod, veri tabanı bağlantısı kurulduğunda hassas konfigürasyonlar yapılacağı zaman avantajlı olur.</p>
<p>Örneğin, bağlantı kopmadan önceki gecikme zamanını belirlemeniz gerekiyorsa, bu özelliği ayarlamak için Connection nesnesini kullanmanız gerekecektir. Ancak, sadece ADO&#8217;nun varsayılan bağlantı özellikleri ile bir bağlantı kurmak istiyorsanız, Recordset nesnesinin Open metodu ile bir bağlantı kurabilirsiniz:</p>
<p>Recordset nesnesinin Open metodu ile bağlantı kuruyorsanız, dolayısıyla bağlantı güvenliğini de Connection nesnesi ile sağlıyorsunuz demektir.</p>
<p>Command Nesnesi ile Sorgu Geliştirmek</p>
<p>ADO Command nesnesi ile sorguları, Connection ve Recordset nesnelerinin kullanıldığı yolla çalıştırabilirsiniz. Fakat Command nesnesi ile sorgunuzu veri tabanı kaynağında hazırlayıp ya da derleyip, sorguyu değişik değerlerle de yeniden kullanabilirsiniz. Sorguyu derlemenin faydası, hazırda bulunan bir sorguyu değiştirmek için gerekli sürenin önemli ölçüde azaltılmasıdır. Ayrıca, SQL sorgularınızı, işletimden önce sorgu değiştirme opsiyonu sayesinde, kısmen tanımsız bırakabilirsiniz.</p>
<p>Command nesnesinin Parameters yığını, sorguyu her yeniden kullanışınızda yeniden oluşturma sorununu ortadan kaldırır. Örneğin, Web tabanlı envanter uygulamanızda, malzeme ve fiyat bilgilerini düzenli olarak günlemeniz gerekiyorsa, sorgunuzu aşağıda gösterilen şekilde yeniden tanımlayabilirsiniz:</p>
<p>Yukardaki örneği inceleyecek olursak, sorgu veri tabanı kaynağına tekrar yollanmadan ve tekrar tanımlanmadan, sorgu, değişik değerlerle yeniden kullanılıyor. Sorgularınızı Command nensnesi ile derlemenin bir avantajı da, SQL sorgularını oluşturen dizgileri birleştirirken yaşanabilecek problemleri önlemesidir. Command nesnesinin Parameter yığınını kullanarak, belli dizgi, tarih ve saat türleri tanımlamada yaşanabilecek problemeler kısmen ortadan kalkmış olur. Örneğin, kesme işareti (&#8217;) içeren SQL sorgu değerleri, sorgunun çalışmamasına sebep olabilir:</p>
<blockquote><p>strSQL = &#8220;INSERT INTO Musteriler (adi,soyadi) VALUES (&#8217;Robert&#8217;,'O&#8217;Hara&#8217;)&#8221;</p></blockquote>
<p>Soyadi O&#8217;Hara içinde kesme işareti var ve bu işaret SQL VALUES anahtar kelimesinde verileri belirten kesme işareti ile karışabilir. Command nesnesi kullanınca bu tür problemeler ortadan kalkar.</p>
<p>HTML Formlarını ve Veri Tabanı Erişimini Birleştirmek</p>
<p>HTML formları içeren Web sayfaları, kullanıcılara uzaktan veri tabanına erişip belli bilgilerin getirilmesine olanak verir. ADO ile kullanıcı form bilgilerini biriktiren, bazı veri tabanı sorguları yapabilen ve kullanıcıya bilgi döndürebilen basit betikler yazılabilir. ASP Request nesnesini kullanarak, HTML formuna girilen bilgileri getirebilir, bu bilgiyi SQL ifadelerinize katabilirsiniz. Örneğin, aşağıdaki betik bloğu HTML formundan elde edilmiş bilgileri veri tabanı tablosuna ekler. Betik kullanıcı bilgilerini, Request nesnesinin Form yığını ile biriktirir.</p>
<p>Formlar ve ASP Request nesnesi hakkında daha fazla bilgi için, &#8220;HTML Formlarıyla Çalışmak&#8221;a bakınız.</p>
<p>Veri Tabanı Bağlantısı Başarımı</p>
<p>Binlerce müşterinin çevrimiçi girişlerini takip etme gibi bir Web veri tabanı uygulamasında asıl önemli olan veri tabanı bağlantısı başarımıdır. Veri tabanı bağlantısını açmak ve kullanmak, hiç bilgi iletimi olmasa bile, veri tabanı kaynaklarını zorlayıp, bağlantı problemlerini yol açabilir. İyi tasarlanmış bir Web veri tabanı uygulaması, veri tabanı bağlantısını geri elde edip, ağ trafiği yüzünden oluşan gecikmeleri telafi edebilmelidir.</p>
<p>Bağlantının Zaman Aşımı</p>
<p>Bir veri tabanı sunucusu işletim sırasında aniden fazla yüklenmiş olabilir. Böylece yeniden giriş yapılması hatta bağlantının da yeniden kurulması gerekir. Sonuç olarak, aşırı miktarda oluşan bağlantı gecikmeleri uygulamanızın performansını düşürecektir.</p>
<p>Connection nesnesinin ConnectionTimeout&#8217;u, yeniden bağlantı kurma çabaları ve hata mesajları için harcanan zamanı sınırlar. Örneğin, aşağıdaki betik ConnectionTimeout özelliğini bağlantı kurma denemesini yirmi saniye bekledikten sonra iptal edecek şekilde ayarlamaktadır:</p>
<blockquote><p>Set cn = Server.CreateObject(&#8221;ADODB.Connection&#8221;)</p>
<p>cn.ConnectionTimeout = 20</p>
<p>cn.Open &#8220;FILEDSN=MyDatabase.dsn&#8221;</p></blockquote>
<p>ConnectionTimeout özelliğinin varsayılan değeri 30 saniyedir.</p>
<p>Bağlantıları Havuzlama</p>
<p>Sık sık bağlantı kurup, kesen Web veri tabanı uygulamaları, veri tabanı sunucusunun performansını düşürür. ASP, ODBC 3.5 kullanarak, bağlantı başarımını verimli bir şekilde destekler. Connection biriktirmek, performansı yükseltmek ve boş bağlantı sayısını azaltmak için, açık veri tabanı bağlantılarını korur ve değişik kullanıcılar arasında bağlantı paylaşımını sağlar. Her bağlantı isteminde, bağlantı havuzu öncelikle havuzda boş bağlantı olup olmadığını kontrol eder. Varsa, yeni bağlantı yerine bu bağlantı döndürülür.</p>
<p>Eğer ODBC sürücünüzün bağlantı havuzuna katılmasını istiyorsanız, veri tabanı sürücünüzü konfigüre etmeli ve sürücünün CPTimeout özelliğini Windows NT kayıtlarında ayarlamalısınız. ODBC bir bağlantıyı kesmek isterse, bağlantı koparılmak yerine havuzda saklanır. CPTimeout özelliği, bağlantının havuzda ne kadar süre tutulabileceğini belirler.</p>
<p>Eğer bağlantı CPTimeout&#8217;da belirlenenden daha uzun durmak isterse, bağlantı koparılır ve havuzdan çıkarılır.</p>
<p>Aşağıdaki ayarlarla bir Windows kaydı yaratarak,CPTimeout özelliğine sırayla değer atamak suretiyle bir ODBC veri tabanı sürücüsü için bağlantı havuzlama yapabilirsiniz:</p>
<blockquote><p>\HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\driver-name\CPTimeout = timeout</p></blockquote>
<p>(REG_SZ, birimler saniye cinsinden )</p>
<p>Örneğin, aşağıdaki anahtar, SQL sunucu sürücüsü için, bağlantı havuzu zaman aşımını 180 saniyeye kurar.</p>
<blockquote><p>\HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\SQL Server\CPTimeout = 180</p></blockquote>
<p>Not: Varsayılmış olarak, Web sunucunuz CPTimeout değerini 60 saniye olarak kurar.</p>
<p>Bağlantıyı Birçok Sayfa Arasında Kullanmak</p>
<p>Bağlantıyı bir çok sayfa arasında, ASP&#8217;nin Application nesnesi içinde bağlantıyı saklamak suretiyle yeniden kullanabilirsiniz. Ancak bu durumda, bir bağlantıyı gerekmediği halde boşuna açık tutmuş olursunuz. Eğer aynı ASP veri tabanı uygulmasına birden fazla kullanıcı erişmek istiyorsa, bu durumd ASP&#8217;nin Application nesnesinin içine bağlantı dizgisini yerleştirerek, çeşitli Web sayfaları arası veri tabanı bağlantısını yeniden kullanabilirsiniz. Örneğin, bağlantı dizgisini Global.asa dosyasını Application_OnStart olay yordamında belirleyebilirsiniz. Aşağıdaki betikte bu durum örneklenmektedir:</p>
<blockquote><p>Application.lock</p>
<p>Application(&#8221;ConnectionString&#8221;) = &#8220;FILEDSN=Veritabanım.dsn&#8221;</p>
<p>Application.unlock</p></blockquote>
<p>Artık veri tabanına erişen her ASP dosyasında, sayfada bağlantı nesnesi örneği oluşturmak için, şöyle yazabilirsiniz:</p>
<blockquote><p>&lt;OBJECT RUNAT=Server ID=cn PROGID=&#8221;ADODB.Connection&#8221;&gt;</p>
<p>&lt;/OBJECT&gt;</p></blockquote>
<p>Bağlantıyı açmak için şu betiği kullanın:</p>
<blockquote><p>cn.Open Application(&#8221;ConnectionString&#8221;)</p></blockquote>
<p>Ve sayfanın sonunda bağlantıyı koparmak için:</p>
<blockquote><p>cn.Close</p></blockquote>
<p>Tek bir kullanıcını birçok Web sayfası arasındaki bağlantıyı yeniden kullanmak istemesi durumunda, bağlantı dizgesini saklamak için Application nesnesi yerine Session nesnesini kullanmak daha avantajlıdır.</p>
<p>Bağlantıyı Koparmak</p>
<p>Bağlantı havuzlamayı en iyi şekilde kullanmak için, veri tabanı bağlantısını olabildiğince çabuk bir şekilde kapatın. Varsayılmış olarak, betiğinizin çalışması bitince bağlantı da kesilir. Ancak, ihtiyaç bitince bağlantınızı kapatırsanız, veri tabanı sunucusunun iş yükünü azaltmış ve bağlantıyı diğer kullanıcıların kullanımına bırakmış olursunuz.</p>
<p>Connection nesnesinin Close metodunu kullanarak, Connection nesnesinin veri tabanı ile olan bağlantısını kesmiş olursunuz. Aşağıdaki betik, bir bağlantıyı açar ve kapar:</p>
<blockquote><p>&lt;% strDSN = &#8220;FILEDSN=VeriTabanım.dsn&#8221;</p>
<p>Set cn = Server.CreateObject(&#8221;ADODB.Connection&#8221;)</p>
<p>cn.Open</p>
<p>cn.Close</p>
<p>%&gt;</p></blockquote>
<p>Not; Bu yazı 04 Aralık 2003 tarihinde <a href="http://www.sorucevap.com/uyeler/dersler.asp?maxiturk">http://www.sorucevap.com/uyeler/dersler.asp?maxiturk</a> adresinde tarafımca yayınlanmıştır.</p>
<p>Kolay Gelsin <img src='http://www.tunahan.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.tunahan.net/2009/12/15/veri-tabani-erisimi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
