SQL Injection' Dan Nasıl Kaçabilirim ?
-
public function carsFilter($type, $sort_by, $brand, $fuel_type, $transmission, $car_type, $price_range, $build_year_range, $search_key, $between_date) { $sql_search_key = ''; if (!empty($search_key)) { $sql_search_key = "AND cars.brand LIKE '%".$search_key."%'"; } $sql_brand = ''; if (!empty($brand)) { $brands = implode("|", $brand); $sql_brand = "AND cars.brand REGEXP '".$brands."'"; } $sql_fuel_type = ""; if (!empty($fuel_type)) { $fuel_types = implode("|", $fuel_type); $sql_fuel_type = "AND cars.fuel_type REGEXP '".$fuel_types."'"; } $sql_transmission = ""; if (!empty($transmission)) { $transmissions = implode("|", $transmission); $sql_transmission = "AND cars.transmission REGEXP '".$transmissions."'"; } $sql_car_type = ""; if (!empty($car_type)) { $car_types = implode("|", $car_type); $sql_car_type = "AND cars.car_type REGEXP '".$car_type."'"; } $sql_between_price = ""; if ($price_range != "") { $temp_prices = explode(";", $price_range); $sql_between_price = "AND cars.starting_price BETWEEN '" . $temp_prices[0] . "' AND '" . $temp_prices[1] . "'"; } $sql_between_build_year = ""; if ($build_year_range != "") { $temp_build_years = explode(";", $build_year_range); $sql_between_build_year = "AND cars.build_year BETWEEN '" . $temp_build_years[0] . "' AND '" . $temp_build_years[1] . "'"; } $sql_between_date = ""; if ($between_date != "") { $temp_dates = explode(";", $between_date); $first_date = date('Y-m-d H:i:s', strtotime($temp_dates[0] . " 00:00:00")); $last_date = date('Y-m-d H:i:s', strtotime($temp_dates[1] . " 23:59:59")); $sql_between_date = "AND cars.bid_date BETWEEN '" . $first_date . "' AND '" . $last_date . "'"; } $sql = "SELECT car_images.filename, car_images.ext, cars.ihaleden_id, cars.brand, cars.model, cars.plate, cars.transmission, cars.fuel_type, cars.city, cars.district, cars.build_year, cars.starting_price, DATE_FORMAT(bid_date, '%d.%m.%Y %H:%i') AS bid_date, cars.bid_url FROM cars LEFT JOIN car_images ON cars.preview_image_id = car_images.id WHERE cars.type = ? AND cars.bid_date >= NOW() AND cars.ad_state = ? AND cars.starting_price > 0 ". $sql_search_key ." ". $sql_brand ." ". $sql_fuel_type ." ". $sql_transmission ." ". $sql_car_type ." ". $sql_between_price." ". $sql_between_build_year." ". $sql_between_date ." ORDER BY " . $sort_by . " ASC"; $query = $this->db->prepare($sql); $query->execute(array($type, "1")); if ($query->rowCount() > 0) return $query->fetchAll(); return false; }Böyle bir arama fonksiyonu yazdım fakat parametreleri prepare metoduna sokamadım. Çünkü ne geleceğini, kaç tane geleceğini bilmiyorum
Hal böyle olunca da sql injection' a açık oldu sanki :/
Nasıl önüne geçebilirim ?
-
Parametreleri execute içine array() ile değil bindParam ile teker teker verin PDO'ya. SQL sorgusu koşullara göre değişecekse bindParam'ları da aynı koşullara uygun hale getirmelisiniz.
Örneğin
if (!empty($search_key)) { $sql_search_key = "AND cars.brand LIKE '%".$search_key."%'"; } $sql = "SELECT car_images.filename, car_images.ext, cars.ihaleden_id, cars.brand, cars.model, cars.plate, cars.transmission, cars.fuel_type, cars.city, cars.district, cars.build_year, cars.starting_price, DATE_FORMAT(bid_date, '%d.%m.%Y %H:%i') AS bid_date, cars.bid_url FROM cars LEFT JOIN car_images ON cars.preview_image_id = car_images.id WHERE cars.type = ? AND cars.bid_date >= NOW() AND cars.ad_state = ? AND cars.starting_price > 0 " $sql_search_key " // .. ORDER BY " . $sort_by . " ASC";şeklinde bir ifade varsa bunu
if (!empty($search_key)) { $sql_search_key = "AND cars.brand LIKE ':search_key'"; } $sql = ..;
$query = $this->db->prepare($sql);if (!empty($search_key)) { $query->bindParam(':search_key', "%$search_key%", PDO::PARAM_STR); }şeklinde inşa etmeniz gerekiyor. Bu sayede aynı koşula bağlı olarak hazırlanan sorguya bi parametre dahil etmiş olursunuz.
Uygulama sürekli bu şekilde karışık sorgular içeriyorsa bi Query Builder lazım.
ozdemyr tarafından 23/Ağu/16 01:17 tarihinde düzenlenmiştir -
@ozdemyr teşekkür ederim yardımınız için, sadece burada filtreleme mevcut.
diğer yerlerde de karışık sorgular var ama search olayı yok.
-
-
