PHP SQL Injection Fonksiyonu
-
Selamlar,
2 ayrı fonksiyon yazdım birini get ettiğim id lerde birini get ettiğim stringlerde kullanıyorum. Sizce sql injection için yeterli mi yada yanlışlık ve eksiklik var mı öneride bulunabilir misiniz?
Bunu stringler için kullanıyorum
function fullstringfilter ( &$yazi ) { $danger_words = array("*","=","<",">",";","(",")","+","#","'","&","%","?","´","`","UNION","SELECT","WHERE","LIKE","FROM","UPDATE","INSERT","ORDER","GROUP","ALTER","ADD","MODIFY","RENAME",chr(39)); $replace_words = ""; $yazi = str_replace($danger_words, $replace_words, $yazi); $yazi = preg_replace( "'<script[^>]*>.*?</script>'si", '', $yazi ); $yazi = preg_replace( '/<a\s+.*?href="([^"]+)"[^>]*>([^<]+)<\/a>/is', '\2 (\1)', $yazi ); $yazi = preg_replace("[^À-ÿa-zA-Z0-9\\\-\.\,\:\s\r\t\n ]",'',$yazi); $yazi = preg_replace( '/<!--.+?-->/', '', $yazi ); $yazi = preg_replace( '/{.+?}/', '', $yazi ); $yazi = preg_replace( '/ /', '', $yazi ); $yazi = preg_replace( '/&/', '', $yazi ); $yazi = preg_replace( '/"/', '', $yazi ); $yazi = strip_tags( $yazi); $yazi = stripslashes( $yazi ); $yazi = htmlspecialchars( $yazi ); $yazi = mysql_real_escape_string( $yazi ); return $yazi; }Bunu ID ler için kullanıyorum:
function fullidfilter ( &$yazi ) { $danger_words = array("*","=","<",">",";","(",")","+","#","'","&","%","?","´","`","UNION","SELECT","WHERE","LIKE","FROM","UPDATE","INSERT","ORDER","GROUP","ALTER","ADD","MODIFY","RENAME",chr(39)); $replace_words = ""; $yazi = str_replace($danger_words, $replace_words, $yazi); $yazi = preg_replace( "'<script[^>]*>.*?</script>'si", '', $yazi ); $yazi = preg_replace( '/<a\s+.*?href="([^"]+)"[^>]*>([^<]+)<\/a>/is', '\2 (\1)', $yazi ); $yazi = preg_replace("[^À-ÿa-zA-Z0-9\\\-\.\,\:\s\r\t\n ]",'',$yazi); $yazi = preg_replace( '/<!--.+?-->/', '', $yazi ); $yazi = preg_replace( '/{.+?}/', '', $yazi ); $yazi = preg_replace( '/ /', '', $yazi ); $yazi = preg_replace( '/&/', '', $yazi ); $yazi = preg_replace( '/"/', '', $yazi ); $yazi = strip_tags( $yazi); $yazi = stripslashes( $yazi ); $yazi = htmlspecialchars( $yazi ); $yazi = mysql_real_escape_string( $yazi ); $yazi = intval( $yazi); return $yazi; } -
http://php.net/manual/tr/mysqli.quickstart.prepared-statements.php
gozatmani tavsiye ederim.
-
PDO prepare ile:
$birHazirSorgu = $birPDOObjesi->prepare("SELECT * FROM tablo WHERE id = ?");
$birHazirSorgu->execute( [$degisken] );
Şeklinde güvenliği hazır olarak oluşturulmuş oldukça hızlı bir eklenti yerine niye kendin yazmaya çalışıyorsun?
Ayrıca PHPnin klasik MySQL bağlantıları artık daha fazla geliştirilmeyecek. Yeni olarak MySQLi ve PDO devam edecek.
-
Yani bunun yerine;
$id = $_GET['id']; $query = mysql_query("SELECT * FROM uyeler WHERE uye_id = '{$id}'"); if ( mysql_affected_rows() ){ $row = mysql_fetch_assoc($query); print_r($row); }PDO ile Bunu kullan diyorsunuz
$id = $_GET['id']; $query = $pdo->query("SELECT * FROM uyeler WHERE uye_id = '{$id}'")->fetch(PDO::FETCH_ASSOC); if ( $query ){ print_r($query); }Ya da MYSQLi olarak şöyle yap diyorsunuz
$id = $_GET['id']; $query = mysqli_query("SELECT * FROM uyeler WHERE uye_id = '{$id}'"); if ( mysqli_affected_rows() ){ $row = mysqli_fetch_assoc($query); print_r($row); }Bu şekilde id olarak içeri aldığımız değişkene sql injection yapamazlar yani? Çünkü stackoverflow da yapılabileceği ile ilgili bir tartışma söz konusu buyrunuz:
Sizce?
Ayrıca İşin komik tarafı ben fonksiyon sormuşum... bu fonksiyon nasıl güzelleştirilebilir var mı öneriniz diye. PDO kullan deyip basit cevaplar verilip geçiştirilmişim. Fonksiyon namına cevap yok. Belki 2000 yılında yaptığım bir sistemde kullanacağım hiç düşünen olmamış. Ah gençlik ah. :)
PLaXToR tarafından 02/Ağu/16 09:55 tarihinde düzenlenmiştir -
prepare methodlarında açıkların olabileceğini okumuştum. Sende bir link vermişsin ancak sürekli yenilenen bir alt yapı var sonuçta.
Her ne olursa olsun id leri muhakkak integer olup olmadığını kontrol etmeni öneririm.
Ayrıca mysql_real_escape_String bir çok sunucuda hata veriyor tarihi geçti.
Birde süzgece alırken tüm karakterleri ufak yap ve danger_words değişkenlerinide ufak yap. iNsErt Yazan kişi sızmasın.
Ayrıca her sayfada bir referer kontrolü yaparak, yada random bir değişken basarak bir sonraki sayfanın çalışmasını sağlarsan güvenliğin biraz daha artmış olacaktır.
-
Sonunda fonksiyon için önerisi olan birisi... Çok teşekkür ederim @Erdem kardeşim :)
-
prepare metodu 100% güvenlik sağlamıyor olması lazım.
mysql öldü zaten, o yüzden burdaki bazı metotlardan hatalar alabilirsin hocam.
-
PDO varken kendi fonksiyonlarını yazman gereksiz söylendiği gibi. Zaten fonksiyonlar bu haliyle güvensiz. str_replace fonksiyonu büyük-küçük harf duyarlılığına sahip, dolayısıyla saldırgan "INSERT" yerine "inserT" yazdığında fonksiyon gerekli filtrelemeyi yapmayacak ve sql sorgusu çalışacaktır. Örneğini şurada "output" kısmında görebilirsin: https://eval.in/616580
Bunu aşmak için tüm büyük-küçük harf olasılıklarını dahil eden bir yöntem geliştirmen lazım, bu şekilde sağlıksız. Ayrıca o regex'ler de sanırım XSS'leri engellemek için yazılmış fakat bunu da HTML'yi output ederken konteksine uygun şekilde filtrelemen lazım.
mysql_real_escape_string fonksiyonu da tedavülden kalktı: http://php.net/manual/tr/function.mysql-real-escape-string.php
Arkadaşların bahsettiği PDO prepare metodunun kullanımına verdiğin örnek yanlış.
$id = $_GET['id'];
$query = $pdo->query("SELECT * FROM uyeler WHERE uye_id = '{$id}'")->fetch(PDO::FETCH_ASSOC);
if ( $query ){
print_r($query);
}Burada sorgu sql injection'a açık. Değişkenin geleceği yeri PDO'ya bildirdiğinde gerekli korumayı sağlar. Şu şekilde kullanılması gerekiyor:
$pdo = ..;ozdemyr tarafından 03/Ağu/16 11:55 tarihinde düzenlenmiştir
$sql = "SELECT * FROM uyeler WHERE uye_id = :id";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->execute();
$results = $stmt->fetchAll(); -
ID'ler için bunu da kullanabilirsin hocam
function sayi($int) { $int = filter_var($int, FILTER_SANITIZE_NUMBER_INT); $int = str_replace("+","",$int); $int = str_replace("-","",$int); return $int; }
lepusmorris tarafından 04/Ağu/16 19:45 tarihinde düzenlenmiştir
