Hoşgeldin Misafir

PHP PDO Kullanarak Güvenlik Açıklarını Kapatma|Kod Yapısı Açıkları

Reisci

Reisci

Yerli Ve Milli Hacker
11 Mar 2020
6,569 Mesaj

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
Merhaba arkadaşlar

Öncelikle güvenlik için veritabanı bağlantısında pdo kullanmaya özen gösterin. Çünkü sql açıklarının baş düşmanı prepare'dır.

Örnek olursa



PHP:

$stmt = $conn->prepare("INSERT INTO personel (adi, soyadi, dogumtarihi) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $adi, $soyadi, $dogumtarihi);


İkinci olarak post edilen verileri kesinlikle html kodlardan ayırmalıyız. onun içinde post edilen veriyi bazı kod kutularının içinde kullanmalıyız.
Nedeniyse formdan gönderilen verilere html tagları eklenince çalışmasıdır. ancak bir kaç kod ile bunu önleyebiliriz.
yanlış kullanım

PHP:

<?php
if($_POST)
{
$isim = $_POST['formdangelenisim'];//Yanlış kullanım budur

}else{}

?>

Doğru kullanım ise

PHP:
<?php
if($_POST){
$isim = htmlspecialchars(strip_tags(addslashes(stripslashes($_POST["formdangelenisim"]))));
}else{

}

?>


Diğer dikkat edilmesi gereken konu get ile alınan id sayfalandırmasıdır.
Örneğin
veritabanından bir bilgi çektiniz ve silmek için butona bastığınızda sil.php sayfasına id değeri yollayacaktır.


HTML:


<a href="sil.php?id=<?php echo $id;?>">Sil</a>

burada yollanan veriyi
$_GET ile çekince sessionu vermiş olmalısınız. Yoksa admin dışındaki kişilerde veritabanını silebilir. Ve yollanan verinin numara olduğunu kontrol ettirmelisiniz yani sil.php sayfasında kodlama yapısı şöyle olmalıdır.

PHP:

session_start();//eğer id admin tarafından girilmediyse giriş sayfasına yönlendiriyoruz
if(!isset($_SESSION["login"])){

header("Location:index.php");
}else{

$cekilen_id=htmlspecialchars(strip_tags(addslashes(stripslashes($_GET["id"]))));//tüm html kodlardan ayırıyoruz.


if (!is_numeric($cekilen_id)) {//burada gelen id nin sayı olup olmadığı test edildi
header("location:index.php");
}else{

include("inc/veritabanı.php");

$sil =$db->exec("DELETE FROM genel WHERE id=$cekilen_id");
$db=null;
header("location:index.php");
}
}




ve her zaman veritabanıyla işimiz bittiğinde $db=null; ile bitirmeliyiz.
sunucumuzda resim adındaki bir klasör olsun.
bu klasörü bir hacker bulursa ve biz htacces ile veya başka bir şekilde kapatmadıysak içindeki dosyaların hepsini ve isimlerini görebilir bunu kapatmak için her klasörün içine içi boş olan bir index.php yapıştırabilirsiniz böylelikle urlden siteadı.com/resim yazılınca boş bir sayfa gözükür.
Verilerinizi veritabanında şifrelenmiş şekilde tutmalısınız.
yani verimiz $sifre olsun bunu

PHP:
sha1(md5($sifre));


haliyle veya tam tersi bir şekilde kullanın. Mumkunse tuzlama yöntemi kullanın.
Formdan bir veri eklerken bunun kontrolünü html ile değil php ile yapın!
örneğin yanlış kod

HTML:

<form>
<input type="email" name="mail" required/>
<br>
<button type="submit">submit</button>
</form>

buradaki kontrolü öğeyi denetle yapıp type=email kısmındaki email i silip text yazarak iptal edebilirler. Bu yüzden phpdeki kontrolü aşağıdaki gibi yapıyoruz.


PHP:

<?php
if($_POST){
$posta=$_POST['mail'];
if(!filter_var($posta,FILTER_VALIDATE_EMAIL)){
echo'eposta yanlış';
}else{
echo'eposta doğru';
}
}


?>