<?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>Huysuz Adam &#187; Güvenlik</title>
	<atom:link href="http://www.huysuzadam.com/tag/guvenlik/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.huysuzadam.com</link>
	<description>Web teknolojileri ile ilgili teknik bir blog...</description>
	<lastBuildDate>Mon, 18 Jul 2011 11:02:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>SQL Injection nedir, nasıl önlenir?</title>
		<link>http://www.huysuzadam.com/2011/02/13/sql-injection-nedir-nasil-onlenir/</link>
		<comments>http://www.huysuzadam.com/2011/02/13/sql-injection-nedir-nasil-onlenir/#comments</comments>
		<pubDate>Sun, 13 Feb 2011 09:09:04 +0000</pubDate>
		<dc:creator>M.Ozan Hazer</dc:creator>
				<category><![CDATA[Genel]]></category>
		<category><![CDATA[Güvenlik]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.huysuzadam.com/?p=508</guid>
		<description><![CDATA[PHP&#8217;yi ya da web tabanlı herhangi bir yazılımı öğreniyorsanız güvenlikle ilgili ilk öğrenmeniz gerekenlerden biri SQL injection. Hala uzmansorusu.com&#8216;da sorulan soruların ciddiye alınacak bir kısmında, üniversiteye gelen stajerlerde, hatta çalışma fırsatım olan arkadaşlarda bu konuda bir bilgisizlik var&#8230; Aslında bu blog&#8217;a başlarken ileri düzey konulara, framework&#8217;lere falan değineyim istemiştim ama pes ediyorum artık. Şuraya yazayım [...]]]></description>
			<content:encoded><![CDATA[<p>PHP&#8217;yi ya da web tabanlı herhangi bir yazılımı öğreniyorsanız güvenlikle ilgili ilk öğrenmeniz gerekenlerden biri SQL injection.</p>
<p>Hala <a href="http://www.uzmansorusu.com">uzmansorusu.com</a>&#8216;da sorulan soruların ciddiye alınacak bir kısmında, üniversiteye gelen stajerlerde, hatta çalışma fırsatım olan arkadaşlarda bu konuda bir bilgisizlik var&#8230;</p>
<p>Aslında bu blog&#8217;a başlarken ileri düzey konulara, framework&#8217;lere falan değineyim istemiştim ama pes ediyorum artık. Şuraya yazayım da en azından lazım olduğunda al oku işte diye adresini veririm :)</p>
<p><span id="more-508"></span></p>
<h2>SQL Injection Nedir?</h2>
<p>Türkçeye çevirirsek <strong>SQL&#8217;in içine zehir enjekte edilmesidir</strong> diyebiliriz. Örnek vermek gerekirse elimizde bir kullanici_detay.php dosyası olsun:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;select * from users where id=&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>satırını ele aldığımızda, $_GET['id']&#8216;nin bir sayı olduğunu farz ederiz ve kod düzgün çalışır. Bu sayfanın adresi de şöyle birşeydir</p>
<pre>http://www.huysuzadam.com/kullanici_detay.php?id=5</pre>
<p>Peki ben uyanıklık yapıp adres satırını şöyle değiştirirsem:</p>
<pre>http://www.huysuzadam.com/kullanici_detay.php?id=1 or 1=1</pre>
<p>Bu durumda sql cümlesi şöyle birşeye dönüşmüş olur:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> users <span style="color: #993333; font-weight: bold;">WHERE</span> id<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span></pre></div></div>

<p>1=1 önergesi her zaman doğru döndüreceği için tüm kullanıcıları listeletebilirim bu durumda&#8230;</p>
<h2>Ne Zararı Olur?</h2>
<p>Tüm kullanıcıları görse nee, görmese ne diyebilirsiniz. Peki bu güvenlik açığı ile neler yapılabilir?</p>
<p>Az önceki örneği değiştiriyorum, bu sefer biraz daha karışık işlere girelim:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$username</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'username'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$passwd</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'passwd'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;select * from users where username='<span style="color: #006699; font-weight: bold;">$username</span>' and passwd='<span style="color: #006699; font-weight: bold;">$passwd</span>' &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Bu sefer bir hacker olarak $_POST['username'] değişkenini yine uyanıklık yaparak aynen şöyle gönderiyorum:</p>
<pre>a' or 1=1 or 'b</pre>
<p>yerine koyduğumuzda sql&#8217;imiz şu hale gelmiş oluyor:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> users <span style="color: #993333; font-weight: bold;">WHERE</span> username<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'a'</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #ff0000;">'b'</span> <span style="color: #993333; font-weight: bold;">AND</span> passwd<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'asdf'</span></pre></div></div>

<p>Gördüğünüz gibi OR&#8217;lar sayesinden herhangi bir kullanıcı olarak girebiliriz. SQL&#8217;in son hali kolay okunsun diye ben böyle girdim ama biraz yaratıcılık kullanılarak daha kısa ya da daha farklı yaramazlıklar yapılabilir.</p>
<h2>Nasıl Önlememelisiniz : magic_quotes_gpc</h2>
<p>PHP&#8217;nin eski versiyonlarında magic quotes gibi bir ayarla SQL injection&#8217;a çözüm ürettiğini zannetti Zend firması. Aslında bu daha sonra çok baş ağrısı yaratacak bir karardı ve o yüzden de PHP6&#8242;da yanılmıyorsam tamamen kaldırılacak bu özellik.</p>
<h3>Magic Quotes şu şekilde çalışır:</h3>
<p>php.ini&#8217;den magic_quotes_gpc aktif edilirse PHP otomatik olarak tüm $_GET, $_POST ve $_COOKIE değişkenlerinin içindeki tırnak işaretlerini \&#8217; ve \&#8221; ile değiştirir. Bu durumda ikinci örneği ele alırsak sql şu hale gelmiş olur:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> users <span style="color: #993333; font-weight: bold;">WHERE</span> username<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'a<span style="color: #000099; font-weight: bold;">\'</span> or 1=1 or <span style="color: #000099; font-weight: bold;">\'</span>b'</span> <span style="color: #993333; font-weight: bold;">AND</span> passwd<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'asdf'</span></pre></div></div>

<p>Bu durumda \ işareti yanındaki karakteri &#8220;escape&#8221; eder, yani tek tırnak işaretinin tırnağı kapama görevine son verir. Böylece veritabanı hakkaten de adı <strong>a\&#8217; or 1=1 or \&#8217;b</strong> olan bir marslıyı (!) bulmaya çalışır.</p>
<p>Kırma girişimi başarısızlıkla sonuçlanır, dünya kurtulur.</p>
<p>Burada dikkat edilmesi gereken tek nokta, yazının başında verdiğimiz örnekteki gibi sayıları kontrol ederken de tırnak işareti kullanmamız gerekir.</p>
<p>Yani;</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;select * from users where id=&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>yerine</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;select * from users where id='&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;'&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>yazmamız gerekir.</p>
<p><span style="color: #ff0000; font-size: 14px;">Ancak sakın magic_quotes_gpc yönetimini kullanmayın!</span></p>
<p>Çünkü bu konuda iki büyük sorun var: Birincisi psikolojik olarak buna o kadar alışıyorsunuz ki sanki bu magic_quotes_gpc açıksa bir daha asla SQL injection yemezmişsiniz gibi geliyor. Sonra da biri gelip bu sefer de /* */ kullanarak SQL injection yapıyor. Ya da görünmez ASCII karakterleri ya da diğer muhtelif yöntemler.</p>
<p>(Not: Bu muhtelif yöntemleri burada tek tek yazmayacağım ki bu doküman bir &#8220;hacker&#8217;ın el kitabı&#8221;na dönüşmesin ;) )</p>
<p>İkinci büyük sorun da, hiç başınıza gelmeyecek zannetseniz de hosting değiştirme problemi. magic_quotes_gpc&#8217;ye güvenirken, bir anda bu ayarın kapalı duruma geldiğini düşünebiliyor musunuz? Kolay gerçekleşecek bir senaryo değil gibi gözükse de gayet olasıdır, tecrübeyle de sabittir!</p>
<p>3. daha önemsiz sorun ise, &#8220;Ozan&#8217;ın kalemi&#8221; gibi bir cümledeki tırnak işaretini de escape etmesi. Bu durumda veritabanına yazmadığınız durumlarda &#8220;strip_slashes&#8221; gibi bir işlem yapmanız gerekiyor ki bu da bazen inanılmaz can sıkıcı olabiliyor.</p>
<h2>SQL Injection Nasıl Önlenir?</h2>
<p>Gelelim sadede. Bunu yapmanın birkaç yöntemi var. Bana en makul gelenleri:</p>
<h3>mysql_real_escape_string</h3>
<p>Bu fonksiyon, değişkenlerin içindeki tüm zararlı karakterleri &#8220;escape&#8221; eder, yani güvenli hale getirir.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'username'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_real_escape_string</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'username'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'passwd'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_real_escape_string</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'passwd'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>şeklinde kullanılır.</p>
<p><strong>Avantajları:</strong></p>
<ol>
<li>Ekstra bir kütüphaneye falan gerek yok, doğrudan kullanılabilir.</li>
</ol>
<p><strong>Dezavantajları:</strong></p>
<ol>
<li> Yazması çok sıkıcı</li>
<li> MySQL&#8217;den başka veritabanı kullanırsanız ne olacak?</li>
</ol>
<h3>Bind etme yöntemi</h3>
<p>Aslında bunu mysql konutları ile yapmak da mümkün, ama zahmetli olduğu için bir database wrapper kullanarak yapılışını anlatacağım.</p>
<p>Bir database wrapper ya da PDO kullanılır. Örneğin Zend_Db kullanalım:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'/var/lib/ZendFramework/Zend/Db.php'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$db</span> <span style="color: #339933;">=</span> Zend_Db<span style="color: #339933;">::</span><span style="color: #004000;">factory</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Mysqli'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">'username'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'myuser'</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'password'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'mypass'</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'dbname'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'mydbname'</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'driver_options'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>MYSQLI_INIT_COMMAND <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'SET NAMES UTF8;'</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$user</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fetchRow</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;select * from users where id=?&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><strong>Avantajları:</strong></p>
<ol>
<li>Soru işaretinin yerine değişkenimiz güvenli bir şekilde yerleştirildi.</li>
<li>&#8220;fetchRow&#8221; metodu sayesinde sadece 1 satır çekilip $user&#8217;a eşitlendi. Dolayısıyla mysql_fetch_row vs. yazmanıza da gerek kalmadı.</li>
<li>MySQL sorguyu cache&#8217;leyebildi. Direkt değişkeni yazdığınızda veritabanı onu cache&#8217;leyemez.</li>
</ol>
<p><strong>Dezavantajı:</strong></p>
<ol>
<li>Yeni birşey öğrenmek ve uygulamak gerekiyor. Bu da aslında dezavantaj değil avantaj aslında ama anlayana ;)</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.huysuzadam.com/2011/02/13/sql-injection-nedir-nasil-onlenir/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Web Sitelerindeki En Yaygın Güvenlik Açıkları</title>
		<link>http://www.huysuzadam.com/2007/10/08/web-sitelerindeki-en-yaygin-guvenlik-aciklari/</link>
		<comments>http://www.huysuzadam.com/2007/10/08/web-sitelerindeki-en-yaygin-guvenlik-aciklari/#comments</comments>
		<pubDate>Sun, 07 Oct 2007 23:00:51 +0000</pubDate>
		<dc:creator>M.Ozan Hazer</dc:creator>
				<category><![CDATA[Genel]]></category>
		<category><![CDATA[Güvenlik]]></category>

		<guid isPermaLink="false">http://www.huysuzadam.com/2007/10/08/web-sitelerindeki-en-yaygin-guvenlik-aciklari/</guid>
		<description><![CDATA[En çok rastlanan güvenlik açıklarına bir göz atalım: SQL Injection SQL cümlesi içerisine parametre olarak gönderilen değişkenin saldırgan tarafından değiştirilerek gönderilmesiyle oluşan açıktır. Session Fixation O an siteye giriş yapmış ziyaretçinin session id&#8217;sini bir şekilde alarak ziyaretçinin aktif session&#8217;ından yararlanma felsefesine dayalı bir güvenlik açığıdır. Session Poisoning Programcının gönderilen parametreleri kontrolsüz bir şekilde session değişkenlerine [...]]]></description>
			<content:encoded><![CDATA[<p>En çok rastlanan güvenlik açıklarına bir göz atalım:</p>
<ol>
<li><strong>SQL Injection</strong><br />
SQL cümlesi içerisine parametre olarak gönderilen değişkenin saldırgan tarafından değiştirilerek gönderilmesiyle oluşan açıktır.</li>
<li><strong>Session Fixation</strong><br />
O an siteye giriş yapmış ziyaretçinin session id&#8217;sini bir şekilde alarak ziyaretçinin aktif session&#8217;ından yararlanma felsefesine dayalı bir güvenlik açığıdır.</li>
<li><strong>Session Poisoning</strong><br />
Programcının gönderilen parametreleri kontrolsüz bir şekilde session değişkenlerine ataması nedeniyle oluşan açıktır.</li>
<li><strong>XSS (Cross Site Scripting)</strong><br />
Saldırganın sayfaya bir açıktan yararlanarak javascript, css, html kodu yazabilmesi nedeniyle oluşan açıktır.</li>
<li><strong>XSRF (Cross Site Request Forgery)</strong><br />
Saldırganın o an siteye giriş yapmış ziyaretçiye farkında olmadan istediği aksiyonu yaptırması ile ilgili bir güvenlik açığıdır.</li>
<li><strong>RFI (Remote File Inclusion) ve LFI (Local File Inclusion) </strong><br />
Programcının gönderilen parametreleri kontrolsüz bir şekilde çalışan koda &#8220;include&#8221; etmesi nedeniyle oluşan bir güvenlik açığıdır.</li>
<li><strong>Referrer Spoofing</strong><br />
HTTP_REFERER ziyaretçinin bir önce ziyaret ettiği sayfayı tutan bir environment değişkenidir. Ancak bu değişken istemci tarafından gönderildiği için bu değişkene dayanarak yapılan güvenlik kontrolleri kolayca aşılabilir.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.huysuzadam.com/2007/10/08/web-sitelerindeki-en-yaygin-guvenlik-aciklari/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

