Php açık kontrolü
Arkadaşlar phpde yeniyim açıklarıdır vs çok bilgim yok. Aşağıdaki kodda siteme kötü niyetli kişiler tarafından zarar verilmesine sebeb olacak bir açık gibi bir şey var mıdır? Bilgili arkadaşlar yardımcı olabilir mi?
<?php
$sql = $db->query("SELECT * FROM sonuclar WHERE baslik or aciklama or etiket LIKE '%".$word."%' LIMIT 7");
if ($sql->num_rows) {
echo '<br>';
echo '<a id="sonuc">Şuan da "'.$word.'" sözcüğüyle ilgili arama sonuçlarını görüyorsunuz.</a>';
while ($row = $sql->fetch_assoc())
?>
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (11)
VERİ TABANI BAĞLANTISI
$DB_HOST = "localhost";
$DB_NAME = "veritabanı adı";
$DB_USER = "root";
$DB_PASS = "şifre";
try{
$db = new PDO("mysql:host={$DB_HOST};dbname={$DB_NAME}",$DB_USER,$DB_PASS);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->query("SET CHARACTER SET utf8mb4");
$db->exec("SET CHARACTER SET utf8mb4");
$db->exec("SET NAMES 'utf8mb4'");
}
catch(PDOException $e){
echo "Bağlantı Hatası: " . $e->getMessage();
}
date_default_timezone_set('Europe/Istanbul');
ini_set("display_errors", 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
set_time_limit(0);
buda kullanman gereken sorgu
$word=strip_tags($_POST['deger']); // strip_tags ve turvlerını kullanabılrısın html temızleme ıcın
$sql = $db->prepare("SELECT * FROM sonuclar WHERE baslik or aciklama or etiket LIKE ? LIMIT 7");
$sql->execute(["%$word%"])
if ($sql->rowCount()) {
echo '<br>';
echo '<a id="sonuc">Şuan da "'.strip_tags($word).'" sözcüğüyle ilgili arama sonuçlarını görüyorsunuz.</a>';
while ($row = $sql->FETCH(PDO::FETCH_ASSOC)){
}
}else{
echo "Kayıt yok";
}
Sorun değil hocam.
İlk hata için
$_GET["word"]
içindeki wordü Parametre Aldığınız Değer Yani
deneme.com/deneme?word=deneme
olan değerdir.
Eğer Olmaz ise
İkinci Hata İçin
$sql = $db->prepare("SELECT * FROM sonuclar WHERE baslik or aciklama or etiket LIKE '% :word %' LIMIT 7");
böyle denermisiniz hocam büyük ihtimal birleşik olduğu için :word% diye saymış olabilir.
Üçüncü hata için
if ($sql->num_rows) {
a çevirirseniz olacaktır diye düşünüyorum.
Hocam sabah sabah tekrar rahatsız ediyorum kusura bakmayın ama sizinki gibi yaptım aşağıdaki şekilde ve ekrana çıkan hatalar şunlar ve yine benim bilgimi aşıyor :/
Notice: Undefined index: word in C:xampphtdocsarama.php on line 31
Warning: mysqli_stmt::execute() expects exactly 0 parameters, 1 given in C:xampphtdocsarama.php on line 35
Fatal error: Uncaught Error: Call to undefined method mysqli_stmt::rowCount() in C:xampphtdocsarama.php:37 Stack trace: #0 {main} thrown in C:xampphtdocsarama.php on line 37
<?php
$word = strip_tags(htmlspecialchars(trim($_GET["word"]), ENT_QUOTES));
$sql = $db->prepare("SELECT * FROM sonuclar WHERE baslik or aciklama or etiket LIKE '%:word%' LIMIT 7");
$sql->execute([":word" => $word]);
if ($sql->rowCount() > 0) {
echo '<br>';
echo '<a id="sonuc">Şuan da "'.$word.'" sözcüğüyle ilgili arama sonuçlarını görüyorsunuz.</a>';
while ($row = $sql->fetch_assoc())
?>
Hocam şöyle de yapabilirsiniz.
$word = strip_tags(htmlspecialchars(trim($_GET["word"]), ENT_QUOTES));
<?php
/*
strip_tags Html etiketlerini texte dönüştürür. Örnek:' Bu Bir Link ' => ' <a href="#">Bu Bir Link</a> '
htmlspecialchars Yazıyı HTML Symbollerine dönüştürür.
trim Sağ ve soldan boşlukları siler.
*/
$word = strip_tags(htmlspecialchars(trim($word), ENT_QUOTES));
/* Böyle kullanmanız daha güvenli olacaktır çünkü db burda derliyor sen orda direkt yazıyı
koyarsan derlemeden sql injection ile yorum satırı yapıp bilgilerine erişebilirler. */
$sql = $db->prepare("SELECT * FROM sonuclar WHERE baslik or aciklama or etiket LIKE '%:word%' LIMIT 7");
$sql->execute([":word" => $word]);
/* Bunun bi özelliği yok sütün sayısı 0 dan büyükse işte :P*/
if ($sql->rowCount() > 0) {
echo '<br>';
echo '<a id="sonuc">Şuan da "'.$word.'" sözcüğüyle ilgili arama sonuçlarını görüyorsunuz.</a>';
while ($row = $sql->fetch_assoc())
?>
<?php
$word = htmlspecialchars(trim($word)); // Tek kelime ise bunu
$word = htmlspecialchars($word)); // Birden fazla kelime ise bunu kullanabilirsin.
$sql = $db->query("SELECT * FROM sonuclar WHERE baslik or aciklama or etiket LIKE '%".$word."%' LIMIT 7");
if ($sql->num_rows) {
echo '<br>';
echo '<a id="sonuc">Şuan da "'.$word.'" sözcüğüyle ilgili arama sonuçlarını görüyorsunuz.</a>';
while ($row = $sql->fetch_assoc())
?>