<?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>KnbykL Official Web Site &#124; Web Security, Web Applications Security</title>
	<atom:link href="http://www.knbykl.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.knbykl.org</link>
	<description>Web Security, Articles and Applications, Hacking Methods, SQL Injection, CSRF, XSRF and Server Security</description>
	<lastBuildDate>Tue, 23 Jun 2009 17:15:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Internette Gezinmenin Güvenli Yolları</title>
		<link>http://www.knbykl.org/internette-gezinmenin-guvenli-yollari/</link>
		<comments>http://www.knbykl.org/internette-gezinmenin-guvenli-yollari/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 17:15:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Advisories]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Web Security]]></category>
		<category><![CDATA[Computer Security Institute]]></category>
		<category><![CDATA[Internette Güvenliği Nasıl Sağlarım?]]></category>

		<guid isPermaLink="false">http://www.knbykl.org/?p=233</guid>
		<description><![CDATA[
İnternetin giderek yaygınlaşması, bilişim güvenliğinin önem kazanan bir konu haline getirdi. Bilişim güvenliği; teknolojik önlemlerle sağlandığı gibi kullanıcıların bilgilenmesi ve internet kullanımında gösterecekleri dikkat ile de sağlanabilir. İşte yapmanız ve yapmamanız gerekenler…


Yaşamımızın bir çok alanında bilgisayar ve ağ teknolojileri olmazsa olmazlar arasında yerini almıştır. Kamu hizmetleri, askeriye, internet bankacılığı, para transferleri, iletişim, ticaret ve daha [...]]]></description>
			<content:encoded><![CDATA[<div>
<p>İnternetin giderek yaygınlaşması, bilişim güvenliğinin önem kazanan bir konu haline getirdi. Bilişim güvenliği; teknolojik önlemlerle sağlandığı gibi kullanıcıların bilgilenmesi ve internet kullanımında gösterecekleri dikkat ile de sağlanabilir. İşte yapmanız ve yapmamanız gerekenler…<br />
<img class="alignnone size-full wp-image-237" title="internette-gezinmenin-guvenli-yollari-image-img" src="http://www.knbykl.org/wp-content/uploads/2009/06/internette-gezinmenin-guvenli-yollari-image-img.jpg" alt="internette-gezinmenin-guvenli-yollari-image-img" width="615" height="100" /><br />
<span id="more-233"></span></p>
<p>Yaşamımızın bir çok alanında bilgisayar ve ağ teknolojileri olmazsa olmazlar arasında yerini almıştır. Kamu hizmetleri, askeriye, internet bankacılığı, para transferleri, iletişim, ticaret ve daha sayamadığımız bir çok alanda bilişim güvenliği karşımıza çıkmaktadır. Teknolojinin bu kadar ilerlemesiyle internet ağı legal olarak kullanıldığı gibi illegal olarak da kullanım göstermektedir.</p>
<p>Bilişim sistemlerine olan bireysel ve toplumsal bağımlılığımız arttıkça bu konuda ki oluşabilecek her türlü saldırıya karşı duyarlılık ve güvenlik politikası artacaktır. Çünkü illegal diye tabir ettiğimiz saldırılara karşı güvenlik önlemlerimiz, saldırıyı gerçekleştiren kişi seviyesinde olmazsa prestij, zaman, para ve dolaylı olarak bilgi kaybına yol açacaktır.</p>
<p>Bilgisayar Güvenliği Enstitüsü (<span style="color: #99cc00;">Computer Security Institute – CSI</span>) ve Federal Araştırma Bürosu (<span style="color: #99cc00;">FBI</span>) tarafından her yıl gerçekleştirilen Bilgisayar Suçları ve Güvenlik Araştırması projelerinin raporlarına göre her yıl neredeyse ikiye katlanacak şekilde artmıştır.</p>
<p>Bilişim Güvenliği kapsamlı bir bölüm olmasına rağmen temel olarak dört prensipten meydana gelmektedir.</p>
<p>« Süreklilik (<span style="color: #99cc00;">Availability</span>)</p>
<p>« Gizlilik (<span style="color: #99cc00;">Confidentiality</span>)</p>
<p>« Veri Bütünlüğü (<span style="color: #99cc00;">Data Integrity</span>)</p>
<p>« Güvenlik Boşluğu (<span style="color: #99cc00;">Vulnerability</span>)</p>
<p>« Süreklilik (<span style="color: #99cc00;">Availability</span>)</p>
<p>Bilişim Sistemleri; yapmakla mükellef olduğu görevleri yerine getirirken bu esnada hedef olarak yüksek performans söz konusudur. Gerçekleştirilen bu performans sayesinde güvenliği sağlanan kişi ya da kurumların memnuniyeti artar böylece daha çok iş olanağı ve teknolojinin daha çabuk ilerlemesine sebep olur. Süreklilik hizmeti; bilişim sistemi içerisinde, içeriden veya dışarıdan gelebilecek her türlü saldırıya karşı korumayı hedefler. Süreklilik hizmeti sayesinde internet kullanıcıları verilerine erişim yetkileri sınırlarında güvenilir bir şekilde ulaşmış olurlar. Bu sayede süreklilik, yalnızca sisteme zarar vermeye çalışan hacker haricinde, sistemin teknik hatalarını ve tekniksel olarak bilinçsiz personeller tarafından hazırlanmış sistemleri ele alır.</p>
<p><strong>« Gizlilik (<span style="color: #99cc00;">Confidentiality</span>)</strong></p>
<p>Gizlilik; verilerin yetkisiz kişilerin eline geçmesini engelleyen bir metottur. Bu yol hem kalıcı ortamlarda bulunan verileri (bknz: hard, flash, vs disk, CD, DVD) hem de ağ üzerinde bir göndericiden bir alıcıya gönderilen veriler için söz konusudur. Hackerlar, yetkileri kısıtlı olan her türlü verilere bir çok metotla erişebilirler. Örnek verecek olursak; Sosyal mühendislik, parolaların çalınmasını sağlayacak keylogger, trojan, worm, vs gibi kendi yöntemleriyle kullanıcının gizli bilgilerine erişebilir, gerek veri kaybı gerek zaman gerekse maddi zarara sebep olabilir.</p>
<p><strong>« Veri Bütünlüğü (<span style="color: #99cc00;">Data Integrity</span>)</strong></p>
<p>Veri bütünlüğü metodunun amacı; gönderilen verinin tamamı ve güvenilir bir şekilde alıcıya iletilmesi işidir. Bu sayede veri, eksiksiz olarak, değiştirilmemiş, ekleme veya eksiltme olmamış, sırası değiştirilmemiş, bir kısmı veya tamamı tekrar edilmemiş bir şekilde alıcısına ulaşır. Veri bütünlüğü konusunda, verinin gönderici tarafından sınaması yapılabilir, bu sayede bilginin değiştirilip değiştirilmediği bariz bir şekilde belli olur.</p>
<p>Yukarıda bahsettiğimiz metotların yanında ağ güvenliği açısından kimlik sınaması şarttır. Şöyle ki; veri alışverişinde, göndericinin alıcı konusunda kimlik sınaması yapıp doğru kişi olup olmadığı belirlenmelidir. Bununla beraber bilişim sistemleri açık ve net olarak fazlasıyla tehditlere maruz kalabilir.</p>
<p>Örneğin internet kullanıcısının sistemi bilinçsizce ve yeterli beceriye, bilgiye sahip olmadan kullanması sonucu kötü niyetli olmayan tehditler görülür. Aksine sisteme zarar verme amacıyla, sisteme yönelik yapılan saldırı ve tehditler de kötü niyetli davranışları gösterir. Bu konuda genel olarak sistemin zafiyetlerinden yararlanılır.</p>
<p><strong>« Güvenlik Boşluğu (<span style="color: #99cc00;">Vulnerability</span>) </strong></p>
<p>Güvenlik boşluğu yani Vulnerability diye adlandırdığımız bu terim, sistem üzerindeki yazılım ve donanımdan kaynaklanan veya sistemdeki açık noktalar, zayıf kalmış yönlerin bütününe verilmiş bir addır. Bu güvenlik boşluğu sayesinde saldırıyı gerçekleştiren hacker, sistem ağına yetkisiz olarak sınırsız yetki ile erişebilir. Yazılım veya donanımdan kaynaklanan bu güvenlik boşlukları, sistem yöneticisi veya başka bir güvenlik grubu tarafından geliştirilen yama program yardımıyla kapanabilir.</p>
<p>Güvenlik Boşluğu oluşturabilecek tehditler;</p>
<p><span style="color: #ff9900;">»</span> Anti virüs yazılımının eksikliği sonucu oluşan virüsler<br />
<span style="color: #ff9900;">»</span> Sistem Ağı üzerindeki zafiyetleri kullanarak sızan hackerlar ve bu sayede ulaşılabilen gizli bilgiler<br />
<span style="color: #ff9900;">»</span> İşletim sistemindeki yanlış bir parametre ve sistemin çalışmasına engel olması<br />
<span style="color: #ff9900;">»</span> Erişim denetim mekanizmalarının yetersizliği<br />
<span style="color: #ff9900;">»</span> İllegal olarak yazılmış bilgisayar programları<br />
<span style="color: #ff9900;">»</span> Güvenliği sağlayacak kişi veya grubun olmayışı<br />
<span style="color: #ff9900;">»</span> Güvenlik duvarlarının yetersiz olması</p>
<p>vs. şeklinde sıralayabiliriz.</p>
<p>Bu tehditler, tedbir yardımı ile azaltılabilir. Şöyle ki alınan her tedbir; güvenlik boşluğunun oluşturduğu zafiyetleri ortadan kaldırır ve hackerın bunu kendi lehine kullanması olasılığını azaltır. Bilişim güvenliğinin sağlanması üç temel açıdan oluşur. Bunlar;</p>
<p><span style="color: #ff9900;">»</span> Yönetsel Önlemler<br />
<span style="color: #ff9900;">»</span> Teknolojik Uygulamalar<br />
<span style="color: #ff9900;">»</span> Eğitim ve Farkındalıktır.</p>
<p><strong>Bilişim Güvenliği ve Bilişim Suçlarına Karşı Mücadele Derneği </strong>adına<strong> Volkan BİLGİÇ</strong></div>
]]></content:encoded>
			<wfw:commentRss>http://www.knbykl.org/internette-gezinmenin-guvenli-yollari/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Cross-Site Request Forgery Atağından Korunmanın Yolu</title>
		<link>http://www.knbykl.org/cross-site-request-forgery-atagindan-korunmanin-yolu/</link>
		<comments>http://www.knbykl.org/cross-site-request-forgery-atagindan-korunmanin-yolu/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 14:01:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Advisories]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Web Security]]></category>
		<category><![CDATA[Cross-Site Request Forgery Security]]></category>
		<category><![CDATA[Cross-Site Request Forgery'den nasıl korunurum?]]></category>
		<category><![CDATA[CSRF Patch]]></category>
		<category><![CDATA[CSRF'den nasıl korunurum?]]></category>
		<category><![CDATA[XSRF Patch]]></category>

		<guid isPermaLink="false">http://www.knbykl.org/?p=202</guid>
		<description><![CDATA[Şubatın 19&#8242;unda Mesut TIMUR tarafından yazılan bir makaleyi sizlerle paylaşmayı düşündüm, bu makaleyi okuyup anladığınızda Cross-Site Request Forgery atağından nasıl korunacağınızı da anlamış olacaksınız. Mesut Bey&#8217;e CSRF Güvenliği&#8217;ne verdiği destekten dolayı teşekkür etmemiz gerekir.


CSRF, Cross-Site Request Forgery, web uygulamalarındaki çeşitli fonksiyonalitelerin mağdur kullanıcının bilgisi dahilinde olmadan onun  hak ve yetkileri ile saldırganlarca kullanılmasıdır. Bu döküman, [...]]]></description>
			<content:encoded><![CDATA[<p>Şubatın 19&#8242;unda <strong>Mesut TIMUR</strong> tarafından yazılan bir makaleyi sizlerle paylaşmayı düşündüm, bu makaleyi okuyup anladığınızda <span style="color: #99cc00;">Cross-Site Request Forgery</span> atağından nasıl korunacağınızı da anlamış olacaksınız. Mesut Bey&#8217;e CSRF Güvenliği&#8217;ne verdiği destekten dolayı teşekkür etmemiz gerekir.<br />
<img class="alignnone size-full wp-image-228" title="csrf-security-güvenlik-image-img" src="http://www.knbykl.org/wp-content/uploads/2009/06/csrf-security-güvenlik-image-img.jpg" alt="csrf-security-güvenlik-image-img" width="615" height="100" /><br />
<span id="more-202"></span></p>
<p>CSRF, Cross-Site Request Forgery, web uygulamalarındaki çeşitli fonksiyonalitelerin mağdur kullanıcının bilgisi dahilinde olmadan onun  hak ve yetkileri ile saldırganlarca kullanılmasıdır. Bu döküman, geliştiriciler için bir CSRF referansı olma amacı gütmekle beraber <strong>çok geç </strong>kaleme alınmıştır.</p>
<h2><strong>Problem Nerede Başlıyor ?</strong></h2>
<p>Problemin başlangıç noktası HTTP&#8217;nin <em>stateless</em> (durum bilgisinden yoksun) bir protokol olmasıdır. Ardı ardına yapılan HTTP istekleri ve cevapları sıra numarası taşımadıkları için, ilgili kişiler dışında başkaları tarafından da oluşturulabilmesi sebebiyle, kullanıcı ile web sunucu arasında başlamış iletişim, saldırganların kurban kullanıcılara yaptırdıkları isteklerle devam ettirilebiliyor. Paket içerisinde sıra numarası, token, anahtar gibi bir mekanizma olması halinde; bu bilgiler saldırganlarca ele geçirilemediği durumlarda, kurban adına istek yapılması mümkün olamayacaktır. Bilgi güvenliğinde bu konu &#8220;Confused Deputy&#8221; problemi olarak sınıflandırılmıştır [1]</p>
<h2><strong>Konunun Önemi </strong></h2>
<p>Bir saldırganın CSRF ile verebileceği zarar, ilgili zafiyetin bulunduğu web uygulamasının yetenekleri ile doğru orantılıdır. Bir elektronik posta hizmeti veren web servisinde ilgili zafiyet tespit edilirse saldırganın yapabileceği mağdur kullanıcının hesabıyla mail atmak olacaktır.</p>
<h1><strong>0&#215;01 : Zafiyetin İncelenmesi</strong></h1>
<h2>Senaryo</h2>
<p>Örneğin bir internet bankacılığı uygulamasında CSRF zafiyeti mevcut olsun. Mağdur kullanıcı, favori internet tarayıcısının bir tab&#8217;ında internet bankacılığı uygulamasını kullanırken, diğer tab&#8217;ında futbol maçları ile ilgili yorumların yapıldığı bir forumu takip etmektedir. Forumun yöneticisi, giriş sayfasına bir resim koymuştur, fakat resim bir sebepten dolayı görüntülenememektedir. Bunun üzerine sayfanın kaynak kodlarından, ilgili resmi ifade eden HTML kodlarına bakan mağdur kullanıcı, birden dehşete düşer.</p>
<p><span style="color: #ccffff;"><span style="color: #33cccc;"><span style="color: #00ccff;">&lt;<span style="color: #ffcc00;">img src</span>=</span>&#8220;</span><span style="color: #99cc00;">http://bank.example/withdraw?account=1&amp;amount=1000000&amp;for=forumadmin</span><span style="color: #00ccff;">&#8220;&gt;</span></span></p>
<p>Tarayıcının, bu resmi yüklemek için src etiketinde verilen adrese istek yapmasından başlayarak oluşan süreci inceleyelim.</p>
<p>1.  İnternet bankacılığı uygulamasına, Mağdur kullanıcının hesabından belli bir paranın saldırganın hesabına geçirilmesi şeklinde istek yapılır.<br />
2.  Eğer uygulamaya o an giriş yapılmış durumda ise, ya da uygulamanın &#8220;Beni Hatırla&#8221; gibi bir seçeneği işaretlenmişse, tarayıcı bu isteğin ardına , gerekli oturum (session) ya da çerez (cookie) bilgilerini ekleyecektir.<br />
3.  İstek internet bankacılığı uygulamasına gelecektir. Mantıklı bir uygulamanın burada yapması gereken istekle beraber gelen oturum ya da çerez bilgilerinin geçerli olup olmadığının kontrolü ardından isteğin yürütülmesidir.<br />
4.  Bir üst adımda problem olmadığı durumda, ilgili istek gerçekleşecek ve para transferi başarı ile sonuçlanacaktır.</p>
<p>Yasal bir şekilde kullanıcı tarafından yapılmış istek sol tarafta gösterilirken, bir CSRF saldırısının diyagramı sağdaki gibidir.</p>
<table style="height: 231px;" border="0" cellspacing="0" cellpadding="3" width="676">
<tbody>
<tr>
<td width="50%"><img class="alignnone size-full wp-image-212" title="d922dvw_21crjh3p6f_b" src="http://www.knbykl.org/wp-content/uploads/2009/06/d922dvw_21crjh3p6f_b.gif" alt="d922dvw_21crjh3p6f_b" width="329" height="222" /></td>
<td width="50%"><img class="alignnone size-full wp-image-213" title="d922dvw_20fn5tjcgv_b" src="http://www.knbykl.org/wp-content/uploads/2009/06/d922dvw_20fn5tjcgv_b.gif" alt="d922dvw_20fn5tjcgv_b" width="329" height="224" /></td>
</tr>
</tbody>
</table>
<h2>Problemin Analizi ve Çözüm Fikirleri</h2>
<p>Görüldüğü üzere kurban kullanıcının bilgisi dahilinde olmadan, onun yerine bir internet uygulaması saldırgan lehine kullanılmıştır. Burada problem kimden kaynaklanmaktadır ?</p>
<p>1. Mağdur Kullanıcı :<br />
İlgili kişinin, her girdiği web sayfasının HTML kodlarını inceleyip ondan sonra yüklemek gibi bir durumu olmadığından kurban kişinin yapabileceği pek bir şey bulunmamaktadır. &#8220;Beni Hatırla&#8221; opsiyonunu kullanmayarak ve kritik bir uygulamada gezerken, internetin geri kalanı ile ilgilenmeyerek bir miktar atak yüzeyini daraltabilir fakat bu önlemler pratik olarak çok uygulanabilir değildir.</p>
<p>2. Kurban Uygulama :<br />
İlgili uygulama, örneğimizdeki gibi oturum ve çerez bilgilerine güvenip çalışıyor ise bu zafiyete karşı korunmasız demektir. Saldırgan örnekte de gösterildiği gibi çok basit şekilde uygulamaya, mağdur kişiden geliyormuşcasına istekler gönderebilirler.</p>
<p>Zafiyet esas itibariyle kurban uygulamadan kaynaklandığı için yapılması gereken ilgili uygulamanın mağdur kişinin kendi bilgisi dışında yapılan istekleri kabul etmemektir. Peki gelen isteğin, kişinin kendisinin mi yaptığı, yoksa başka bir saldırgan tarafından mı tetiklendiği ne şekilde anlaşılabilir ?</p>
<p>Bu noktada yapılması gereken ile ilgili ipucu ilk bölümde verilmiştir. Temel sorun aslında HTTP&#8217;nin <em>stateless </em>bir protokol olması, ve bu durumun geliştirici tarafından giderilmesi gerekliliğidir. Yani tıpkı TCP/IP&#8217;de olduğu gibi giden gelen paketlere numaralar (sıra) verilmeli ve bu sayılar üçüncü şahıslar tarafından tahmin edilememelidir. [3]</p>
<h1><strong>0&#215;02 : Yetersiz Çözümler</strong></h1>
<p>Bu bölümde problem için çözüm olarak ilk akla gelen, fakat yetersiz olan çözüm yollarından bahsedilecektir. Bunlar tek başlarına çözüm olarak işe yaramazken, 0&#215;03 numaralı başlıktaki çözüm önerilerine eklenmeleri durumunda derinlemesine defans önlemi olarak işlev göreceklerdir.</p>
<h2><strong>Referer&#8217;i Kontrol Etmek</strong></h2>
<p>İstek, web uygulamasına ulaştıktan sonra HTTP başlık bilgilerinden &#8220;REFERER&#8221; bilgisine bakılarak nereden geldiği tespit edilebilir ve isteğin kullanıcıdan mı, yoksa saldırı yapmaya çalışan bir web uygulamasından mı geldiği anlaşılabilir. Fakat &#8220;REFERER&#8221; isimli HTTP başlık bilgisi, değiştirilebilir olduğu için bu bilgiye güvenilerek doğrulama yapılması büyük bir hata olacaktır. Ayrıca REFERER başlığını kimi vekil sunucular kesebilmektedir.</p>
<h2><strong>Kritik İşlemleri POST ile Yapmak</strong></h2>
<p>0&#215;01 no&#8217;lu başlığımızda incelenen atak GET dizisi içerisinde işlem tipi ve boyutları gönderilerek gerçekleştiriliyordu. Bundan dolayı bir image etiketinin kaynak bilgisine girilebilmiş, ve resmin görüntülenmesiyle atak gerçekleşmişti. Kritik işlemler ile ilgili bilgilerin taşınması sırasında POST kullanılırsa bu tip zafiyetlerden korunulabilirmiş gibi gelebilir, fakat çok basitçe bir form oluşturup, ilgili kullanıcı o sayfayı görüntüleyince ilgili form kaydettirilerek atak gerçekleştirilmesi mümkündür. Haricinde XMLHTTPRequest nesnesi ile de yapılabilir.</p>
<p>Basitçe şu şekilde yapılır:</p>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="100%"><span style="color: #00ccff;">&lt;script&gt;<br />
<span style="color: #99cc00;"><strong>var</strong> post_data = &#8216;name=value&#8217;;<br />
<strong>var</strong> xmlhttp=<strong>new</strong> XMLHttpRequest();<br />
xmlhttp.open(&#8221;POST&#8221;, &#8216;<span style="color: #ff9900;">http://url/path/file.ext</span>&#8216;, true);<br />
xmlhttp.onreadystatechange = <strong>function</strong> ()<br />
{<br />
<strong> if</strong> (xmlhttp.readyState == 4)<br />
{<br />
alert(xmlhttp.responseText);<br />
}<br />
};<br />
xmlhttp.send(post_data);</span><br />
&lt;/script&gt;</span></td>
</tr>
</tbody>
</table>
<h1>0&#215;03 : Zafiyetin Çözümü</h1>
<p>Zafiyetin çözümü ile ilgili fikirlere bir üst başlıkta değinilmişti. Bu bölümde reel çözüm önerileri ve zafiyetin platformlardaki durumu incelenecektir.</p>
<h2><strong>Platformların Durumu</strong></h2>
<p>ASP.net uygulamaları, ViewState mekanizması aktif durumdayken CSRF zafiyetine karşı korumalı durumdadırlar. Lakin bu mekanizma beraberinde bazı problemleri ve eksikleri bünyesinde barındırmaktadır.[2]      Her ASP.net sayfasında bu mekanizma aktif olmayabilir, ya da yanlışlıkla kapatmış olabilirsiniz. Sadece POST dizisi üzerinde koruma sağlar. GET dizisindeki parametreler, hala CSRF saldırılarına açıktır. ViewState her HTTP isteği için pakete eklediği veriler sebebiyle paket boyutunu arttıracak ve iletişimin hızını düşürecektir.          [3]ViewState, sonuç itibariyle istemci tarafından kontrol edilebileceği için her türlü manipülasyona açık durumdadır. Bundan dolayı ViewState MAC etkin durumda olmalıdır.<br />
Bunun dışında ViewState&#8217;lerin sadece belli bir kullanıcıya ait olduğunda geçerli olması için, <strong>OnInit()</strong> ya da <strong>Page_Init(</strong>) metotlarına aşağıdaki kod eklenmelidir.</p>
<p><strong>ViewStateUserKey = Session.SessionID;</strong></p>
<p>Ruby on Rails haricinde bu zafiyet ile ilgili olarak koruma ya da API sağlayan başka bir dil/framework bulunmamaktadır.[4]</p>
<h2>Temel Çözüm</h2>
<p>Zafiyetin çözülmesi için temek fikir şu şekildedir :</p>
<ol>
<li> Her yapılan isteğin sonucunda kullanıcıya bir adet rastgele değer gönderilmelidir.</li>
<li> Kullanıcı gönderilen sayfa üzerinden tekrar istek yapınca, bu isteğe daha önce kullanıcıya gönderilmiş rastgele değer eklenmelidir.</li>
<li>Kullanıcıdan gelen değer ile , kullanıcıya gönderilmiş olan değer karşılaştırılmalıdır. Eğer birbirini tutuyorsa, ilgili HTTP isteği web uygulaması tarafından gönderilmiş sayfa üzerinden yapılmış, herhangi bir 3. şahıs tarafından yapılmamış demektir.</li>
</ol>
<p>Bu çözüm fikrinin uygulanması noktasında önem teşkil eden unsur rastgele değerin , yeterli entropiye sahip bir havuzdan seçilmesi sonucu gerçekten rastgele olmasıdır.</p>
<h2><strong>Uygulama Fikirleri</strong></h2>
<h3><strong>1.Oturum Bilgilerine Rastgele Token Eklenmesi</strong></h3>
<p>Basitçe, Temel Çözüm&#8217;de ifade edilen modelin uygulanması şeklindedir. Eklenecek Token, gizli bir form parametresi olarak, ya da istek gerçekleştiğinde GET veya POST dizisine parametre olarak eklenecek şekilde yazılabilir.</p>
<table style="height: 201px;" border="0" cellspacing="0" cellpadding="3" width="426">
<tbody>
<tr>
<td width="50%"><span style="color: #00ccff;"><span style="color: #ffcc00;">&lt;?php</span><br />
<span style="color: #99cc00;"> //Token oluşturuluyor</span><br />
$token = GenerateToken($_COOKIE['cookie']);<br />
<span style="color: #ffcc00;">?&gt;</span><br />
&lt;<strong>form</strong> method=&#8221;POST&#8221; action=&#8221;<span style="color: #99cc00;">withdraw.php</span>&#8220;&gt;<br />
&lt;<strong>input</strong> type=&#8221;text&#8221; name=&#8221;account&#8221;&gt;<br />
&lt;<strong>input</strong> type=&#8221;text&#8221; name=&#8221;amount&#8221;&gt;<br />
&lt;<strong>input</strong> type=&#8221;hidden&#8221; name=&#8221;token&#8221; value=&#8221;<span style="color: #99cc00;">&lt;?=$token;?&gt;</span>&#8220;&gt;<br />
&lt;<strong>input</strong> type=&#8221;submit&#8221; name=&#8221;submit&#8221; value=&#8221;Submit&#8221;&gt;<br />
&lt;/<strong>form</strong>&gt;</span></td>
</tr>
</tbody>
</table>
<table style="height: 182px;" border="0" cellspacing="0" cellpadding="3" width="199">
<tbody>
<tr>
<td width="50%"><span style="color: #ffcc00;">&lt;?php</span><br />
<span style="color: #99cc00;"> </span><span style="color: #00ccff;"><span style="color: #99cc00;">//Token kontrol ediliyor</span><br />
<strong>if</strong>(<strong>isset</strong>($_POST['token']))<br />
{<br />
<strong>if</strong> (!CheckToken($_POST['token']))<br />
<strong>die</strong> (&#8221;<span style="color: #99cc00;">Tekrar giriş yapınız</span>&#8220;);<br />
ProcessWithdraw();<br />
}</span><br />
<span style="color: #ffcc00;">?&gt;</span></td>
<td width="50%"><span style="color: #ffcc00;"><br />
</span><span style="color: #ffcc00;"> </span></td>
</tr>
</tbody>
</table>
<p>Kodda görüldüğü üzere, GenerateToken ve CheckToken fonksiyonları ile basitçe token üretilip, kontrol edilmektedir. Bu fonksiyonların ne şekilde implemente edildiği de önemlidir. Fonksiyonların sahip olması gereken özellikler:</p>
<ol>
<li> Ürettiği tokenlerin kaba kuvvet saldırılarına karşı ayakta kalabilmesi için yeterli entropiye sahip olması.</li>
<li> CheckToken() fonksiyonu ile birlikte varolan tokenin geçersiz hale gelmesi ve bir kullanımlık olmasının garantisi.</li>
<li> Algoritma bilinse dahi, tokenlerin tahmin edilemeyecek yapıda olmaları.</li>
<li>Kullanıcı iki farklı tarayıcı ile uygulamayı aynı anda gezebiliyorsa, bu durumun göz önünde bulundurulup tokenlerin karıştırılmaması.</li>
</ol>
<p><strong>2.Çift Oturum ya da Çift Çerez Kullanımı</strong> Oturum ya da çerez bilgileri <em>Same-Origin Policy </em>gereğince, sadece aynı alan adı tarafından yazılır ve okunabilir. Bundan dolayı kurban.com &#8216;un yazdığı oturum ya da çerez bilgisini, saldırgan.com okuyamaz.[5]<br />
Bundan dolayı, CSRF koruması için çerez tabanlı bir koruma kullanılabilir. Rastgele değer olarak, oturum bilgisi okunur ve girilir. Sunucu tarafında ise isteğe eklenmiş oturum bilgisi ile, HTTP başlık bilgisi içerisindeki oturum bilgisi karşılaştırılır, eğer bilgiler tutarsızlık gösteriyorsa istek reddedilir.<br />
Bu örnek için tekrar implementasyon vermek istemiyorum, üstteki implementasyondaki token &#8216;lere, cookie atanıp bunun kontrolunun yapılması yeterlidir.</p>
<h3><strong>3.CAPTCHA Kullanımı</strong></h3>
<p>CAPTCHA (&#8221;Completely Automated Public Turing Test To Tell Computers and Humans Apart&#8221;)&#8217;lar, yapılan isteğin insan ya da otomatize bir kod tarafından yapıldığını anlamak için kullanılabilir. Burada da uygulama önemli işlemler öncesinde bir CAPTCHA ile işlemin saldırgan bir web sitesi tarafından değil de bir insan tarafından yapıldığını doğrulayabilir.</p>
<h3><strong>4.Kanal-Dışı Çözümler</strong></h3>
<p>Kritik işlemler öncesi, özellikle bankacılık uygulamalarında görülen telefon ya da sms ile onaylama isteği sayesinde CSRF engellenmiş olur. Lakin bu uğraştırıcı bir çözüm olduğundan, çok kritik olmayan uygulamalar dışında kullanılması tavsiye edilmeyen bir metotdur.</p>
<h1>0&#215;04 : Yaygınlık Durumu</h1>
<p>Bir çok popüler web uygulaması önlemlerini çoktan almış durumda. Bir uygulamadaki CSRF zafiyetleri genellikle uygulama geliştiricilerinin güvenlik farkındalıklarının durumları konusunda belirleyici bilgi verir.Daha çok ev yapımı ya da görevi kritik olmayan uygulamalarda görülmektedir.<br />
Geçtiğimiz yıllarda çok önemli web uygulamalarında CSRF zafiyetleri tespit edilmiştir. Bir kaç örnek üzerinden geçeceğiz.</p>
<h2>1.GMail E-mail Hijack Technique, Eylül 2007</h2>
<p>GMail e-posta servisinin filtre adında bir fonksiyonalitesi mevcut. Kısaca onceden belirlediğiniz belli filtrelere uyan e-postaları başka hesaplara yönlendirebiliyorsunuz.<br />
Filtre oluşturulması aşamasında bir CSRF zafiyeti tespit edildi ve tüm e-postaların dahil olduğu bir filtre ile kurban kullanıcıya gelen tüm e-postalarının size iletilmesini sağlayabiliyordunuz. Yani sunucuya filtre oluşturma işlemi ulaştığında yapılması gereken, öncelikli olarak bu isteğin korsan şekilde yapılmadığından emin olmak olmalıydı.</p>
<p>Kurban sitede çalışacak olan kod basitçe şu şekilde olmalıydı [6]</p>
<table style="height: 264px;" border="0" cellspacing="0" cellpadding="3" width="629">
<tbody>
<tr>
<td width="100%"><span style="color: #00ccff;"><span style="color: #ffcc00;">&lt;script&gt;</span></span></p>
<p><span style="color: #00ccff;"> </span></p>
<p><span style="color: #00ccff;"> <strong>var</strong> post_data = &#8216;v=prf&amp;cf2_emc=true&amp;cf2_email=<span style="color: #99cc00;">evilinbox@mailinator.com</span>&amp;cf1_from&amp; cf1_to<br />
&amp;cf1_subj&amp;cf1_has&amp;cf1_hasnot&amp;cf1_attach=true&amp;tfi&amp;s=z&amp;irf=on&amp;nvp_bu_cftb=Create Filter&#8217;;<br />
<strong>var</strong> xmlhttp=<strong>new</strong> XMLHttpRequest();<br />
xmlhttp.multipart = true;<br />
xmlhttp.open(&#8221;POST&#8221;, &#8216;<span style="color: #99cc00;">https://mail.google.com/mail/h/ewt1jmuj4ddv/</span>&#8216;, true);<br />
xmlhttp.onreadystatechange = <strong>function</strong> ()<br />
{<br />
<strong>if</strong> (xmlhttp.readyState == 4)<br />
{<br />
alert(&#8217;sorry&#8217;);<br />
}<br />
};<br />
xmlhttp.send(post_data);<br />
<span style="color: #ffcc00;">&lt;/script&gt;</span></span></td>
</tr>
</tbody>
</table>
<h2>2.GMail Kontakt Bilgilerinin CSRF ile Çalınması, Ocak 2007</h2>
<p>Google alan adı üzerindeki bir URL&#8217;den, tüm GMail iletişim bilgilerini almak mümkündü. İlgili URL&#8217;e korsan bir istek gönderilirse, dönen sayfadan iletişim bilgilerinin ayıklanması gayet kolaydı.[7]</p>
<table style="height: 242px;" border="0" cellspacing="0" cellpadding="0" width="771">
<tbody>
<tr>
<td width="100%"><span style="color: #ff9900;">&lt;script type=&#8221;text/javascript&#8221;&gt;</span></p>
<p><span style="color: #00ccff;"><strong>function</strong> google(data)</span></p>
<p><span style="color: #00ccff;"> {</span></p>
<p><span style="color: #00ccff;"><strong>var</strong> emails, i;</span></p>
<p><span style="color: #00ccff;"><strong>for</strong> (i = 0; i &lt;data.Body.Contacts.length; i++)</span></p>
<p><span style="color: #00ccff;"> {</span></p>
<p><span style="color: #00ccff;"> mails += &#8220;&lt;li&gt;&#8221; + data.Body.Contacts[i].Email + &#8220;&#8221;;</span></p>
<p><span style="color: #00ccff;"> }</span></p>
<p><span style="color: #00ccff;"> document.write(&#8221;&lt;ol&gt;&#8221; + emails + &#8220;&lt;/ol&gt;&#8221;);</span></p>
<p><span style="color: #00ccff;"> }</span></p>
<p><span style="color: #00ccff;"> <span style="color: #ff9900;">&lt;/script&gt;</span></span></p>
<p><span style="color: #00ccff;"> <span style="color: #ff9900;">&lt;script type=&#8221;text/javascript&#8221; src=&#8221;data/contacts?out=js&amp;show=ALL&amp;psort=Affinity&amp;callback=google&amp;max=99999&#8243;&gt;</span></span></p>
<p><span style="color: #00ccff;"> <span style="color: #ff9900;">&lt;/script&gt;</span></span></td>
</tr>
</tbody>
</table>
<p><strong>Bu örnekler dışında bir çok popüler web uygulamasında, yakın geçmişte CSRF zafiyetleri tespit edilmiştir.[8]</strong></p>
<h1>0&#215;05 : antiCSurf</h1>
<p>CSRF zafiyetinin çözümü için yapılması gereken &#8220;Oturum Bilgilerine Rastgele Token Eklenmesi&#8221; başlığında incelenmiştir. Bu noktada yapılması gereken ek işlemlerden yukarıda bahsetmiştik. PHP dilinde ilgili işlemleri garanti eden ufak bir kütüphane hazırladım. İlgili kod parçasındaki &#8220;token&#8221; değişkenine, kütüphane yardımıyla şu şekilde &#8220;unique&#8221; değer atanabilir .Kütüphanenin proje sayfasına referanslardan ulaşılabilir.[9]</p>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="50%"><span style="color: #00ccff;"> </span><span style="color: #ff9900;">&lt;?php<br />
</span><span style="color: #00ccff;"><strong>include</strong>(&#8221;<span style="color: #ff9900;">SecureToken.php</span>&#8220;);<br />
$st=<strong>new</strong> SecureToken();<br />
$sid=$_SESSION['sid'];<br />
$token = $st-&gt;GetToken($sid);<br />
<span style="color: #ff9900;">?&gt;</span></span></p>
<p><span style="color: #00ccff;"><span style="color: #00ccff;"> </span></span></td>
<td width="50%"><span style="color: #00ccff;"><span style="color: #ff9900;">&lt;?php</span><br />
<strong>include</strong>(&#8221;SecureToken.php&#8221;);<br />
$st=<strong>new</strong> SecureToken();<br />
$sid=$_SESSION['sid'];<br />
<strong>if</strong>($st-&gt;CheckToken($_POST['token'],$sid))<br />
Go();<span style="color: #99cc00;">//islemler devam eder</span><br />
<strong>else</strong><br />
<strong>die</strong> (&#8221;<span style="color: #99cc00;">Tekrar giriş yapınız</span>&#8220;);<br />
<span style="color: #ff9900;">?&gt;</span></span></td>
</tr>
</tbody>
</table>
<h1><strong>0&#215;0</strong><strong>6 : Referanslar</strong></h1>
<ol>
<li> http://en.wikipedia.org/wiki/Confused_deputy_problem</li>
<li> https://www.owasp.org/index.php/.Net_CSRF_Guard</li>
<li> http://keepitlocked.net/archive/2008/05/29/viewstateuserkey-doesn-t-prevent-cross-site-request-forgery.aspx</li>
<li> http://spreadsheets.google.com/pub?key=pWqXgSu_wNm-GkSPgOGyOWQ</li>
<li> http://en.wikipedia.org/wiki/Same_origin_policy</li>
<li> http://www.gnucitizen.org/blog/google-gmail-e-mail-hijack-technique/</li>
<li> http://ajaxian.com/archives/gmail-csrf-security-flaw</li>
<li> <a href="http://www.freedom-to-tinker.com/sites/default/files/csrf.pdf">http://www.freedom-to-tinker.com/sites/default/files/csrf.pdf</a></li>
<li> <a title="http://code.google.com/p/anticsurf/" href="http://www.webguvenligi.org/projeler/anticsurf/">http://www.webguvenligi.org/projeler/anticsurf/</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.knbykl.org/cross-site-request-forgery-atagindan-korunmanin-yolu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript ile Web Sayfa Düzenlemeleri</title>
		<link>http://www.knbykl.org/javascript-ile-web-sayfa-duzenlemeleri/</link>
		<comments>http://www.knbykl.org/javascript-ile-web-sayfa-duzenlemeleri/#comments</comments>
		<pubDate>Mon, 22 Jun 2009 11:18:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Advisories]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[java Script' te Uyarı Mesajları]]></category>
		<category><![CDATA[Java Script'te Değişkenler]]></category>
		<category><![CDATA[Java Script'te Döngüler]]></category>
		<category><![CDATA[Java Script'te Fonksiyon Kullanımı]]></category>
		<category><![CDATA[Java Script'te Form Nesneleri]]></category>
		<category><![CDATA[Java Script'te Karşılaştırma İşlemi]]></category>
		<category><![CDATA[Java Script'te Nesne Yaratmak]]></category>
		<category><![CDATA[Java Scrtipt'te Değer Girişi]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[Özel Nesneler]]></category>
		<category><![CDATA[Sayfaya Yazı Yazdırmak]]></category>
		<category><![CDATA[Window Nesnesi]]></category>

		<guid isPermaLink="false">http://www.knbykl.org/?p=183</guid>
		<description><![CDATA[Bir Web sayfasına Java Script Eklemek
Bir Web sayfasında JScript ile kod yazabilmek için ilk önce tarayıcımıza kullanacağımız script dilini tanıtmamız gereklidir.


&#60;scriptfont-family: Verdana; color: blue;&#8221;&#62;

&#8230;

JScript kodları


&#8230;


&#60;/script&#62;

Burada;
&#60;script&#62; &#60;/script&#62;
tag&#8217;leri tarayıcımıza komutların HTML değil JScript olduğunu gösterir.Bu satırları eklemememiz halinde tarayıcı komutları tanımayacağından JScript komutlarımız dökümanın bir parçası olarak algılanacak ve ekranda görünecektir.
Unutmamamız gereken noktalar tüm fonksiyonların ve blokların [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Bir Web sayfasına Java Script Eklemek<br />
</strong>Bir Web sayfasında JScript ile kod yazabilmek için ilk önce tarayıcımıza kullanacağımız script dilini tanıtmamız gereklidir.<br />
<img class="alignnone size-full wp-image-194" title="javascript-image-img" src="http://www.knbykl.org/wp-content/uploads/2009/06/javascript-image-img.jpg" alt="javascript-image-img" width="615" height="100" /></p>
<p><span id="more-183"></span></p>
<h4><span style="color: #99ccff;">&lt;scriptfont-family: Verdana; color: blue;&#8221;&gt;</span></h4>
<h4><span style="color: #99ccff;"><br />
&#8230;</span></h4>
<h4><span style="color: #99ccff;"></p>
<p><span style="color: #99cc00;">JScript kodları</span></p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>&#8230;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>&lt;/script&gt;</p>
<p></span></h4>
<p>Burada;</p>
<h4><span style="color: #99ccff;">&lt;script&gt; &lt;/script&gt;</span></h4>
<p>tag&#8217;leri tarayıcımıza komutların HTML değil JScript olduğunu gösterir.Bu satırları eklemememiz halinde tarayıcı komutları tanımayacağından JScript komutlarımız dökümanın bir parçası olarak algılanacak ve ekranda görünecektir.<br />
Unutmamamız gereken noktalar tüm fonksiyonların ve blokların { ve } işaretleri arasında yazılması gerektiği ve her komut satırından sonra ; (noktalı virgül) işaretinin koyulması gerektiğidir.<br />
Ayrıca JScript kodları her tarayıcının her sürümünde doğru olarak çalışmayacağı için özellikle eski tarayıcılarda hata verecektir. Bunu engellemek için</p>
<h4><span style="color: #99ccff;">&lt;script&gt;</span></h4>
<h4><span style="color: #99ccff;"></p>
<p>&lt;!&#8211; Hide script from older browsers</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>&#8230;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p><span style="color: #99cc00;">JScript kodları</span></p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>&#8230;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>// End hiding &#8211;&gt;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>&lt;/script&gt;</p>
<p></span></h4>
<p><strong>Sayfaya Yazı Yazdırmak </strong></p>
<hr size="2" />Java Script kullanarak ekrana yazı yazdırmak document.write komutu ile yapılır. Kullanımı ise:</p>
<h4><span style="color: #99ccff;">window.document.write(&#8221;<span style="color: #99cc00;">Merhaba Dünya !</span>&#8220;);</span></h4>
<p>şeklindedir.<br />
window.documen t kodu nesnemizin şu anda açık olan sayfamız olduğunu anlatır. Write komutu ait olduğu nesneye yazılmasını sağlar. Parametreleri ise parantezler arasına verilir. Eğer yazdırmak istediğimiz metni kodun içinde gireceksek metni &#8220;&#8230;.&#8221; tırnak işaretlerini kullanarak girmemiz gereklidir. Ayrıca + işaretini kullanarak birden fazla giriş yapmak ta mümkündür.</p>
<h4><span style="color: #99ccff;">window.document.write(&#8221;<span style="color: #99cc00;">Merhaba</span>&#8221; + &#8220;<span style="color: #99cc00;">Dünya</span>&#8220;);</span></h4>
<p>veya isim, kullanıcının ismini taşıyan bir değişken olmak üzere</p>
<h4><span style="color: #99ccff;">window.document.write(&#8221;<span style="color: #99cc00;">Merhaba</span>&#8221; + <span style="color: #99cc00;">isim</span>);</span></h4>
<p>yazmamız halinde bu ayrı metinler aralarında bir boşluk karakteri bırakılmak üzere ard arda yazılacaktır.<br />
Ayrıca JScript&#8217;le yazdıracağımız metinleri HTML kodlarıyla şekillendirmemiz mümkündür.</p>
<h4><span style="color: #99ccff;">window.document.write(&#8221;&lt;center&gt;&lt;B&gt;<span style="color: #99cc00;">Merhaba Dünya</span>&lt;/B&gt;&lt;/center&gt;&#8221;)</span></h4>
<p>Her ne kadar linkleri HTML kullanarak yaratmak mümkünse de gelişmiş uygulamalarda gidilecek sayfalara parametre aktarımı yapabilmek için linki JScript&#8217;le oluşturmak gerekebilir. Bunun için JScript&#8217;te window.location.href komutu kullanılır.</p>
<p>Örnek olarak Java.htm isimli sayfaya gitmek için bu komutun kullanımı:</p>
<h4><span style="color: #99ccff;">window.location.href=&#8221;java.htm&#8221;;</span></h4>
<h4>olacaktır. Tırnak işaretleri arasına URL girmek te mümkündür.<span style="color: #99ccff;"> </span></h4>
<h4><span style="color: #99ccff;">window.location.href=&#8221;<span style="color: #99cc00;">http://www.knbykl.org</span>&#8220;;</span></h4>
<p><strong>java Script&#8217; te Uyarı Mesajları </strong></p>
<hr size="2" />JScript&#8217;te uyarı mesajları yazmak için alert komutu kullanılır. Örneğin</p>
<h4><span style="color: #99ccff;">&lt;script&gt;</span></h4>
<h4><span style="color: #99ccff;"></p>
<p>alert(&#8221;<span style="color: #99cc00;">Uyarı Mesajı</span>&#8220;);</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>&lt;/script&gt;</p>
<p></span></h4>
<p>scripti ekrana <strong>Uyarı Mesajı </strong>yazılı ve bir OK butonu bulunan bir mesaj kutusu getirir. OK butonuna basılınca Script, bir alt satırdan çalışmaya devam edecektir</p>
<p><strong>Java Script&#8217;te Fonksiyon Kullanımı </strong></p>
<hr size="2" />JScript te C++ gibi nesneye yönelik bir dildir ve fonksiyonlar bu yapıda en önemli yeri alır. JScript fonksiyonları çağırıldıkları zaman işlemeye başlayan scriptlerdir. Aşağıdaki örnek, butona basıldığında &#8220;Merhaba Dünya&#8221; uyarı mesajı çıkartan fonksiyondur.</p>
<h4><span style="color: #99ccff;">&lt;script&gt;</span></h4>
<h4><span style="color: #99ccff;"></p>
<p>function Deneme()</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>{</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>alert(&#8221;<span style="color: #99cc00;">Merhaba Dünya</span>&#8220;);</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>}</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>&lt;/script&gt;</p>
<p></span></h4>
<p>Şimdi düğmeye basıldığında bu fonksiyonu çağıran HTML kodunu yazalım</p>
<h4><span style="color: #99ccff;">&lt;form&gt;</span></h4>
<h4><span style="color: #99ccff;"></p>
<p>&lt;input value=&#8221;<span style="color: #99cc00;">Buraya Bas</span>&#8220;&gt;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>&lt;/form&gt;</p>
<p></span></h4>
<p>JScript fonksiyonunda sadece alert(&#8221;Merhaba Dünya&#8221;) komutu var. HTML&#8217;de de üzerinde &#8220;Buraya Bas&#8221; yazılı bir buton var ve onclick olayı Deneme isimli fonksiyona yönlendirilmiş. Bu fonksiyona hiç bir parametre gelmiyor ve bir dönüş parametresi de yok. Aynı fonksiyon şu şekilde yazılısaydı:</p>
<h4><span style="color: #99ccff;">&lt;script&gt;</span></h4>
<h4><span style="color: #99ccff;"></p>
<p>function Deneme(param)</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>{</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>alert(param);</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>}</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>&lt;/script&gt;</p>
<p></span></h4>
<p>ve onu çağıran HTML satırında da fonksiyona &#8220;Merhaba Dünya&#8221; parametresini gönderseydik alınan sonuçta hiç bir değişiklik olmayacaktır.</p>
<h4><span style="color: #99ccff;">&lt;form&gt;</span></h4>
<h4><span style="color: #99ccff;"></p>
<p>&lt;input value=&#8221;<span style="color: #99cc00;">Buraya Bas</span>&#8220;&gt;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>&lt;/form&gt;</p>
<p></span></h4>
<p>Burada dikkat edilmesi gereken nokta HTML&#8217;den parametreyi gönderirken fonksiyon adından sonra açılan parantezlere &#8216; ve &#8216; işaretleri arasına yazılması ve fonksiyon için param artık bir parametre olduğu için alert fonksiyonunda parantezlerin içinde tırnak içine alınmaması gereğidir.</p>
<p>JScript fonksiyonları hakkında bilinmesi gereken bir diğer nokta da fonksiyonlar tarayıcı tarafından işlendikten sonra HTML koduna dönüştürüleceğinden (C&#8217;deki precompiler mantığıyla) HTML&#8217;de yerine koyulacak bir değer de fonksiyonla verilebilir. Yani linker fonksiyonu yapılan bir seçime göre bir URL döndürüyorsa HTML&#8217;de &lt;a href=linker(seçim)&gt; yazımında hiç bir sakınca yoktur.</p>
<p>Fonksiyonların gerçekleşmesi için fonksiyonun çağırıldığı <strong>olay </strong>&#8216;ın alması gerekmektedir. Bu olaylardan bazıları:</p>
<p>Olay İsmi Ne Zaman Olur</p>
<p><strong>onClick : </strong>Butona basıldığında</p>
<p><strong>onAbort : </strong>Stop düğmesine veya bir linke basılarak yüklenme durdurulduğunda</p>
<p><strong>onChange : </strong>Seçim yapıldığında veya metin değiştirildiğinde</p>
<p><strong>onError : </strong>Resmin veya ekranın yüklenmesinde hata oluştuğu zamanlar</p>
<p><strong>onLoad : </strong>Sayfa yüklenmesi tamamlandığında</p>
<p><strong>onMouseOut : </strong>Mouse pointer bir alan veya linkten uzaklaştırıldığında</p>
<p><strong>onMouseOver : </strong>Mouse pointer bir alan veya linkin üzerine geldiğinde</p>
<p><strong>onSelect : </strong>Seçim için ayrılmış bir nesne seçildiğinde</p>
<p><strong>onSubmit : </strong>Submit(gönder) butonu basıldığında</p>
<p><strong>onUnload : </strong>Sayfa yüklenmesi bittiğinde(kullanıcı sayfadan çıktığında)</p>
<p><strong>Java Scrtipt&#8217;te Değer Girişi </strong></p>
<hr size="2" />JScript&#8217;te alert komutunu bir çıkış komutu olarak düşünürsek bunun karşılığı olan giriş komutu prompt komutudur. Bu komut</p>
<h4><span style="color: #99ccff;">adsoyad=prompt(&#8221;<span style="color: #99cc00;">Adınızı ve soyadınızı giriniz</span>&#8220;,&#8221;");</span></h4>
<p>şeklinde kullanılır ve kullanıcı tarafından girilen değer adsoyad isinmli değişkene atanır.</p>
<p><strong>Java Script&#8217;te Karşılaştırma İşlemi </strong></p>
<hr size="2" />Conditional statement veya If statement olarak bilinen komut grubu yani IF-THEN-ELSE JScript&#8217;te de mevcuttur. Bu komut grubu bir değerle bir diğerini karşılaştırıp sonuca göre farklı işlemler yapmamızı sağlar. Şimdi az önceki örnekte olduğu gibi kullanıcıdan ismini girmesini isteyelim ve bir karşılaştırma yapalım. Dikkat etmemiz gereken nokta aynı C dilinde olduğu gibi then komutunu kullanmamamızdır.</p>
<h4><span style="color: #99ccff;">adsoyad=prompt(&#8221;<span style="color: #99cc00;">Adınızı ve soyadınızı giriniz</span>&#8220;,&#8221;");</span></h4>
<h4><span style="color: #99ccff;"></p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>if(adsoyad==&#8221;<span style="color: #99cc00;">Emre ER</span>&#8220;) alert(&#8221;<span style="color: #99cc00;">Hosgeldin Emre</span>&#8220;);</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>else alert(&#8221;<span style="color: #99cc00;">Seni Tanımıyorum</span>&#8220;);</p>
<p></span></h4>
<p>Burada bahsedilmesi gereken bir diğer konu da karşılaştırma operatörleri ve mantıksal operatörler. Karşılaştırma operatörleri:</p>
<p>Denk ==</p>
<p>Eşit değil !=</p>
<p>Küçük</p>
<p>&lt; Büyük &gt;</p>
<p>Küçük veya Eşit</p>
<p>&lt;= Büyük veya Eşit &gt;=</p>
<p>Mantıksal operatörler:</p>
<p>Ve &amp;</p>
<p>Veya |</p>
<p>Değil !</p>
<p>XOR ^</p>
<p>Bir de birden fazla karşılaştırmayı birleştirmek için</p>
<p>Ve &amp;&amp;</p>
<p>Veya ||</p>
<p>Ayrıca ++ operatörü birer birer artırmak için ve – operatörü de birer birer azaltmak için kullanılır.</p>
<p>operatörlerini kullanabiliriz. Dikkat edilmesi gereken nokta bir adet = operatörünün eşitleme iki adet ==operatörünün karşılaştırma işleminde kullanılması gerektiği ve ! operatörünün her yerde değil anlamı taşıdığıdır. Yani ! operatörü diğer operatörlerle birlikte değil anlamı vermek üzere kullanılabilir</p>
<p><strong>Java Script&#8217;te Değişkenler </strong></p>
<hr size="2" />JScript&#8217;te değişkenlere diğer diller gibi bir değişken tipi atamak zorunda değiliz. Daha sonra bu değişkeni eşitlediğiniz değere göre bir tip alacaktır.</p>
<p>JScript&#8217;te değişken tipleri olmadığı gibi bir dizi tanımı da yoktur. Bir dizi oluşturmak için basit bir foksksiyon yazmamız ve daha sonra kaç elemanlı dizi açmak istiyorsak bu fonksiyona onu parametre olarak göndermemiz gerekecektir. Bu fonksiyon şu şekilde olabilir:</p>
<h4><span style="color: #99ccff;">function makearray(n) </span></h4>
<h4><span style="color: #99ccff;"></p>
<p>{</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>this.lenght=n;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>for( var i=1;i&lt;=n;i++)</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>{</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>this[i]=0;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>return this;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>}</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>}</p>
<p></span></h4>
<p>Daha sonra da dizimize vermek istediğimiz ismi ve uzunluğunu bu fonksiyona göndermemiz gerekecek. Yani</p>
<h4><span style="color: #99ccff;">dizi= new makearray(20); </span></h4>
<p>dediğimizde 20 elemanlı ve her elemanı 0 olan bir dizi oluşturalacaktır.</p>
<p>Tabi ki bu ilk değeri olmayan veya çok uzun bir dizi yaratmak için aksi halde Array komutuyla da bir dizi yaratılabilir. Şöyle ki:</p>
<h4><span style="color: #99ccff;">dizi = Array(&#8221;<span style="color: #99cc00;">Ali</span>&#8220;,&#8221;<span style="color: #99cc00;">Ayse</span>&#8220;,&#8221;<span style="color: #99cc00;">Selim</span>&#8220;,&#8221;<span style="color: #99cc00;">Yahya</span>&#8220;,&#8221;<span style="color: #99cc00;">Kemal</span>&#8220;); </span></h4>
<p>Burada dikkat edilmesi gereken nokta dizi elemanlarına ulaşırken diziadı[indexno] syntax&#8217;ı ve dizi index numaralarının( biz aksini belirtmedikçe) 0&#8242;dan başladığıdır. Bu arada bir değişkene string değer atandığı zaman o değişkenin otomatik olarak bir karakterler dizisi olarak algılanmayacağı da önemli bir özelliktir. Yani;</p>
<h4><span style="color: #99ccff;">ad=&#8221;<span style="color: #99cc00;">Emre</span>&#8220;; </span></h4>
<p>şeklinde bir tanımlamada ad[1]=S , ad[2]=e &#8230; olmayacaktır.</p>
<p>Bir stringin içinden bir harfi ya da harf grubunu almak istediğimizde kullanmamız gereken komut substring komutudur.</p>
<h4><span style="color: #99ccff;">harf=ad.substring(0,1); </span></h4>
<p>yazdığımızda harf değişkeni S harfini içerecektir. Buradaki parametrelerden 0, kaçıncı karakterden başlanacağını 1 ise kaçıncı karaktere kadar alınacağını gösterir.(1 hariç)</p>
<p>Yani harf=ad.substring(0,2) deseydik harf değişkeni &#8220;Se&#8221; değerini içerecekti.</p>
<p>Bu işlemin tam tersi de mümkündür. Yani girilen bir karakterin kaçıncı karakter olduğunu bulmak. Bunun için de indexOf komutunu kullanıyoruz.</p>
<h4><span style="color: #99ccff;">sayi=ad.indexOf(&#8221;e&#8221;); </span></h4>
<p>yazdığımızda sayi değişkenine 2 değeri atanır.</p>
<p>Ayrıca bu değişkenin uzunluğunu bulmak için lenght komutu kullanılır.</p>
<h4><span style="color: #99ccff;">sayi=ad.lenght; </span></h4>
<p>dediğimizde sayi değişkeninde 6 değeri bulunacaktır.</p>
<p><strong>Java Script&#8217;te Döngüler </strong></p>
<hr size="2" /><strong>For Döngüsü </strong></p>
<h4><span style="color: #99ccff;">for (var i=0;i&lt;10;i++)</span></h4>
<h4><span style="color: #99ccff;"></p>
<p>{</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>window.write(&#8221;<span style="color: #99cc00;">Şu anda</span>&#8221; + i + &#8220;. <span style="color: #99cc00;">numaradasını</span>z&#8221;);</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>if (i==5) window.write(&#8221;<span style="color: #99cc00;">Yarısına geldiniz bile</span>&#8220;);</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>}</p>
<p></span></h4>
<p>döngüsünde önce i değişkenine 0&#8242;dan başlaması gerektiğini, i 10&#8242;dan küçük olduğu sürece devam edeceğini ve i&#8217;nin birer birer artacağını söylüyoruz. Bu şartlarda ekrana &#8220;Şu anda 1. numaradasınız&#8221; , &#8220;Şu anda 2. numaradasınız&#8221; gibi mesajlar gelecek i, 5 olduğunda ise ayrıca &#8220;Yarısına geldiniz bile&#8221; mesajı gelecektir.</p>
<p><strong>While Döngüsü </strong></p>
<p>Bir döngüye ihtiyaç duyduğunuzda döngü içindeki işlemlerin kaç kere yapılması değil de bir durum gerçekleştiği sürece yapılması önemliyse while döngüsü kullanılır.</p>
<h4><span style="color: #99ccff;">isim=array(&#8221;"<span style="color: #99cc00;">Ali</span>&#8220;,&#8221;<span style="color: #99cc00;">Ayse</span>&#8220;,&#8221;<span style="color: #99cc00;">Selim</span>&#8220;,&#8221;<span style="color: #99cc00;">Yahya</span>&#8220;,&#8221;<span style="color: #99cc00;">Kemal</span>&#8220;);</span></h4>
<h4><span style="color: #99ccff;"></p>
<p>i=0;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>j=0;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>while(i != 1)</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>{</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>if isim[j]==&#8221;<span style="color: #99cc00;">Yahya</span>&#8221; i=1;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>j++;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>}</p>
<p></span></h4>
<p>kodunda dizide &#8220;Yahya&#8221; ismini bulmak için bir döngü yarattık. Yahya ismini bulduktan sonra döngüde kalması programın yavaş çalışmasını sağlayacağından döngüyü 0&#8242;dan 4&#8242;e kadar for döngüsü yerine bir kontrol elemanının değerine bağladık. Yahya ismi bulununca kontrol değeri 1 yapıldı ve döngüden çıkıldı. J değeri ise Yahya isminin kaçıncı eleman olduğunu gösteren rakamın bir fazlasında kaldı.</p>
<p><strong>Break Komutu </strong></p>
<p>Herhangi bir şart gerçekleştiğine döngüden anında çıkmamız gerekiyorsa break komutunu kullanırız. Deminki örnekte Yahya ismini bulduğumuz halde kontrol döngünün başında olduğu için j bir kez daha artırıldı ve olmasını istediğimiz değerden bir fazla oldu. Oysa ki scripti şöyle yazsaydık:</p>
<h4><span style="color: #99ccff;">isim=array(&#8221;"<span style="color: #99cc00;">Ali</span>&#8220;,&#8221;<span style="color: #99cc00;">Ayse</span>&#8220;,&#8221;<span style="color: #99cc00;">Selim</span>&#8220;,&#8221;<span style="color: #99cc00;">Yahya</span>&#8220;,&#8221;<span style="color: #99cc00;">Kema</span>l&#8221;);</span></h4>
<h4><span style="color: #99ccff;"></p>
<p>i=0;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>j=0;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>while(i != 1)</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>{</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>if isim[j]==&#8221;<span style="color: #99cc00;">Yahya</span>&#8221;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>{</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>i=1;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>break;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>}</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>j++;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>}</p>
<p></span></h4>
<p>Yahya ismi bulununca break komutuyla döngüden çıkacak ve j bir kez daha boşu boşuna artırılmamış olacaktı.</p>
<p><strong>Java Script&#8217;te Nesne Yaratmak </strong></p>
<hr size="2" />Burada bahsedeceğimiz nesne birden fazla özelliği olan bir değişkendir. Bir insanın adı, soyadı, yaşı, kredi kart numarası gibi bilgileri tek bir değişken altında tutmak mümkündür. Bunun için de önce bunu yaratan bir fonksiyon yazıp sonra istediğimiz değişkeni gerekli parametrelerle bu fonksiyon cinsinden tanımlamalıyız.</p>
<h4><span style="color: #99ccff;">function insan(<span style="color: #99cc00;">ad</span>,<span style="color: #99cc00;">soyad</span>,<span style="color: #99cc00;">yas</span>,<span style="color: #99cc00;">kartno</span>)</span></h4>
<h4><span style="color: #99ccff;"></p>
<p>{</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>this.ad=<span style="color: #99cc00;">ad</span>;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>this.soyad=<span style="color: #99cc00;">soyad</span>;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>this.yas=<span style="color: #99cc00;">yas</span>;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>this.kartno=<span style="color: #99cc00;">kartno</span>;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>}</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>kisi[1]= new insan(<span style="color: #99cc00;">Emre</span>,<span style="color: #99cc00;">Er</span>,<span style="color: #99cc00;">22</span>,<span style="color: #99cc00;">1234567890123456</span>)</p>
<p></span></h4>
<p>Bu scriptte önce insan nesnesini yaratan fonksiyonu görüyoruz. Buradaki this keyword&#8217;ü bu nesneye ait olan özellikler için(sadece fonksiyonun içinde) kullanılır. Daha sonra kisi isimli dizinin birinci elemanını insan cinsinden yeni bir nesne olduğunu belirtmek için new keyword&#8217;ünü kullanarak ve gerekli parametreleri vererek fonksiyonu çağırıyoruz. Daha sonra gerekli özelliklere erişmek için kisi[1].ad , kisi[1].soyad &#8230; yazılır.</p>
<p><strong>Özel Nesneler </strong></p>
<hr size="2" />JScript&#8217;te bir önceki konuda anlattığımız gibi kendi tanımladığımız nesnelerin yanı sıra halihazırda var olan nesneler de vardır. Bizim için önemli olan document nesnesinin özelliklerini şöyle sıralayabiliriz.</p>
<p>window<br />
parent,frame,self,_top&#8230;<br />
location<br />
history<br />
document<br />
form<br />
text field<br />
text area<br />
checkbox<br />
radio<br />
password<br />
select<br />
button<br />
submit<br />
reset<br />
link<br />
anchor</p>
<p><strong>Window Nesnesi </strong></p>
<hr size="2" />Window nesnesi en üst düzeyli nesne olduğu için özellikleri ve metodların başlarına window. yazmaya gerek yoktur. Frame ve Status Bar window nesnesinin özellikleridir. Status Bar kontrolü</p>
<h4><span style="color: #99ccff;">window.status=&#8221;<span style="color: #99cc00;">Merhaba Dünya</span>&#8220;; </span></h4>
<p>gibi bir kodla kontrol edilebilir. Ayrıca window nesnesinin alert, prompt,confirm ve open gibi metodları vardır. Bunlardan alert ve prompt metodlarını daha önce gördük.</p>
<p><strong>Confirm Metodu: </strong></p>
<p>Confirm metodu kullanıcıdan onay almak için kullanılır. Kullanıcıya sorulan bir soruyu ve birer OK ve CANCEL butonu içerir.</p>
<p><strong>Java Script&#8217;te Form Nesneleri </strong></p>
<hr size="2" />Nesneler JScript&#8217;te özel fonksiyonları bulunabilen birbirinden bağımsız elemanlardır. Text alanları, radio butonlar,check boxlar, butonlar ve drop-down menüler JScript nesneleridir.</p>
<p>Burada unutulmaması gereken durum nesnelerin bir form içinde olmaları yani &lt;FORM&gt; ve &lt;/FORM&gt; HTML kodları arasında tanımlanmaları gerektiğidir. Tanımladığınız nesne içinde bulunduğu formun bir elemanıdır ve daha sonraulaşılması gerektiğinde form adıyla birlikte anılır.</p>
<h4><span style="color: #99ccff;">&lt;form&gt;</span></h4>
<h4><span style="color: #99ccff;"></p>
<p>&lt;input value=&#8221;<span style="color: #99cc00;">Buraya Basınız</span>&#8220;&gt;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>&lt;/form&gt;</p>
<p></span></h4>
<p>şeklinde tanıtılmış bir butona daha sonra erişmek istediğimizde form1.but1 yazmamız gerekecektir. Forma isim verilmediği durumlarda aynı butona form.but1 diye erişecektik ki aynı sayfada birden fazla form bulunması durumunda karışıklık çıkacaktı.</p>
<p><strong>Butonlar </strong></p>
<hr size="2" />
<h4><span style="color: #99ccff;">&lt;form&gt; </span></h4>
<h4><span style="color: #99ccff;"> &lt;input value=&#8221;<span style="color: #99cc00;">Buraya Basınız</span>&#8220;&gt; </span></h4>
<h4><span style="color: #99ccff;"> &lt;/form&gt; </span></h4>
<p>Bu örnekte input giriş elemanının bir buton olduğunu, name=&#8221;but1&#8243; programda bu butonu but1 olarak isimlendirdiğinizi value=&#8221;Buraya Basınız&#8221; de butonun üzerinde Buraya Basınız metninin yazılacağını gösterir.</p>
<p><strong>Text Alanları </strong></p>
<hr size="2" />
<h4><span style="color: #99ccff;">&lt;script&gt; </span></h4>
<h4><span style="color: #99ccff;"> function Goster (metin) { </span></h4>
<h4><span style="color: #99ccff;"> alert(metin); </span></h4>
<h4><span style="color: #99ccff;"> } </span></h4>
<h4><span style="color: #99ccff;"><br />
&lt;/script&gt; </span></h4>
<h4><span style="color: #99ccff;"> &lt;form&gt; </span></h4>
<h4><span style="color: #99ccff;"> &lt;input value=&#8221;<span style="color: #99cc00;">Buraya gireceğiniz yazı butona basınca alert olarak gelecektir.</span>&#8220;&gt; </span></h4>
<h4><span style="color: #99ccff;"> &lt;input value=&#8221;<span style="color: #99cc00;">Buraya Basın</span>&#8220;&gt; </span></h4>
<h4><span style="color: #99ccff;"> &lt;/form&gt; </span></h4>
<p>Bu kodda Goster isimli bir fonksiyonumuz var ve metin ismiyle bir parametre alıyor.Daha sonra da bu parametreyi alert fonksiyonuyla gösteriyor. Bu parametreyi gönderen de butonun onclick olayı. Ve butonun gönderdiği parametre form1 formunun text1 nesnesinin değeri. Programda ilk olarak bu değeri Buraya gireceğiniz yazı butona basınca alert olarak gelecektir. vermiştik. Buradan da anlaşılacağı gibi bu değer text alanının içindeki metin. Yani text box&#8217;a birşey yazılmadığı durumda bu alanda Buraya gireceğiniz yazı butona basınca alert olarak gelecektir. yazacak ve butona basıldığında da uyarı kutusunda bu mesaj gelecektir.</p>
<p>Eğer çok satırlı bir text alanı yaratmak istiyorsak</p>
<h4><span style="color: #99ccff;">&lt;input value=&#8221;<span style="color: #99cc00;">Alanın içindeki yazı</span>&#8220;&gt;</span> komutu yerine</h4>
<h4><span style="color: #99ccff;">&lt;textarea rows=&#8221;10&#8243; cols=&#8221;80&#8243;&gt;<span style="color: #99cc00;">Alanın içindeki yazı</span>&lt;/textarea&gt; </span></h4>
<p>Textarea tanımında rows alandaki satır sayısı, cols her bir satırın kaç karakter uzunluğunda olacağını belirten sayıdır.</p>
<p><strong>Radio Butonlar </strong></p>
<hr size="2" />Radio Butonlar genellikle bir çok seçenekten sadece bir tanesinin seçilmesini istediğimiz durumlarda kullanılır. Radio butonların sadece bir tanesinin seçilmesini sağlamak için name özelliklerinin aynı olması gerekmektedir. Aşağıdaki örnekte bilgisayarınızın işlemcisinin markası sorulmaktadır:</p>
<h4><span style="color: #99ccff;">&lt;form&gt; </span></h4>
<h4><span style="color: #99ccff;"> &lt;input value=&#8221;Intel&#8221; checked&gt; </span></h4>
<h4><span style="color: #99ccff;"> &lt;input value=&#8221;Cyrix&#8221; name=&#8221;cpu&#8221;&gt; </span></h4>
<h4><span style="color: #99ccff;"> &lt;input value=&#8221;AMD&#8221;&gt; </span></h4>
<h4><span style="color: #99ccff;"> &lt;/form&gt; </span></h4>
<p>Değeri Intel olan radio butonda bulunan checked kodu sayfa açıldığına bu butonun işaretli olarak geleceğini belirtir. Radio butonların değerlerini alırken (örnekte üç tane olmasına rağmen) cpu adında tek bir nesnemiz varmış gibi form1.cpu.value dememiz gerekecektir. Seçili olan radio butonun değeri Intel, Cyrix veya AMD olarak gelecektir.</p>
<p><strong>Check Boxlar </strong></p>
<hr size="2" />Check Boxlar da radio butonlar gibi iki durumlu giriş elemanlardır. Yalnız burada fark check boxların birden fazlasının da seçili olabilmesi durumudur. Her biri ayrı nesnedir ve her birinin seçili olma veay olmama durumu vardır. Durumunun anlaşılması ise checked komutu ile yapılmaktadır. Örneğin;</p>
<h4><span style="color: #99ccff;">&lt;input name=&#8221;chck1&#8243; value=&#8221;1&#8243;&gt; </span></h4>
<p>şeklinde tanımlanmış bir check box, daha sonra form.chck1.checked komutuyla kontrol edildiğinde seçili ise True seçili değilse False değeri getirecektir.</p>
<p><strong>Drop-Down Menüler </strong></p>
<hr size="2" />Bu eleman birçok seçeneği açılan bir menü şeklinde sunar.</p>
<h4><span style="color: #99ccff;">&lt;script&gt;</span></h4>
<h4><span style="color: #99ccff;"></p>
<p>function goster(metin) {</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>alert(metin);</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>}</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>&lt;/script&gt;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>&lt;select size=&#8221;1&#8243;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>onchange=&#8221;goster (form.drp1.options[drp1.selectedIndex]value)&#8221;&gt;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>&lt;option value=&#8221;Intel&#8221;&lt;Intel&lt;/option&gt;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>&lt;option value=&#8221;Cyrix&#8221;&lt;Cyrix&lt;/option&gt;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>&lt;option value=&#8221;AMD&#8221;&lt;AMD&lt;/option&gt;</p>
<p></span></h4>
<h4><span style="color: #99ccff;"></p>
<p>&lt;/select&gt;</p>
<p></span></h4>
<p>Burada önemli olan bir özellik size özelliğidir. Kaç seçeneğin gösterilmesini istiyorsak size değerini o kadar artırmalıyız. Ayrıca bir çok eleman gibi onClick olayını değil onChange olayını kullanıyoruz. option value=&#8221;Intel&#8221; seçildiğinde gönderilecek değeri, daha sonra yazdığımız isim de menüde gösterilecek yazıyı ifade eder.</p>
<p>&lt;%@%&gt;<br />
&lt;HTML&gt;<br />
&lt;HEAD&gt;<br />
&lt;SCRIPT&gt;<br />
&lt;/SCRIPT&gt;<br />
&lt;TITLE&gt;JavaScript Mesaj Denemeleri&lt;/TITLE&gt;<br />
&lt;/HEAD&gt;<br />
&lt;BODY BGCOLOR=FFFFFF TEXT=000000&gt;<br />
&lt;CENTER&gt;<br />
&lt;FONT SIZE=+2&gt;JavaScript Mesaj Denemeleri&lt;/FONT&gt;&lt;BR&gt;<br />
&lt;/CENTER&gt;<br />
&lt;HR&gt;<br />
&lt;HR&gt;<br />
&lt;FONT SIZE=+2&gt;<br />
&lt;UL&gt;<br />
&lt;LI&gt;&lt;A HREF=&#8221;INDEX1.HTML&#8221;&gt;Sana bir soru.&lt;/A&gt;P&gt;<br />
&lt;UL&gt;<br />
&lt;LI&gt;Status bar&#8217;a bak:<br />
&lt;A HREF=&#8221;index.php3&#8243;&gt;A&lt;/A&gt;<br />
&lt;A HREF=&#8221;index.php3&#8243;&gt;B&lt;/A&gt;<br />
&lt;A HREF=&#8221;index.php3&#8243;&gt;C&lt;/A&gt;<br />
&lt;A HREF=&#8221;index.php3&#8243;&gt;D&lt;/A&gt;<br />
&lt;A HREF=&#8221;index.php3&#8243;&gt;E&lt;/A&gt;&lt;P&gt;<br />
&lt;UL&gt;<br />
&lt;LI&gt;&lt;A HREF=index.php3&#8243;&gt;Bana yaklaşma!&lt;/A&gt;&lt;P&gt;<br />
&lt;/UL&gt;&lt;/UL&gt;&lt;/UL&gt;&lt;/UL&gt;<br />
&lt;/FONT&gt;&lt;P&gt;&lt;HR&gt;<br />
&lt;/BODY&gt;<br />
&lt;/HTML&gt;</p>
<p>Bu örnekte kullanıcıya mesaj göndermenin değişik yolları gösterilmiştir. Confirm ve Alert komutlarının nasıl kullanıldığını görmüştük. İkinci satırda ise Status Bar&#8217;a mesaj yazdırmanın yolu görülüyor. Burada self.status denmesinin sebebi ise şu anda aktif olan nesnenin window nesnesi olasıdır. Bunun gibi herhangi bir nesne ile ilgili olarak yapacağımız işlemlerde <strong>self </strong>kullanacağız.</p>
<p>&lt;HTML&gt;<br />
&lt;HEAD&gt;<br />
&lt;SCRIPT&gt;<br />
&lt;!&#8211;<br />
function person(name,pass) {<br />
this.name=name;<br />
this.pass=pass;<br />
}<br />
function makearray(n) {<br />
this.lenght=n;<br />
for (var i=0;i&lt;=n;i++) {<br />
this[i]=&#8221;";<br />
return this;<br />
}<br />
}<br />
function submit1_onclick(form) {<br />
var x=0;<br />
pers= new makearray(3);<br />
var isim;<br />
var pas;<br />
isim=text1.value;<br />
pas=password1.value;<br />
if(!isFieldBlank(isim)) alert(&#8217;ID field cannot be blank&#8217;);<br />
else {<br />
pers[1] =new person(&#8221;serdar&#8221;,&#8221;");<br />
pers[2] =new person(&#8221;yucel&#8221;,&#8221;yucel&#8221;);<br />
pers[3] =new person(&#8221;ali&#8221;,&#8221;veli&#8221;);<br />
for(i=1;i&lt;4;i++) {<br />
if(isim==pers[i].name) {<br />
if(pas==pers[i].pass) x=1; }<br />
}<br />
if(x==1) document.write(&#8217;You made a good job&#8217;);<br />
else alert(&#8217;Password is invalid&#8217;);<br />
}<br />
}<br />
function isFieldBlank(ad) {<br />
if(ad)<br />
return true;<br />
else<br />
return false;<br />
}<br />
//&#8211;&gt;<br />
&lt;/SCRIPT&gt;<br />
&lt;/HEAD&gt;<br />
&lt;BODY&gt;<br />
&lt;P&gt;<br />
İsim:&lt;BR&gt;<br />
&lt;P&gt;&lt;INPUT&gt;&lt;/P&gt;<br />
&lt;P&gt; &lt;/P&gt;<br />
Şifre:&lt;BR&gt;<br />
&lt;INPUT&gt;&lt;/P&gt;<br />
&lt;P&gt; &lt;/P&gt;<br />
&lt;P&gt;&lt;INPUT value=Gir onclick=&#8221;submit1_onclick()&#8221;&gt;&lt;/P&gt; &lt;P&gt; &lt;/P&gt;<br />
&lt;/BODY&gt;<br />
&lt;/HTML&gt;</p>
<p>Bu örneğimiz biraz karışık. Öncelikle iki tane form nesnemiz var. Biri text alanı diğeri ise password. Scriptimizde ise <strong>person </strong>isimli bir fonksiyonumuz var. Bu fonksiyondaki <strong>this.name=name </strong>komutu bu fonksiyonu çağıran değişkenin name özelliğinin name ismiyle aktarılan değişken olacağını gösterir. <strong>pers[3] =new person(&#8221;ali&#8221;,&#8221;veli&#8221;); </strong>satırında olduğu gibi pers dizisinin 3. elemanı name özelliği ali, pass özelliği veli olan bir yapı olacak.</p>
<p><strong>isfieldblank </strong>fonksiyonu parametre olarak aktarılan alanın boş olup olmadığını kontrol eden fonksiyonumuz. İsim alanı boş olamayacağından önce bunu kontrol edip eğer boşsa bir uyarı mesajı gönderiyoruz.</p>
<p><strong>makearray </strong>fonksiyonu daha önce de bahsettiğim gibi dizi yaratmak için yazılmış bir fonksiyon. Aynı şekilde bu fonksiyonu çağıran değişkeni aktarılan parametre uzunluğunda bir dizi yapıyor. <strong>pers </strong>dizisi bu fonksiyonla yaratıldıktan sonra her bir elemanına <strong>person </strong>fonksiyonu tarafından name ve pass özellikleri atanıyor. Gerisi ise oldukça basit. Alanlara girilen değerler bir döngü içerisinde pers dizisinin elemanlarıyla karşılaştırılıyor.</p>
<p><strong>Java Script Kullanarak Yeni Bir Pencere Açmak </strong></p>
<hr size="2" />Aşağıdaki scriptte butona tıklayarak yeni bir ekran açılması için bir örnek vardır.Burada kullanılan birtakım özellikler olacaktır.</p>
<p>window.close() komutunun özellikleri yoktur. Sadece o anda aktif olan pencereyi kapatır. window.open(özellikler) komutundaki özellikler ise:<br />
&#8220;HTML&#8221; ; gösterilmesini istediğimiz sayfa<br />
&#8220;window.name&#8221; ; istediğimiz bir başlık<br />
&#8220;toolbar&#8221; ; toolbar&#8217;ın gösterilme özelliği (yes/no ya da 0/1 olarak belirtilir).<br />
&#8220;status&#8221; ; statusbar&#8217;ın gösterilme özelliği (yes/no ya da 0/1 olarak belirtilir).<br />
&#8220;menubar&#8221; ; menubar&#8217;ın gösterilme özelliği (yes/no ya da 0/1 olarak belirtilir).<br />
&#8220;scrollbars&#8221; ; scrollbar denilen sayfayı aşağı-yukarı ve sağa-sola oynatmamızı sağlayan barların gösterilme özelliği (yes/no ya da 0/1 olarak belirtilir).<br />
&#8220;resizable&#8221; ; açılacak olan ekranın boyutunun değiştirilebilir olup olmama özelliği (yes/no ya da 0/1 olarak belirtilir).<br />
&#8220;width&#8221; ; genişlik (pixel olarak belilenir).<br />
&#8220;height&#8221; ; yükseklik (pixel olarak belirlenir).</p>
<p>Gelelim scriptimize ve nasıl kullandığımıza:</p>
<p>&lt;script&gt;<br />
function ekranac()<br />
options=&#8217;toolbar=0,status=0,menubar=0,scrollbars=0,resizable=0,width=300,height=200&#8242;;<br />
content=<br />
&#8216;&lt;body bgcolor=&#8221;beige&#8221;&gt;&#8217;+<br />
&#8216;&lt;p align=&#8221;left&#8221;&gt;&lt;big&gt;&lt;strong&gt;Selam !&lt;/strong&gt;&lt;/big&gt;&lt;br&gt;&lt;/p&gt;&#8217;+<br />
&#8216;&lt;p align=&#8221;left&#8221;&gt;&lt;small&gt;Buraya basarak ekranı kapatabilirsiniz&lt;/small&gt;&lt;/p&gt;&#8217;+<br />
&#8216;&lt;form&gt;&lt;input value=&#8221;Ekranı Kapat !&#8221;&gt;&#8217;+<br />
&#8216;&lt;/form&gt;&#8217;;<br />
acilan = window.open(&#8221;",&#8221;mywindow&#8221;,options);<br />
acilan.document.write(content)<br />
&lt;/script&gt;<br />
&lt;form&gt;<br />
&lt;input value=&#8221;Ekran Aç !&#8221; onclick=&#8221;ekranac()&#8221;&gt;<br />
&lt;/form&gt;</p>
<p>Script çok basit ve öğrenmesi kolay. Özellikleri biliyosanız window.open komutunu kullanmak zor olmayacaktır. Fakat Netscape Navigator&#8217;ın bazı bozuklukları sebebiyle bizim scriptimizde yaptığımız gibi bu özellikleri bir değişkene atayarak kullanmak yararlı olacaktır.</p>
<p>ekran = window.open(&#8221;http://www.programlama.com&#8221;,&#8221;programlama&#8221;,options)</p>
<p>gibi&#8230; Böylece ekrana da Javascript&#8217;in anlayabileceği bir isim vermiş oldunuz; &#8220;ekran&#8221;. Bu ismi kullanarak açılan yeni ekrana istediğinizi yaptırabilirsiniz. Bu özelliği aklınızda tutun. Çünkü frame kontrolünde de bu özellik kullanılmaktadır.</p>
<p>ekran.document.write(&#8217;Selam&#8217;)</p>
<p>gibi pek çok komutu &#8220;ekran&#8221; isimli yeni açılan ekrana aktarabiliriz.<br />
Aşağıdaki scripti kullanarak komutları ve özellikleri biraz daha rahat öğrenebilirsiniz. Her boşluğu doldurmak zorunda değilsiniz. Tek tek de denemeniz mümkün.</p>
<p>Bu komut Internet Explorer&#8217;ın bazı sürümlerinde çalışmamaktadır.</p>
<p><strong>Kullanıcının Tarayıcısını Kontrol Etmek </strong></p>
<hr size="2" />Daha önce de gördüğümüz gibi Javascript komutları tarayıcılara göre değişiklik gösterebiliyor veya hiç çalışmıyor. Bu durumlarda kullanıcının kullandığı tarayıcıyı tespit etmek ve ona göre hareket etmek akıllıca olacaktır. Bunun için kullanılan fonksiyon:</p>
<p>navigator.appName</p>
<p>Tabi sadece tarayıcıyı tespit etmek yeterli olmayabilir. Tarayıcı tanımlama ile ilgili tüm komutlar :</p>
<p>navigator.appName<br />
navigator.appVersion<br />
navigator.CodeName<br />
navigator.userAgent</p>
<p>Javascript ile kullanıcının bilgisayarından o anki tarihi ve saati almanız mümkün. Internet tüm dünyaya hitap ettiğinden sizin sayfanızın bulunduğu Web Server ile kullanıcının bilgisayarındaki saat ve tarih birbirine uymayabilir. Böyle bir durumda kullanıcının bilgisayarından saati ve tarihi almak faydalı olabilir.<br />
Önce saatin ve tarihin atanacağı bir değişken ile new Date() fonksiyonu çağırılır.<br />
zaman = new Date() Böylece zaman isimli değişkenin bir tarih değişkeni olduğunu belirttik. Fakat bu şekilde alınan tarih ve zaman bilgileri ekranda biraz düzensiz görülür. 14 Eylül 1998 tarihinde saat 22:10&#8242;da alınan bilgi ekranda şu şekilde görünecektir:<br />
Fri Aug 14 22:10:54 UTC+0300 1998 Bunu daha anlaşılı bir şekle sokmak için JScript&#8217;in .toLocaleString() komutundan yararlanılır.<br />
Deminki örneğimizde aldığımız zaman değişkenini zaman.toLocaleString() fonksiyonundan geçirdikten sonra alacağımız sonuç:</p>
<p><strong>08/14/1998 22:10:37 </strong>şeklinde olur.</p>
<p>Aynı zamanda kullanacağımız şu zaman fonksiyonlarıyla alacağımız değerler de şöyle olur:</p>
<table border="0" cellpadding="0">
<tbody>
<tr>
<td><strong>KOMUT </strong></td>
<td><strong>YANIT </strong></td>
<td><strong>AÇIKLAMA </strong></td>
</tr>
<tr>
<td><strong>zaman.getDay() </strong></td>
<td>5</td>
<td>Haftanın günü (0 = Pazar)</td>
</tr>
<tr>
<td><strong>zaman.getMonth() </strong></td>
<td>7</td>
<td>Ay (0 = Ocak , 0 &#8211; 11 arası)</td>
</tr>
<tr>
<td><strong>zaman.getDate() </strong></td>
<td>14</td>
<td>14 Ayın kaçıncı günü</td>
</tr>
<tr>
<td><strong>zaman.getYear() </strong></td>
<td>98</td>
<td>Yıl</td>
</tr>
<tr>
<td><strong>zaman.getHours() </strong></td>
<td>22</td>
<td>Saat</td>
</tr>
<tr>
<td><strong>zaman.getMinutes() </strong></td>
<td>10</td>
<td>Dakika</td>
</tr>
<tr>
<td><strong>zaman.getSeconds() </strong></td>
<td>37</td>
<td>Saniye</td>
</tr>
<tr>
<td><strong>zaman.getTime() </strong></td>
<td>903122773920</td>
<td>&#8220;1 Ocak 1990 Geceyarısı&#8221; tarihinden itibaren geçen milisaniye</td>
</tr>
<tr>
<td><strong>zaman.getTimezoneOffset() </strong></td>
<td>-180</td>
<td>Greenwitch&#8217;e göre (GMT) dakika olarak saat farkı</td>
</tr>
</tbody>
</table>
<p><strong>Java Script&#8217;te Resim İşleme </strong></p>
<hr size="2" />Aşağıdaki örnek Internet&#8217;te sıkça kullanılan ve Java Button diye anılan butonların nasıl çalıştığına bir örnektir. Bu butonlar mouse pointer üstlerine geldiği anda değişiyorlar ve pointer üstlerinden çekildiğinde eski hallerine dönüyorlar. Biz de bu işlemi yapan bir fonksiyon yazacağız ve butonun onMouseOver ve onMouseOut olaylarını bu fonksiyona göndererek resmi değiştireceğiz.</p>
<p>&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;script&gt;<br />
{<br />
res1 = new Image();<br />
res1.src = &#8220;resim1.gif&#8221;;<br />
res2= new Image();<br />
res2.src=&#8221;resim2.gif&#8221;;<br />
}<br />
function changeImage(imgDocId,imgObjName) {<br />
document.images[imgDocId].src = eval(imgObjName + &#8220;.src&#8221;);<br />
}<br />
// &#8211;&gt;&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;a href=&#8221;http://www.programlama.com&#8221; onMouseOver=&#8221;changeImage(&#8217;buton&#8217;,'res1&#8242;)&#8221;<br />
onMouseOut=&#8221;changeImage(&#8217;buton&#8217;,'res2&#8242;)&#8221;&gt;<br />
&lt;img src=&#8221;resim1.gif&#8221; border=&#8221;0&#8243; name=&#8221;buton&#8221;&gt;&lt;/a&gt;&lt;br&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>Bir de Internet&#8217;te her gün rastladığımız linklere renk ve hareket getirecek bir script örneği verelim:</p>
<p>&lt;HTML&gt;<br />
&lt;HEAD&gt;<br />
&lt;STYLE&gt;<br />
.on {<br />
font-size:12;<br />
text-decoration:underline;<br />
color:red;<br />
}<br />
.off {<br />
font-size:12;<br />
color:black;<br />
}<br />
&lt;/STYLE&gt;<br />
&lt;/HEAD&gt;<br />
&lt;BODY&gt;<br />
&lt;A HREF=&#8221;http://www.programlama.com&#8221; onMouseOver=&#8221;this.className=&#8217;on&#8217;;&#8221; onMouseOut=&#8221;this.className=&#8217;off&#8217;;&#8221;&gt;Gel Bakalim&lt;/A&gt;<br />
&lt;/BODY&gt;<br />
&lt;/HTML&gt;<br />
Burada STYLE tag&#8217;i içinde iki adet class tanımlıyoruz ve bunlara on ve off adlarını veriyoruz. Linkimize de başlangıç olarak off classını atıyoruz. onMouseOver olayında linkin classını on, onMouseOut olayında ise tekrar off yapıyoruz. Örnekte normalde siyah olan link, üzerine gelindiğinde kırmızı ve alt çizgili olmaktadır. Bu classların yapılarıyla oynayarak çok değişik linkler elde etmek mümkün</p>
<p>Yazan : Serdar Kalaycı</p>
]]></content:encoded>
			<wfw:commentRss>http://www.knbykl.org/javascript-ile-web-sayfa-duzenlemeleri/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XML&#8217;i Kavramak</title>
		<link>http://www.knbykl.org/xmli-kavramak/</link>
		<comments>http://www.knbykl.org/xmli-kavramak/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 04:04:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Advisories]]></category>
		<category><![CDATA[Mail Security]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[XML Dökümanları]]></category>
		<category><![CDATA[XML Kavramak]]></category>
		<category><![CDATA[XML Makaleleri]]></category>
		<category><![CDATA[XML nasıl öğrenilir?]]></category>

		<guid isPermaLink="false">http://www.knbykl.org/?p=175</guid>
		<description><![CDATA[Bilgisayar dünyasının ilk kuşaklarında programcıların tek işlemli uygulamalar üzerine yaptıkları çalışmalar üzerinden nice değişimler geçti. Küçük bir eylemi yapmak için büyük makinelerin açılıp kapatılması gerektiği bir dönemde toplama işlemini yapabilen makineler birer teknoloji harikası görülüyordu.

Bilişimin değişken teknoloji ve fizyonomisini tarihsel bir yaklaşıma yansıttığımız an, her zaman birkaç temel kavramın baskın olduğunu görürüz. “Zaman” ve ”iş” [...]]]></description>
			<content:encoded><![CDATA[<p>Bilgisayar dünyasının ilk kuşaklarında programcıların tek işlemli uygulamalar üzerine yaptıkları çalışmalar üzerinden nice değişimler geçti. Küçük bir eylemi yapmak için büyük makinelerin açılıp kapatılması gerektiği bir dönemde toplama işlemini yapabilen makineler birer teknoloji harikası görülüyordu.<br />
<img class="alignnone size-full wp-image-177" title="xml-kavramak" src="http://www.knbykl.org/wp-content/uploads/2009/06/xml-kavramak.jpg" alt="xml-kavramak" width="615" height="100" /><br />
<span id="more-175"></span>Bilişimin değişken teknoloji ve fizyonomisini tarihsel bir yaklaşıma yansıttığımız an, her zaman birkaç temel kavramın baskın olduğunu görürüz. “Zaman” ve ”iş” kavramlarının, “iş”in hep büyümesi gölgesinde ters orantılı olarak yürütülmesi amaçlanıyordu. Birçok şey, yeni tasarım ve teoremler bekliyordu.</p>
<p>Ve “iş” hep büyüdü, istenilenler çoğaldı, parametreler daha kompleks hâl aldı, cevap bekleyen bir ton soru soruldu, “bunu da yapabilecek mi” beklentileri başladı, oluşan rekabette etik tartışıldı, kazalar oluştu, -farklılık- çok az bir fark olarak görüldü.“Yoksa, sahip olmak istendi.Varsa, daha fazlası istendi”, en zoru da bütün bunlar için mehil verilmiyor, zaman tanınmıyordu. Daha sı ortam “sanal” dı.</p>
<p>Süreç, hergün gebe kalıp erken doğumlar yapıyordu.Evler, işyerleri kapılarını dünyaya açtılar, bireylerin heran yeni coğrafik keşiflere çıkabilmeleri için daha görkemli alanlar yaratıldı, ama hiç asfalt dökülmüyordu bunun için. Daha önce düşünmediğimiz birçok şey artık bizim için olmazsa olmaz sistemler haline geldi. Sunulan teknolojiler, “daha az yeni doktrin daha çok yeni etkinlik”ler getirdi. Artık özellikle yazılım teknolojisi kuram olmaktan çıkıp bir olgu olmuştu. Üretken olana kayıldı,-esneklik, verimlilik, bütünleşme, destek- sözcükleri yazılımcıların dillerinden düşmedi.Yeni lisanın elifbası çoktan yazılmıştı. Kullanıcıya sadece okumak ve bu kavramlarla ilgili cümleler kurmak kaldı. Ancak yazılımcıların ortaya koyduğu ve çeşitli farklı organik yapıya göre değişkenlik gösteren uygulamalar arasında bir standardın olmaması herzaman tartışma konusu oldu. Her yazılımcı çıkardığı birçok yenlikte kendi donelerini kendi bileşenlerini kullandı. Bu hem rekabeti canlı tutuyordu hem de kullanıcılar arasında renkli bir ortam oluşturuyordu. Birinin yaptığını diğeri yapamıyordu. Bu şekilde birbirinden ayrılan ancak aynı amaçlı birçok yazılım ortaya çıkmıştı. Bütün yazılım dillerin genel amacı; en kısa yoldan hızlı, profesyonel,güçlü ve güvenli uygulamalar için altyapı hazırlamaktır. Öngörülen bu mantık çerçevesinde uygulamaların altyapılarında bir standart oluşturulmaya çalışıldı. Özellikle gerek kurumsal bağlamda gerekse bireysel bağlamdaki kullanıcıların birçok zaman veri paylaşım sorunu vardı. Çünkü her kullanıcı verilerini farklı profil ve biçimlerde saklamış kullanmıştı. Yeni bir platform için söz konusu ortamın kopyasını oluşturması gerekiyordu. Başka bir departmandaki veriler arasında aynı organlar olmadığı zaman iletişim kurulamıyordu. Birçok firma bazı standartları oluşturma yoluna girdi özellikle Internet denen bulgu bunun için bulunmuş en güzel fırsattı. Ancak bunun tohumları daha yeni filizleniyor. Yine de yazılım çevresi daha önceki başarılarını üstüne Internet’teki gelişmeleri de başarıyla kaydedip mirasa devam etti. Bununla beraber herkesi aynı ortam üzerinde iletişime götüren Internet geçen hergün genişlediği halde birçok standarttan eksikti. Ve bu kesinlikle gerekliydi. Yani yazılım dünyası, donanım cephesinin kendi içinde kurduğu standartlığı kuramamıştı.<br />
Platform zenginliği yaşadığımız günümüzde yazılımcıların işi daha da zor. Hem işletim sistemi hem de uygulamalar hem de organik platformlar bazında birçok “ayrı” var. Örneğin günümüzde yaşam biraz daha mobil oluyor, biraz daha mekandan bağımsız oluyor, GSM’ce davranıyor, GPRS’ce konuşuyoruz.WAP telefonları, el bilgisayarları ve PDA’lar PC’lerin misyonunu tehdit ediyor. 3. kuşak (3G) denilen UMTS, EDGE gibi teknolojiler için yatırımlar yapılıyor. Artık mekan kavramına mahkum olmadan verilerimize ulaşabilme ihtimali sonuçlanıyor, sesli ve görüntülü iletişim derinden ilerliyor.<br />
Öyle görülüyor ki zor zamanda çok iş yapılmış gibi. Bütün bunlarla beraber insanlığın dramatik bir değişim yaşadığı da en açık ifadedir. Aslında benim üzerinde duracağım XML teknolojisi için böyle bir giriş yapmaya gerek var mıydı bilmiyorum. XML bahsettiğim bu değişimler içinde gerçekten büyük bir konuma sahip mi bunu da hep beraber göreceğiz.<br />
Neyse, yukarıda bahsettiğim gelişimde oturulmak istenen standart kavramlar için belirli nitelikte belirli örneklikte uyulacak tekbiçimler oluşuyor günümüzde. Bunu yapabilecek teknolojiden biri olan ve veri iletişimi sağlayacak XML yapısından söz edeceğim.<br />
Geleceğin iş modelleri değişmektedir. Dünyada birçok yerde Internet ve bilgisayar çözümü kendini normal katsayısında göstermediği halde mobilişim kısa süre içinde gündeme oturdu. “e-”’li birçok şey sanki “m”li olacak.e-işàm-iş. Şu halde bilgisayar dallarının mobil aygıtlara taşınmasıyla beraber kurumlar işlerini de beraberinde bu aygıtlara sorunsuz taşımak istiyorlar. Müşterilerin bir işletme ile kurduğu ilişkiler için kullandığı farklı kanallar mevcuttur. Bu kanallar(web, faks, e-mail,telefon) arasında iletişim her zaman sorun olmuştur. Ve bu entegrasyon olumlu olmadığı sürece iş akış süreci zaman kaybediyor.</p>
<p>Öyle bir şey olmalı ki . . .</p>
<p>Platform sayısı bu kadar fazla iken kullanıcıların veya kurumların verilerini sadece bir alanda değil diğer aygıtlarda da sunulmasını istediklerinde hiç de kolay bir şekilde bunu yapamayacaklardır. Bu veriyi yeniden biçimlendirmeli, kostümünü yeniden şekillendirmelidirler. Yani verinin başka ortamlara alınarak değişik biçimlerde değişik renkte sunulması her zaman sorun olmuştur.</p>
<p>Ayrıca veriyi saklamada ve veriye ulaşmada da metot değişmektedir. Artık ağaç yapısına geçiliyor. Klasik database modellerine karşın iç içe veriler saklanabilecekler. Dolayısıyla aralarındaki ilişki daha toplu olmuş olacaktır. Veriye derinlik kazandırılmaktadır. Bundan dolayı yapısal olarak erişilebilmesi (diğer sistemlerden tarafından),yapılan işe uygun olması, işlevsellik ve entegrasyon açısından XML önemli bir rol oynuyor.</p>
<p>Öyle bir sistem olmalı ki, hem verilerin daha güvenli olarak dolaşması sağlanmalı, aralarda bir yerlerde kaybolmamalı, hem de zamandan büyük kazanç sağlamalı.</p>
<p>Günümüzde mühendislik, ticari ve bilimsel alanlarda yaygın olarak kullanılacak standart bir olgu : XML .<br />
XML : Post-Modern motif ve modern (elektronik) iş arasındaki entegrasyon<br />
Evet entegrasyon sorunu için XML iyi bir çözümdür.</p>
<p>XML içerik sağlıyor, diyor eWeek dergisi.Ve devam ediyor ; XML verinin dış dünyaya nasıl gösterileceği ile beraber verinin içeriğini de dış dünyaya sunuyor. Örneğin bir hava durumu bilgisini XML biçiminde aklayabilirsek; farklı kullanıcılar farklı biçimde bu bilgiye ulaşabilir. Örneğin bir WAP telefonu ile bu bilginin sadece metin tabanlı bölge ve rakamsal sonuçları alınabilirken, bir tarayıcı üzerinden aynı bilginin grafik gösterimi veya gözlerin görmeyenler için de krill alfabesi biçiminde bilgisi alınabilir. XML içinde ilgili veri “Tag”larlar ayrıldığı için, XML üzerine inşa edilen bir arama motoru, sorgunun ilgili diğer bölümlerini kullanıcının isteğine göre birleştirerek de sunabiliyor. Böylece aynı veritabanı içindeki “pazarlama” sonuçları pazarlama müdürüne, “üretim” sonuçları üretim ve planlama müdürüne ulaşırken, genel müdür, bu bilgileri birleştirerek çok farklı bir analiz sonucuna kolayca ulaşabiliyor.<br />
XML şirketler, bankalar, üreticiler, kullanıcılar arası veri değişimi ve depolanması konusunda çok büyük yararlar sağlayacaktır. Özellikle B2B entegrasonunda önemli bir oyun sergileyecektir.</p>
<p>200 organizasyon arasında yapılan bir araştırmada, katılımcıların yüzde 41&#8242;i XML&#8217;e yatırım yapmalarının B2B borsalarına katılmalarıyla ilişkili olduğunu belirttiler. Aşağıda yöneticilerin XML&#8217;e neden para harcamaları gerektiğinin nedenlerini bulacaklar.</p>
<p>* Verilerin XML&#8217;le dönüştürülmesi kurumların arama yeteneklerini genişletiyor<br />
* XML yeni uygulama geliştirme zamanını kısaltıyor<br />
* XML destekli iş süreçleri iş döngülerinin kısalmasını sağlıyor<br />
* XML dahili uygulamalarının müşteri uygulamalarına bağlanmasını sağlıyor<br />
* XML uygulamaları dağıtıcılara ve iş ortaklarına bağlıyor<br />
Kaynak: Zona Research<br />
XML’i kavramak . . .<br />
Üzerinde binlerce makinenin aynı anda haberleşmesini sağlayan bir yapıya sahip Internet gün geçtikçe kavramları, olguları, gelişim, nüfusu ve yoğunluğu ile gündeme oturmaktadır. Gelişim Internet denen dünya ağını öyle bir konumu getirdi ki, artık yalnızca bilgisayarlar değil mobil telefonlar, arabalar, televizyonlar hatta evdeki buzdolabı gibi değişik amaçtaki cihazlar da Internet’e bağlanabiliyorlar. Kendileri bu yeteneğin kazandırıldığı bu aygıtlar değişik amaçlı, fabrikasyon özellikleri farklı, üreticileri, organik yapıları, üzerlerindeki yazılım ve donanım farklı en önemlisi Internet&#8217;e bağlanma yöntemleri farklıdır. Buna rağmen bütün bu cihazların birbirleri ile anlaşmalarını sağlayan ortak bir şey var. Bunların hepsi aynı dili konuşuyorlar. Hepsi TCP/IP isimli adap erkânı biliyor. Internet’e bağlanıp diğer aygıtlarla iletişim kurma hünerlerini bu TCP/IP etiketine borçludurlar. Internet’in tutanağı, iletişimin resmi kurallar kümesi olan bu standart dil bu denli bir esneklik sağlanmıştır.</p>
<p>Şahit olduğunuz gibi, çok daha önce, insanlar arasında bile sorun teşkil edebilen iletişim problemini donanım cephesi halletmiştir. Herkesin kendi algoritmasıyla, kendi doneleriyle, kendi bakış açılarıyla ve en önemlisi kendi pazar paylarını dikkate alarak oluşturdukları yazılımlar, kendi dışındaki yazılımlarla konuşturulmak istendikleri zaman ciddi problemlerle karşılaşılıyordu. Aslında bu bahsettiğim standart yapı, yazılımların her türlü bileşeniyle diğer yazılımlarla haberleşmesi değil veya her yönüyle ona açık olması değildir. Tek sorun ; zaman ve mekandan etkilenmeden hepsinin aynı veriyi kullanabilmesidir. Yazılımların, yalnızca kendilerinin anlayabileceği bir veri biçimi değil bütün yazılım ve aygıtların rahatlıkla alıp kullanabileceği, çıkarım yapabileceği bir yapı olmalıdır. Her türlü veri(data)nin tek bir formatı olmalı ki bu sorun çözülsün.</p>
<p>İşte bahsettiğim, bahsetmeye devam edeceğim ve gelişmeye açık teknoloji olan XML bu sorunun tek çözümüdür. Kimsenin tekelinde olmayan, World Wide Web Consortium (W3C) tarafından oluşturulan XML, veri yapısının, biçiminin oluşturduğu daralanları genişletecektir. Yazılım dünyasının en önemli argümanı olan Veri’yi geniş bir paylaşımda, güçlü bir iletişimle kurumsal pazara açacaktır. Böylece hem yeni pazar payları açacaktır , özellikle e-ticaret alanında esneklik sağlayacaktır, hem de bireysel istekler için kurumsal giriş kapılarını (portallar) açacaktır. XML&#8217;in iş dünyasına getirdiği en önemli şey, kurumların birbirleri ile konuşabilmesi için altyapıyı sağlıyor olması. XML bugüne kadar başarılamayan bir şeyi başardı ve kurumların farklı uygulamalarının birbiri ile konuşabilmesini sağladı.</p>
<p>Terim olarak XML nedir ?<br />
XML&#8217;de veri (data), verinin görünüşünden (presentation) ayrıldığı için programlara, özelliklerini kaybetmeden veriyi ortak bir yapıda saklama imkanı sağlamaktadır. Her uygulama bu veriyi dilediği gibi sunabilmektedir.<br />
Veri, bir veritabanında olduğu gibi yapısal özellikleri korunarak saklandığından, yığın olmaktan kurtulmakta ve gerektiğinde filtre edilebilen, sorgulanabilen bilgi olarak saklanmaktadır. XML, doküman ve verinin çok geniş bir yelpazede mantık tanımını yapabilen bir meta dildir. Evrensel ve esnek yapısı nedeniyle kelime işlem uygulamalarından e-iş uygulamalarına varan geniş ve sınırsız bir uygulama alanında kullanılmaktadır.<br />
Web uygulamalarında XML&#8217;e ihtiyaç duymamızın önemli sebepleri var. Web sayfaları hazırlarken şu ana kadar kullandığımız HTML, öncelikle sununun, görünüşün nasıl olacağına odaklanmış bir script (betik) dili. HTML taglarının büyük çoğunlu sayfalarımızın şeklen nasıl olacağını belirlemek için kullanılıyor.<br />
HTML&#8217;de veri ve biçim iç içe geçmiş durumda. Veriyi, bu sayfanın içinden ayıklamak ve kullanmak mümkün olmamakta.</p>
<p>Kısacası ; XML&#8217;de veri ve verinin sayfamızda nasıl gösterileceği birbirinden ayrılmıştır ve verileri, aynı bir veritabanında yer alan veri gibi etkili bir şekilde kullanabilme imkanımız vardır.<br />
XML Extensible Markup Language (Genişleyebilir İşaretleme Dili)<br />
Markup, yazılı metinlerin gösterim aygıtlarda uygun biçimde yayınlamasını sağlayan özel semboller olarak tanımlanıyor. Bu metinin belirli kısımlarının özel bir anlam kazandırmak üzere işaretlenmesi işlemidir. Bu şekilde kullanılan işaretler, kurallar ve gramer kümesi markup language (işaretleme dili) olarak tanımlanır.<br />
Metin ve belgelerin kolay bir şekilde taşınabilmesi, paylaşılabilmesi ve işlenebilmesi için ilk işaretleme dili GML (Generalized Markup Language) 1960 sonlarında IBM’de yapılan araştırma çalışmaları sonunda ortaya çıktı. GML daha sonra ANSI (American Natitional Stardard Institute) 1978 te oluştuturlan bir grup tarafından geliştirilerek SGML (Standardized Generalized Markup Language) adı altında 1986 yılında ISO (the International Organization for Standardization) kurumunca uluslararası bir standard olarak kabül edildi . Birçok sektörde aktif olarak kullanılan SGML, belge ve metin sunumda kullanılan standartlaşmış bir sözlük, semboller kümesidir. Yeni biçim dillerinin üretilmesine olanak sağlar. SGML çok güçlü bir dil olmasına rağmen son derece karmaşık yapısı ve yüksek uygulama geliştirme maliyeti bu dilin yaygın bir şekilde kullanımını engellemiştir.<br />
Tim Berners-Lee ve Anders Berlung 1989 yılında internet ortamında belge paylaşımını kolaylaştırmak için Web uygulamalarının temel öğelerinden biri olan HTML (Hypertext Markup Language) dilini geliştirdiler. HTML bir SGML uygulaması olarak geliştirildi. Diğer bir deyişle HTML dilinin yapısı SGML dilinde tanımlandı. HTML dili çok basit yapısı ile son derece başarılı oldu. 1996 yılında Word Wide Consortium (W3C, http://www.w3.org)’u SGML güç ve esnekliğini içereçek basit bir işaretleme dili oluşturmak amaçıyla XML dilini tasarlamaya başladı. Şubat 1998’de XML 1.0 bir standard olarak W3C tarafından yayınlandı. XML dili SGML dilinin bir çok özelliğini içeren basitleştirilmiş dildir. SGML dilinin bir alt kümesidir. XML SGML gibi bir meta dildir. Yani başka dillerin yapısını tanımlamakta kullanılan bir dildir.</p>
<p>Gelecek yazılarda XML söz dizimi kuralları, XML DTD, XML Schema, XML Namespaces, Xpath, Xpointer, XSL, XSLT, XSLF, SAX ve DOM gibi bir çok belirtim ve teknolojiden anladığım kadarıyla bahsedeceğim.</p>
<p>XML SÖZ DİZİMİ (SYNTAX)<br />
XML içerisinde kullanılacak işaretleme ifadeleri;<br />
elemanlar (elements),<br />
varlık referansları (entity refererences),<br />
açıklamalar (comments),<br />
işleme komutları (processing instructions),<br />
CDATA bölümleri,<br />
ve veri tipi tanımlamalarından (document type declaretions) oluşur.<br />
Bir XML belgesi yazılmaya başlandığında bu belgenin bir XML belgesi olduğunu ve hangi versiyonu kullandığını belirlemek için ilk satır, aşağıdaki biçimde yazılmak zorundadır. Dökümanı tamamen okuduktan sonra bundan 2 konu önce yazmış olduğum <a title="Permanent Link to XML Başlangıç ve Kullanım Alanı" rel="bookmark" href="http://www.knbykl.org/xml-baslangic-ve-kullanim-alani/">XML Başlangıç ve Kullanım Alanı</a> başlıklı dökümanımı okursanız, daha iyi anlayacağınıza eminim.</p>
<p>Kaynak: Ahmet Kaymaz</p>
<p><!--l version="1.0--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.knbykl.org/xmli-kavramak/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Oracle &#8211; Veri Tabanı Yönetim Sistemi</title>
		<link>http://www.knbykl.org/oracle-veri-tabani-yonetim-sistemi/</link>
		<comments>http://www.knbykl.org/oracle-veri-tabani-yonetim-sistemi/#comments</comments>
		<pubDate>Wed, 10 Jun 2009 20:03:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Advisories]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[ASE]]></category>
		<category><![CDATA[Inc]]></category>
		<category><![CDATA[INFORMIX]]></category>
		<category><![CDATA[Informix Corporation]]></category>
		<category><![CDATA[Oracle Corporation]]></category>
		<category><![CDATA[Oracle Eğitim]]></category>
		<category><![CDATA[Sybase]]></category>
		<category><![CDATA[Veri Tabanı Yönetim Sistemi]]></category>

		<guid isPermaLink="false">http://www.knbykl.org/?p=171</guid>
		<description><![CDATA[Teknolojinin her dalında olduğu gibi VTYS alanında da çok hızlı gelişmeler yaşanmaktadır. Bu haftaki dersimizde size bazı güncel VTYS&#8217;leri bir miktar tanıtmaya çalışacağız. Tabii ki bu tanıtımda örnek VTYS&#8217;lerin tüm özelliklerini tanıtma iddiasında değiliz.


Sadece temel ve ayırdedici özelliklerini tanıtmayı amaçlıyoruz. Daha ayrıntılı bilgiyi VTYS&#8217;nin web sitesinden veya ilgili şirketlerden edinebilirsiniz.
Örnek VTYS&#8217;lerimiz:
ORACLE &#8211; Oracle Corporation
INFORMIX &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>Teknolojinin her dalında olduğu gibi VTYS alanında da çok hızlı gelişmeler yaşanmaktadır. Bu haftaki dersimizde size bazı güncel VTYS&#8217;leri bir miktar tanıtmaya çalışacağız. Tabii ki bu tanıtımda örnek VTYS&#8217;lerin tüm özelliklerini tanıtma iddiasında değiliz.<br />
<img class="alignnone size-full wp-image-172" title="oracle" src="http://www.knbykl.org/wp-content/uploads/2009/06/oracle.jpg" alt="oracle" width="615" height="100" /><br />
<span id="more-171"></span><br />
Sadece temel ve ayırdedici özelliklerini tanıtmayı amaçlıyoruz. Daha ayrıntılı bilgiyi VTYS&#8217;nin web sitesinden veya ilgili şirketlerden edinebilirsiniz.<br />
Örnek VTYS&#8217;lerimiz:<br />
ORACLE &#8211; Oracle Corporation<br />
INFORMIX &#8211; Informix Corporation<br />
ASE &#8211; Sybase, Inc.<br />
ORACLE</p>
<p>İlişkisel Veritabanı Yönetim Sistemleri (Relational Database Management Systems &#8211; RDBMS) büyük miktarlardaki verilerin güvenli bir şekilde tutulabildiği, bilgilere hızlı erişim imkanlarının sağlandığı, bilgilerin bütünlük içerisinde tutulabildiği ve birden fazla kullanıcıya aynı anda bilgiye erişim imkanının sağlandığı programlardır. Oracle veritabanı da bir ilişkisel veri tabanı yönetim sistemidir.</p>
<p><strong>Oracle veritabanının özellikleri şunlardır:</strong><br />
<span style="color: #ccffff;">• Büyük miktarda veri tutabilmekte ve verilerin depolandığı alanları ayarlama imkanı vermektedir.<br />
• Aynı anda çok sayıda kullanıcıya verilerin bütünlüğünü bozmadan hizmet verebilmektedir. Oracle 8 sürümü ile birlikte on binlerce kullanıcıya hizmet verebilmektedir.<br />
• Günün 24 saati ve haftalar boyu hiç kapatılmadan çalışabilmektedir.<br />
• İşletim sistemi, veri erişim dilleri ve ağ iletişim protokolleri standartlarıyla uyumludur.<br />
• Yetkisiz erişimleri engelleme ve kontrol edebilme imkanı sağlamaktadır.<br />
• Bütünlüğü veritabanı düzeyinde sağlayabilmektedir, böylece daha az kod yazılmaktadır.<br />
• İstemci/Sunucu mimarisinin bütün avantajlarını kullanabilmektedir.</p>
<p></span>Oracle ile ilk defa karşılaşan kullanıcılar genellikle Delphi, Visual Basic gibi görsel programlama dillerine benzeyen uygulamalarla karşılaşmayı umarlar. Oysa ki yukarıda da belirttiğimiz gibi Oracle bir ilişkisel veritabanı yönetim sistemidir. Yani bir programlama dili değildir. Fakat Oracle tarafından geliştirilen ve Oracle’ın kendi uygulama geliştirme araçları içerisinde kullanılan bir programlama dili vardır. Oracle ürünleri genellikle büyük çaplı veri kontrolünü gerektiren uygulamalarda kullanılır. Öncelikle bir ağda Oracle veritabanı sadece sunucu olarak adlandırılan bilgisayara yüklenir. Bu sunucu Oracle’ın desteklediği herhangi bir işletim sistemiyle çalışıyor olabilir. Yani Oracle’ın faklı işletim sistemleri için farklı sürümleri vardır. Bu sunucu bilgisayara kurulan veritabanı üzerinde tablolar, indeksler, eşanlamlar,tablo uzayları ve ihtiyaç duyulan kayıtlı prosedürler oluşturulur. Bunlar raporun sonraki bölümlerinde anlatılmaktadır. Oracle’ın bu veritabanına erişerek uygulama programı geliştirmeye yarayan diğer ürünleri de istemci bilgisayarlara kurulur. Tabi sunucu bilgisayara da isteğe bağlı olarak bu ürünler kurulabilir.<br />
<strong><br />
Oracle Ürünleri<br />
</strong>Aşağıda şu an kullanımı en güncel olan değişik Oracle ürünleri tanıtılımıştır.<br />
<strong><br />
Oracle RDBMS<br />
</strong>Oracle ilişkisel veritabanı yönetim sistemi Oracle şirketinin ana ürünüdür. Bu ürünün şu an en yeni sürümü Oracle9i RDBMS’dir. Biz bu çalışmada bir önceki sürüm olan Oracle8i’yi esas alacağız. Oracle 8i’den bir önceki sürüm Oracle 7 ve onun bir önceki sürümü de Oracle 6’dır.<br />
<strong><br />
Oracle Uygulama Geliştirme Araçları</strong><br />
Oracle’ın veritabanı uygulamaları geliştirmek için görsel ürünleri bu grupta yer alır. Oracle’ın program geliştirmek için kullanılan bu ürünlerinin eski adı Oracle Power Objects idi. Daha sonra Oracle Developer 2000 ve sonra da Oracle Developer 6 ürünleri geliştirildi. Developer 2000 ve Developer 6 içerisinde Form Builder, Report Builder, Graphics Builder, Procedure Builder ve Schema Builder ürünlerini içerir. Form Builder kullanıcıya sunulacak arayüzlerin geliştirildiği programdır. İşte bu uygulama görsel bir programlama dilinin uygulama geliştirme ortamına benzer. Report Builder ürünü veritabanından elde edilen bilgiler ile raporlar hazırlamaya yarar. Özellikle banka ve kamu kuruluşlarının ihtiyacı olan fatura, evrak gibi belgelerin hazırlanıp, çıktı alınması için geliştirilmiş bir programdır. Procedure Builder sürekli kullanılacak kodların prosedürler halinde oluşturulup, kütüphaneler olarak kaydedilmesi işlemine yarayan bir programdır. Schema Builder ise veritabanı nesnelerinin görsel olarak oluşturulabilmesi için geliştirilmiş bir uygulamadır. Burada tablo, görüntü, eşanlam oluşturma, tablolar arası ilişki kurma,tablo kısıtlamaları oluşturma işlemleri görsel olarak yapılabilir.<br />
<strong><br />
SQL*Plus<br />
</strong>SQL*Plus, Oracle veritabanında sorgulama yapmak ve SQL komutlarını çalıştırmak için kullanılan bir araçtır. SQL*Plus’da SQL komutlarının yanısıra PL/SQL komutları da kullanılabilmektedir. Bu çalışmanın diğer bölümlerinde anlatılan SQL komutları SQL*Plus kullanılarak hazırlanmıştır.<br />
<strong><br />
PL/SQL</strong><br />
PL/SQL (Procedural Language/SQL), yapısal dillere ait özelliklerin standart SQL’e eklenmesiyle ortaya çıkan Oracle’a has bir dildir. PL/SQL Oracle firmasının piyasaya sürdüğü her üründe önemli bir yere sahiptir. Kullanıcılar PL/SQL’i kullanarak programlarına bir çok yeni özellikler katmaktadırlar. Bunlar arasında;<br />
<span style="color: #ccffff;">• PL/SQL tabanlı kaydedilmiş yordamlar(stored procedures) ve veritabanı tetiklemeleri(triggers) ile önemli iş kurallarını programlamak<br />
• Oracle Developer ürünleri ile güçlü ve kolay kullanılabilir görsel ortamlarla programları detaylandırmak ve daha rahat kontrol etmek<br />
• Oracle tabanlı uygulamalarda nesne-tabanlı(object-oriented) tasarımlar yapma Web sayfalarından Oracle veritabanlarına link yapma<br />
</span><br />
PL/SQL’in belki de en önemli özelliği istemci-sunucu ortamları tasarlama ile ağ üzerinde dağıtık işlemler yapma ve bir çok sorguyu çalıştırma imkanı sunmasıdır. PL/SQL dili Ada dilinden sonra tasarlanmıştır. PL/SQL’de en gelişmiş yordamsal dillerde olan veri tipleri, blok yapısı, şartlara bağlı ve bağlı olmayan kontrol cümleleri, bir çok döngü tipi, hata durumlarında kullanılacak yordamlar ve kullanıcı tarafından tanımlanabilecek nesneler yer almaktadır.<br />
<strong><br />
Net8<br />
</strong>Net8 Oracle’ın bir ağ ürünüdür. Farklı bilgisayarların veritabanına bağlantı kurması ve ve istemci-sunucu arasında veri alışverişinin sağlanabilmesi Net8’in ana görevidir. Net8 ağdaki her bilgisayara kurulur. Ağ bağlantısı sağlandığında NET8 istemci ile sunucu arasında bir veri taşıyıcısı gibi işlem görür.</p>
<p>Ağ üzerinde bir istemcinin sunucudaki veritabanına erişebilmesi için, sunucuda bir ağ servis adının(Net Service Name) ve bir dinleyicinin(LISTENER) oluşturulması gerekir. Oracle Enterprise Edition ile birlikte gelen Net8 Assistant ile bu gerçekleştirilebilir. Ağ servis adları, veritabanı gibi bir servisi ağda tanımlamak amacıyla basit bir yöntem olarak kullanılır.<br />
 Verilen şekilde ağ erişimi oluşturmak için gereken işlemler oldukça basittir.</p>
<p><strong>SQL*Net<br />
</strong>SQL*Net Net8’in yardımcı programıdır. Bir istemci bilgisayara Oracle Forms ürününün yüklendiğini düşünelim. Bunun için istemci bilgisayar SQL*Net ile oluşturulan veritabanı takma adını(alias) kullanır. Yukarıda Net8 konfigürasyonunun istemci bilgisayarlarda da yapılması gerektiğini söylemiştik. İşte bu konfigürasyon istemci bilgisayarlarda SQL*Net sayesinde yapılır. Burada veritabanına verilecek takma isim, protokol adı, ana bilgisayar adı (veritabanının bulunduğu) ve veritabanının SID olarak girilen ismi bilgileri girilerek düzenleme yapılır.</p>
<p><strong>Oracle8i Enterprise Edition ve Gerekli Donanım</strong><br />
Bu rapor Oracle8i Enterprise Edition for Windows NT Release 8.1.5 sürümü üzerine düzenlenmiştir. Oracle8i Enterprise Edition CD’sinde üç farklı ürün yer almaktadır:<br />
• Oracle8i Enterprise Edition (Server)<br />
• Oracle8i Client<br />
• Oracle Programmer</p>
<p>Oracle8i Enterprise Edition(Windows NT)</p>
<p><strong>Yükleme Türü Açıklama</strong><br />
Typical Tam anlamıyla bir veritabanı kullanmak isteyenler için tavsiye edilen yükleme türüdür. Bir başlangıç veritabanı, ağ servisleri, Oracle yardımcı ürünleri ve yardım dokümanları yüklenir.720 MB yer kaplar. Pentium 133 ya da Pentium 166 işlemci ile kurulabilir. Önerilen işlemci Pentium 200 dür. 96 MB RAM ile çalışabilir. Tavsiye edilen bellek ise 128 MB ‘tır.<br />
Minimal Minimum veritabanı paketi kullanmak isteyenler için önerilir. Bir başlangıç veritabanı, ağ servisleri ve bazı yardımcı ürünleri içerir. 520 MB yer kaplar. Pentium 133 ya da Pentium 166 işlemci ile kurulabilir. Önerilen işlemci Pentium 200 dür. 64 MB RAM ile çalışabilir. Tavsiye edilen bellek ise 96 MB ‘tır.<br />
Oracle8i Client(Windows NT ve Windows 95/98)</p>
<p><strong>Yükleme Türü Açıklama<br />
</strong>Typical Veritabanı yöneticileri için veritabanına bağlanma ve veritabanı yönetim işlerini gerçekleştirme araçlarını yükler. 299 MB yer kaplar. Intel 80486 işlemci ile çalıştırılabilir. Tavsiye edilen Pentium 133 ya da Pentium 166 dır. En az 32 MB RAM ile çalıştırılabilir. Önerilen 64 MB’tır.</p>
<p>Oracle Programmer(Windows NT ve Windows 95/98)</p>
<p><strong>Yükleme Türü Açıklama<br />
</strong>Typical Veritabanına erişebilen geliştirme araçları ve ara yüzlerini yükler. Bu paket, ön derleyicileri(precompilers), ağ servislerini ve yardım dokümanlarını içerir. 267 MB yer kaplar. Intel 80486 işlemci ile çalıştırılabilir. Tavsiye edilen Pentium 133 ya da Pentium 166 dır. En az 32 MB RAM ile çalıştırılabilir. Önerilen 64 MB’tır.</p>
<p><strong>Oracle Veritabanı Yapısı<br />
</strong>Oracle veritabanının, işletim sistemi tarafından bakıldığında, biri fiziksel diğeri mantıksal olmak üzere iki bölümü vardır. Fiziksel bölüm, işletim sisteminden görünen kısımdır. Bunlar Data File(Veri Dosyası), Control File(Kontrol Dosyası) ve Log File(Log Dosyası) ‘dan oluşmaktadır. Mantıksal Bölüm, bir ya da daha fazla tablo uzayı(Tablespace) ve tablolar(table), görüntüler(view), sıralar(sequence), eşanlamlar(synonym), indeksler(index), kümeler(cluster), veritabanı bağlantıları (database link), prosedürler(procedure), fonksiyonlar(function), ve paketlerden(package) oluşan şema nesnelerinden oluşmaktadır. Fiziksel bölüm işletim sistemi tarafından görülebilmesine rağmen, mantıksal bölüm ancak Oracle’a bağlanıp, SQL komutları çalıştırılarak görülebilmektedir. Yani, Oracle kurulu herhangi bir makinede, SQL bilgisi olmayan bir insan, Oracle’ın sadece fiziksel bölümünü görebilmektedir.<br />
Oracle veritabanındaki her nesnenin bir sahibi(kullanıcı olarak bahsedilir) vardır. Her kullanıcı bir veya daha fazla tablo uzayına sahip olabilir. Her nesne, ait olduğu kullanıcının herhangi bir tablo uzayında (mantıksal olarak) bulunur. Her tablo uzayı da, kendisine sahip olan kullanıcının nesnelerini tutmak için işletim sisteminde bir veya daha fazla veri dosyasına sahip olabilmektedir.<br />
Sonuç itibariyle, veritabanındaki her nesnenin bir kullanıcısı vardır ve bu nesneler mantıksal olarak o kullanıcının sahip olduğu tablo uzaylarının herhangi birinin (hangisi olduğu komutlarla öğrenilebilir) içerisinde, fiziksel olarak da o kullanıcının sahip olduğu tablo uzayının herhangi bir veri dosyasında bulunur. Fakat, o veri dosyasının içerisine işletim sisteminden bu nesneyi bulmak için bakılamaz. Bu nesnenin sahibi ve mantıksal yeri “DML”(veri işleme dili) komutları ile bulunabilmektedir.</p>
<p><strong>Fiziksel Bölüm</strong><br />
Fiziksel bölüm veritabanını oluşturan işletim sistemi dosyalarıdır. Bir Oracle veritabanı fiziksel olarak bir ya da daha fazla veri dosyası, iki ya da daha fazla log dosyası, bir ya da daha fazla kontrol dosyasından oluşur.<br />
<strong><br />
Veri Dosyaları(Data Files)<br />
</strong>Veri dosyaları veri tabanındaki tüm verileri tutan dosyalardır. Tablo, indeks gibi mantıksal veritabanı yapılarının içerisindeki veriler fiziksel olarak veri dosyalarında tutulurlar. Bir veri dosyası kendisi için ayrılan alan dolduğunda, kendi sahip olduğu alanı artırabilecek özelliklere sahiptir. Bir ya da daha fazla veri dosyası mantıksal bir veritabanı depolama ünitesi olan bir tablo uzayını oluşturular.</p>
<p>Normal veritabanı işlemleri boyunca bir veri dosyası içerisindeki veriler okunur ve Oracle için ayrılan belleğe getirilirler. Örneğin bir kullanıcının veritabanındaki bir tablonun verilerine erişmek istediğini varsayalım. Eğer istenilen veriler bellekte yer almıyorsa, ancak o zaman uygun veri dosyasından okunur ve belleğe getirilirler.<br />
Değişikliğe uğrayan veriler ya da yeni eklenen veriler veri dosyalarına hemen yazılmazlar. Sabit diske erişimi azaltmak ve böylece sistemin performansını artırmak için veriler bellek havuzunda tutulur ve gerektiğinde hepsi birden uygun veri dosyalarına kaydedilirler. Bunu Oracle artalan işlemleri belirler.<br />
<strong><br />
Kontrol Dosyaları(Control Files)</strong><br />
Tüm Oracle veritabanları kontrol dosyasına sahiptir. Bir kontrol dosyası veritabanı adı, veri dosyaları ve log dosyalarının adı ve diskteki yeri, veritabanının oluşturulma tarihi vb. veritabanı ile ilgili bilgileri tutar.<br />
Her veritabanı oturumu açıldığında Oracle bu dosyayı kontrol ederek gerekli bilgileri alır. Eğer veritabanında fiziksel bir değişme olursa(yeni bir log dosyası ya da veri dosyası oluşturulması gibi), yapılan değişiklikler Oracle tarafından otomatik olarak kontrol dosyalarına yansıtılır.<br />
<strong><br />
Log Dosyaları(Log Files)</strong><br />
Redo Log dosyaları olarak bilinen bu dosyaların amacı veriler üzerinde yapılan tüm değişiklikleri kaydetmektir. Eğer veri dosyalarına kalıcı olarak kaydedilmiş olan, değişikliğe uğramış kayıtlarda bir bozukluk olursa yapılan değişiklikler redo log dosyalarından sağlanabilir ve işlemler kaybolmaz. Birden fazla tekrarlanan bozukluk durumlarında redo log dosyalarının da bozulmasını engellemek için Oracle farklı diskler üzerinde redo log dosyalarının birden fazla kopyasının alınmasına olanak sağlar.<br />
Bir veritabanı işlemi sırasında elektrik kesilirse, bellekteki veriler veri dosyalarına kaydedilmeyecek ve verilerin kaybolması durumuyla karşılaşılacaktır. Oracle veritabanı tekrar açıldığında redo log dosyalarında yapılan son değişiklikler veri dosyalarına yansıtılarak verilerin kaybolması engellenir.<br />
<strong><br />
Mantıksal Bölüm</strong><br />
Oracle veritabanının mantıksal yapısı tablo uzaylarını(tablespaces), şema nesnelerini(schema objects), veri bloklarını(data blocks), genişlemeleri(extents) ve parçaları(segments) içerir.<br />
<strong><br />
Tablo Uzayı(TableSpace)</strong><br />
Bir veritabanı, ilişkili mantıksal yapıların gruplanmasını sağlayan ve tablo uzayı olarak bilinen mantıksal depolama ünitelerine bölünmüştür.</p>
<p>Yukarıdaki şekil veritabanı, tablo uzayı ve veri dosyaları arasındaki ilişkiyi açıklamaktadır. Buna göre:<br />
<span style="color: #ccffff;">• Bir veritabanı bir ya da daha fazla tablo uzayına bölünmüştür.<br />
• Tablo uzayı içerisindeki tüm mantıksal yapıları fiziksel olarak depolayabilmek için, her tablo uzayı bir ya da daha fazla veri dosyasına sahip olabilir.<br />
• Tablo uzaylarının toplam kapasitesi, sahip oldukları veri dosyalarının toplam kapasitesine eşittir.(Yukarıdaki şekil için SYSTEM tablo uzayı 2MB, USERS tablo uzayı 4MB).<br />
• Tablo uzaylarının toplam kapasitesi veritabanının toplam kapasitesini belirler.(6 MB)<br />
Bir tablo uzayı açık ya da kapalı olabilir. Tablo uzayı kapalı olduğunda bu tablo uzayının içerisindeki nesnelere erişilemez. Bir tablo uzayı yönetim amaçlı olarak kapalı duruma alınabilir.<br />
Veri Tabanı Şema Nesneleri<br />
Şema nesneleri mantıksal veri depolama yapıları olarak bilinir. Veritabanı üzerinde kullanıcının belirli işleri yapabilmesi için tanımlanan bu yapılar tablolar, görüntüler, sıralar, eşanlamlar, indeksler, kümeler, veritabanı bağlantıları, prosedürler, fonksiyonlar, ve paketlerdir. Bir şema ise bu nesnelerin oluşturduğu gruptur.</span></p>
<p><strong>Küme(CLUSTER)</strong><br />
Aynı anda sorgulanan birden fazla tablonun bir arada kaydedilmesine “cluster” denir. Bu yapı, beraber sorgulanan tablolarda hız kazanmak için çok önemlidir. Örneğin “isci” tablosu ile “bolum” tablosunun(bu tabloların yapısı için SQL bölümüne bkz.) her ikisi de ortak olarak “bolum” ve “bolumno” alanlarını içermekte. Yani “isci” tablosundaki “bolum”, “bolum” tablosundaki “bolumno” alanına karşılık geliyor. Burada oluşturulacak bir cluster’da her iki tablo veritabanında yan yana getirilerek aynı veri bloğu içerisine kaydedilir.Böylece daha hızlı erişim sağlanır.<br />
<strong><br />
Indeks(INDEX)</strong><br />
İndeksler tablo ve cluster’lar için kullanılan veri tabanı nesneleridir. Burada amaç aranılan bir kayda daha hızlı erişimdir. Özellikle üzerinde çok arama yapılan alan veya alanlar üzerinde indeks oluşturmak çok etkilidir. İndeks oluşturulduğunda ilgili tablonun kayıtları yer değiştirmez. Sadece ilgili kayıtların kayıt numaraları olarak adlandırılan “rowid” ‘ler alınarak sıralama yapılır.</p>
<p>Bir tablo üzerinde oluşturulabilecek indeks sayısı sütunların kombinasyonları farklı olduğu müddetçe sınırsızdır. Bir sütun diğer sütunlarla değişik kombinasyonlarda kullanıldığı müddetçe birden fazla indeks içerisinde yer alabilir. Aynı sütun kombinasyonlarının indeksi, faklı indeks ismi kullanarak oluşturulmaya çalışılsa bile gerçekleştirilemez.<br />
İndeksleme işleminin gerçekleştirilmesinde Oracle çoğunlukla B-tree indeksleme metodunu kullanır. Bunun yanında “hash cluster indexes”, “reverse key indexes”, ve “bitmap indexes” yöntemlerini de kullandığı bilinmektedir.<br />
İndeksler mantıksal ve fiziksel olarak oluşturuldukları tablodan bağımsızdırlar. Eğer bir indeks silinirse, ilgili tablo zarar görmez, çalışmaya devam eder. Fakat indeks olmadığı için veri erişim süresi artacaktır.<br />
Oracle bir indeks oluşturulduğunda onu otomatik olarak kullanmaya başlar ve indeksin oluşturulduğu tablodaki silme, güncelleme ve ekleme işlemleri indekse otomatik olarak yansıtılır.<br />
<strong><br />
Rol(ROLE)</strong><br />
Oracle veritabanında her nesnenin ait olduğu bir kullanıcı vardır. Bir kullanıcı bir başka kullanıcının nesneleri üzerinde işlem yapmak isterse buna hakkı olması gerekir. Bir nesne üzerinde işlem yapabilme yetkisine hak denir. Örneğin veritabanına bağlanma, tablo oluşturma, bir başkasına ait tablodan kayıt listeleme, bir başkasının prosedürünü çalıştırma birer haktır. Bu haklar kullanıcılara atanmak suretiyle kullanıcıların bu işlemeleri gerçekleştirmeleri sağlanır. Hakların kullanıcılara atanması iki şekilde olabilir. Birinci olarak bir tabloya kayıt ekleme, kayıt silme vb. haklar bir kullanıcıya ya da kullanıcılara ayrı ayrı atanır. İkinci şekilde ise verilmek istenen haklar bir rol altında birleştirilir ve bu rol istenen kullanıcılara aktarılır.<br />
Haklar “sistem hakları” ve “nesne hakları” olmak üzere ikiye ayrılır. Sistem hakları veritabanı ile ilgili olarak önceden tanımlanmış rollerdir. Oracle’da 60’tan fazla sistem hakkı tanımlanmıştır. Nesne hakları ise veri tabanı nesneleri üzerinde işlem yapma haklarıdır. “Create Table”, “Create TableSpace”, “Drop Any Index” gibi haklar sistem haklarına örnek olarak verilebilir. Nesne hakları ise 8 çeşittir. “Select”, “Insert”, “Update”, “Delete”, “Alter”, “Index”, “Execute”, “References”, “All” çeşittir. “All” ayrı bir hak olarak adlandırılmaz. Diğer tüm hakları kapsar. Bu haklar sırayla kayıt seçme, kayıt güncelleme, kayıt silme, nesnelerin yapısını değiştirme, indeks oluşturma, alt program çalıştırma, yabancı anahtar tanımlayabilme işlemlerini içerirler. Rol tanımlama ve hak verme komutları ileride ayrıntılı olarak işlenecektir.<br />
<strong><br />
Geri Alma Parçası(ROLLBACK SEGMENT)<br />
</strong>Oracle veritabanının güvenliği açısından “Select”, “Insert”, “Update”, “Delete” gibi işlemlerin yedeğini almaktadır. Alınan bu yedeklerin konulduğu yerlere geri alma parçası denir. Kullanıcı bu tip işlemleri yaptıktan sonra “Rollback” komutunu uygularsa, yaptığı değişiklikler geri alma parçalarından getirilir ve böylece kayıtlar eski haline dönmüş olur. Kullanıcı “Commit” komutunu verirse yaptığı değişiklikler geri alma parçalarından geri getirilemez. Her veritabanında bir ya da birkaç tane geri alma parçası olabilir.<br />
<strong><br />
Sıra(SEQUENCE)</strong><br />
Tablolardaki kayıtlar için otomatik sıra numarası verilmesi isteniyorsa sıra nesnesi kullanılabilir. Bu sıra numarası veritabanı tarafından otomatik olarak üretilir. Özellikle çok kullanıcılı ortamlarda tekil olarak numara üretilmek istendiğinde çok kullanışlıdır. Birden fazla kullanıcı aynı anda böyle bir sayı üretmek isterse bunun program koduyla yapılması işlem hızını yavaşlatır. Çünkü bir kullanıcı diğeri işini bitirene kadar beklemek zorundadır. Sıra nesnesi bu işi otomatik olarak ve çok seri bir şekilde başarır.<br />
Sıra numaraları Oracle’da tanımlı 38 rakama kadar tamsayılardan oluşur. Bir sıra tanımlaması sıranın adını, artan ya da azalan olacağını, iki sayı arasındaki fark miktarını içerir. Oracle tüm sıra numarası tanımlarını SYSTEM tablo uzayının içerisindeki bir veri sözlüğü tablosuna kaydeder. SYSTEM tablo uzayı sürekli çalışır durumda olduğu için tüm sıra numaraları da aktiftir. Sıra numaraları tablolardan bağımsız olarak üretilir. Yani bir sıra numarası bir ya da daha çok tablo için kullanılabilir.</p>
<p><strong>Kayıtlı Fonksiyonlar(STORED FUNCTION) ve Kayıtlı Prosedürler(STORED PROCEDURE)</strong><br />
Bir grup SQL ya da PL/SQL komutunun belli bir işi gerçekleştirmek için bir araya getirilip veritabanına kaydedilmesi kayıtlı prosedürler ve fonksiyonlar sayesinde olur. Birden fazla uygulama programı içerisinde aynı işi yapan kodları sürekli yazmak yerine kayıtlı prosedür ve fonksiyonlar bir kere yazılır ve tüm uygulamalar tarafından kullanılır. SQL*Plus, Oracle Forms ya da Oracle Reports içerisinden bu prosedürler çağrılabilir. Prosedürler geriye birden fazla değer döndürebilirken, fonksiyonlar sadece bir değer döndürürler.<br />
<strong><br />
Eşanlam(SYNONYM)</strong><br />
Eşanlam bir tablo, görüntü, sıra, prosedür, fonksiyon ya da paket için “alias” olarak adlandırılan bir takma isimdir. Eşanlam bir takma isim olduğu için veri sözlüğü içerisindeki tanımının kapladığı yer haricinde, veritabanında yer kaplamaz. Eşanlamlar güvenlik ve daha rahat kod yazma amacıyla kullanılırlar. Bir eşanlam kullanıldığında ilgili nesnenin adı ve sahibi gizlenir ve SQL komutu içerisinde kullanımı kolaylaşır.<br />
Eşanlamlar genel(Public) ve özel(Private) olarak tanımlanabilirler. “Genel” olarak tanımlanan eşanlamlara tüm veritabanı kullanıcıları erişebilir. “Özel” olarak tanımlanan eşanlamlara sadece ilgili nesnenin sahibi ve sahibi tarafından hak verilmiş bir başka kullanıcı erişebilir.<br />
Bir nesnenin adı değiştirilmek istendiğinde ya da silinmek istendiğinde, bu nesneyi kullanan tüm uygulama programları değiştirilmek zorundadır. Oysa ki bu nesnenin bir eşanlamı oluşturulursa ve uygulama programları bu eşanlamı kullanırsa, eşanlam üzerinde yapılacak değişikliklerle bu silme vb. işlemlerden uygulama programlarının etkilenmesi önlenebilir.<br />
Bir kullanıcı bir başka kullanıcının nesnesini kullanmak istediğinde “kullanıcı_adı.nesne_adı” şeklinde bir yazım kuralına uymak zorundadır. Eğer bir “genel” olarak bir eşanlam tanımı yapılırsa tüm kullanıcılar direk eşanlam ismini kullanarak işlemlerini gerçekleştirebilirler.<br />
<strong><br />
Tablo(TABLE)</strong><br />
İlişkisel Veri Tabanı Yönetim Sistemleri’nde veriler tablolar içerisinde yer alır. Her tablo bir isimle tanımlanır ve her biri bir “kayıt” olarak adlandırılan satırlar ile bu kayıtlardaki verilerin özelliklerini belirleyen sütunlardan oluşur. Her tablo bir ya da daha fazla sütuna sahip olabilir. Her sütunun bir adı ve veri tipi vardır.<br />
Bir tablo oluşturulduğunda Oracle verileri depolamak için bir tablo uzayı içerisinde bir veri segmenti ayırır. Veri segmentinin değerleri değiştirilerek bir tablo için ayrılacak yer miktarı da değiştirilebilir.<br />
<strong><br />
Görüntü(VIEW)</strong><br />
Görüntü bir ya da birkaç tablodan istenilen alanların alınmasıyla oluşturulan sanal bir tablodur. Görüntü bu tablolar üzerinde gerçekleştirilen bir sorgu sonucu oluşturulur. Bir görüntü üzerinde silme, güncelleme gibi işlemler yapılamaz. Çünkü görüntü oluşturulduğu tabloların sadece o anlık görüntüsüdür ve veritabanında kendi tanımının kapladığı yer haricinde yer kaplamaz.</p>
<p>Oracle8 : Veri Tabanı Yönetim Sistemi, günümüzün dinamik çalışma grubu çevrelerinden yüksek hacimli ‘ online transaction&#8217; ve sorgulama bazlı veri ambarı sistemlerine kadar uzanan geniş bir yelpazede en uygun, en iyi performansa ulaşmak için esnek, açık, ölçeklenebilir, bağımsız, güvenli bir ortam yaratan, Web-enabled uygulama yaratımını destekleyen ve kolay kullanılabilir yönetim araçları içeren güçlü bir veri tabanı yönetim sistemine sahiptir. Oracle VTYS, 130’dan fazla donanım üzerinde (UNISYS, IBM, DEC, HP, SUN, MAC, Sequent, PC, Mainframe&#8230;..) ve tüm işletim sistemlerinde çalışmakta, değişik performans ihtiyaçları için tek işlemcili donanımlar’dan, Simetrik Çoklu İşlemcili sistemler üzerinde çalışabilmektedir<br />
Oracle’ın Kominikasyon Aracı, SQL*Net ürünü, client/server ve server/server Oracle veri iletişimini gerçekleştir. SQL*Net, yagın Kullanılan Tüm İletişim Protokollerini Destekler : TCP/IP, OS, APPLETALK, XODIAC,ve diğerleri<br />
Oracle8 VTYS’nin mimarisi yüksek performans sağlayacak bütün teknolojileri kullanmaktadır:</p>
<p>Contention-Free Queries: Oracle8 VTYS&#8217;de sorgulamalar güncelleştirmeleri ve güncelleştirmeler sorgulamaları bloke etmediği için işlemler birbirlerini beklemek zorunda kalmazlar.<br />
Paylaşımlı Derlenmiş SQL: Oracle VTYS, OLTP ortamlarda olduğu gibi çok sayıda kullanıcının aynı grup SQL cümlelerini kullandığı durumlarda bu kullanıcıların SQL cümlelerinin derlenmiş ve ortak bellekte tutulan tek bir kopyasını paylaşmalarına olanak verir. Bu shared compiled SQL yapısı sayesinde hem bellek kullanımı azalır hemde performans artar.</p>
<p>On-line Backup/On-line Recovery: Oracle VTYS, OLTP aktivitenin en yüksek olduğu zamanlarda bile kullanıcıları etkilemeyecek şekilde on-line backup (yedekleme) ve on-line recovery (kurtarma) işlemlerini gerçekleştirebilmektedir.</p>
<p>Otomatik Sıra Numarası Üretimi: Oracle VTYS, veri tabanında sıra numaraları üretilirken herhangi bir tablonun kilitlenmesine gerek olmadığından bu açıdan bir performans darboğazına girmemektedir.</p>
<p>Oracle, veri tabanı kaynaklarına, tablolarına ve verilerine yetkisiz ve kaçak erişimi engellemek ve denetleyebilmek ayrıca DDL komutlarının (create, select, delete vb) kullanım haklarının denetlenmesi için rol bazında güvenlik yöntemini kullanmaktadır. Bu yöntem her kullanıcının her tablo için erişim hakkının sisteme girilmesini gerekli kılan klasik yaklaşıma göre çok daha düşük maliyet getirmektedir. Oracle8 VTYS, güvenlik ve gizlilik nedeniyle erişim ve güncelleştirme için değişik şifrelerle korunma sağlamaktadır. Veri tabanı objelerine erişim yetkileri roller bazında tanımlanabilir (role-based security). Oracle8 VTYS, ANSI/ISO SQL3 güvenlik standardını desteklemektedir.</p>
<p>Rol, bir iş grubunu temsil eder. Veri tabanı kullanıcılarına daha önce tanımlanmış roller verilir. Böylece kullanıcının bulunduğu iş grupları kendisine verilen rollere bağlı olarak tanımlanmış olur. Bir role verilebilecek veri tabanı objelerine değişik erişim yetkileri verilebilir.<br />
Oracle VTYS veri tabanı bütünlüğüne (Integrity) sahiptir. Bir alan üzerinde verilebilecek kısıtlama sayısında herhangi bir limit yoktur. Oracle VTYS veri tabanı bütünlüğüne ilişkin bilgiler aşağıda verilmiştir</p>
<p><strong>Oracle Veri Bütünlüğü Uygulatımı</strong><br />
Oracle VTYS, veri bütünlüğü kurallarının herbirini tanımlamaya ve uygulamaya olanak sağlar. Bu kuralların büyük bir kısmı, bütünlük kısıtlamaları kullanılarak tanımlanır. Bütünlük kısıtlamaları aşağıda sunulmuştur;</p>
<p><strong>Bütünlük Kısıtlamaları (Integrity Constraints)</strong><br />
Bir bütünlük kısıtlaması, bir tablonun bir kolonu için bir kural tanımlamanın bildirimsel (declarative) bir yöntemidir. Bir bütünlük kısıtlaması, Oracle VTYS tarafından veri tabanının temel tablolarına geçersiz veri girişini engellemekte kullanılan bir mekanizmadır. Bütünlük kısıtlamaları, bir veri tabanındaki bilgiler ile ilgili iş kurallarını uygul