Merih Forum Programlama ve yazılım algoritmalar php PHP’de SQL Injection Koruması

Dota 2. MMR sıralamada Türkler

Tr bayraklı Neqroman sadece listeye 163. sıradan girebildi

ABD'nin terörist sevgisi

ABD'nin, terör örgütü PYD/PKK’ya DEAŞ ile mücadele adı altında askeri sevkiyatları sürüyor.

DOTA2 - 2017 THE INTERNATIONAL CHAMPIONSHIP

2017 yazında düzenlenen turnuvada Team Liquid şampiyon oldu

  • Toplam: 0 Oy - Ortalama: 0
  • 1
  • 2
  • 3
  • 4
  • 5
PHP’de SQL Injection Koruması

 
#1

Bilindiği üzere php ile en çok kullanılan veritabanı MySQL’dir. Nedeni hem ücretsiz olması hem de yapacağınız projelerin yükünü kaldırabilir olmasıdır. PHP ile geliştirilen bir çok projede girdilerin kontrol edilmemesinden kaynaklanan SQL Injection açığı görülür. Bu yazıda PHP ile SQL Injection Koruma yöntemlerini anlatacağız.
Örnek Olarak Sorgumuz;
SELECT * FROM user WHERE username=’ahmet’ AND password=’123456’
Şeklinde bir sorgumuz var. Biz burada password değerini get ile aldığımızı varsayalım. Normalde post ile alınır ancak dersi daha iyi kavramak açısından böyle yaptım.
Alıntı:<?php
mysql_connect(’localhost’,’root’,’’);
mysql_select_db(’veritabani’);
mysql_set_charset(’utf8’);
$query = mysql_query(“SELECT * FROM user WHERE username=’”.$_GET[’username’].”’ AND password=’”.$_GET[’password’].”’”);
$say = mysql_num_rows($query);
if($say!=0){
$_SESSION[’login’]=’on’;
}
?>


Böyle düşünelim kullanıcı adı ve şifreyi alıp veritabanından kontrol ettiriyor eşleşen var ise login session on oluyor. Şimdi biz bu verileri direk alırsak aşılabilir vaziyette oluyor. Nasıl mı? Login.php olarak kaydedelim yukarıdaki sayfayı.
Alıntı:localhost/login.php?username=’ or username!=’&password=’ or password!=’
Olarak girdiğimiz zaman login olmuş olacağız. Sorgumuz şu hale gelmiş olacak.
Alıntı:SELECT * FROM user WHERE username = ’’ OR username != ’’ AND userpassword = ’’ OR userpassword != ’’
Peki biz nasıl olurda bunun önlemini alırız? Aslında çok basit. WHERE, yani sorgumuz koşullu bölümlerinde şu fonksiyonu kullanacağız.
Alıntı:mysql_real_escape_string()
Sorgumuzun güvenli halde çalışması için,
Alıntı:“SELECT * FROM user WHERE username=’”.mysql_real_escape_string($_GET[’username’]).”’ AND password=’”.mysql_real_escape_string($_GET[’password’]).”’”
Şeklinde olması gerekmektedir. Kısacası SQL injection için alabileceğimiz önlemimiz budur. Bu aşılabilir mi derseniz bilindik yollarla test ettim aşılmıyor. Ancak farklı yolları varmıdır bilmiyorum.
Şimdi veritabanımıza insert ettiğimiz verilere geçelim. Bunları olduğu gibi kaydedersek ekrana basıldığında sayfamızın başka bir sayfaya yönlendirildiğini görebiliriz. Ya da tam sayfa hacked yazılı bir index? Veya bir downloader koyup millete logger bulaştırabilir. Peki biz bunu nasıl engelleriz? Bunu iki şekilde yapabiliriz.
1. INSERT edilecek veriyle oynarız.
2. INSERT eldilen veriyi ellemeyiz ekrana yazacağımız veriyle oynarız.
Peki nasıl?
Bunun için karşı taraf ne yazarsa yazsın kodları çalıştırmadan ekrana basmayı sağlayan fonksiyon htmlentities() fonksiyonumuzdur. Örnek olarak,
test.php
Alıntı:<?php
echo $_GET[’veri’];
?>
Şimdi localhost/test.php?veri=<style> body{background:black;} </style> bunu adres çubuğunda çalıştıralım. Arka plan simsiyah oldu. Tabi bunu veritabanından çektiğini varsayalım. GET ile yapmamın sebebi daha çabuk kavranması için. Bir de şöyle deneyelim.
Alıntı:<?php
echo htmlentities($_GET[’veri’]);
?>
Burada ekrana yazı olarak basacaktır. Herhangi bir kod çalışması söz konusu olmayacaktır. Biz istersek bunu insert edeceğimiz verilerde uygulayabiliriz ya da ekrana basarken uygulayabiliriz. Tabi dikkat edilmesi gereken bir husus var bu noktada. Sayfamızda karakter kodlaması olarak utf-8 kullandığımızı varsayalım.
Alıntı:<?php
echo htmlentities($_GET[’veri’],ENT_QUOTES,’UTF-8’);
?>
Şeklinde kullanıyoruz. Burada Ent_quotes -> çift ve tek tırnakları dönüştür manasında kullanılır. Diğer taraftan utf-8 karakter kodlamasını dönüştürür. Desteklenene karakter listesi aşağıdadır.
ISO-8859-1,ISO-8859-15,UTF-8,KOI8-R,cp866,cp1252,cp1251,BIG5,GB2312,BIG5-HKSCS,Shift_JIS,EUC-JP
Evet verileri rahatlıkla veritabanına kaydedip ekrana basabiliyor ve SQL injectiondan korunmuş oluyoruz.
Bir de not düşeyim. Diyelim veritabanına verileri htmlentities() fonksiyonuyla çevirip kayıt ettik. Panelden düzenleyeceğiz ve kodları text editöre aktaracağız. Aktarırken kodları görmek için html_entity_decode() fonksiyonunu kullanmayı unutmayalım.




Ara
Cevapla


[-]
Hızlı Cevap

İnsan Doğrulama:
Aşağıda görünen onay kutusunu işaretleyiniz. Bu işlem otomatik spam kayıtları önlemek için kullanılır.

Digg   Delicious   Reddit   Facebook   Twitter   StumbleUpon  


Konuyu Okuyanlar:
1 Ziyaretçi

   
Türkçe Çeviri: MCTR, Forum Yazılımı: MyBB, © 2002-2018 MyBB Group.  



Merih Forum® bilgi paylaşım platformu. 2015-2017 Tüm hakları saklıdır.