PDO ifadeleri nasıl güvenli hazırlanmış olan

4 Cevap php

PDO sizin için tüm öncelemeli / güvenliği yok, anlıyorum gibi, çok uzun zaman önce tablolarını hazırlamıştır, ve kullanmaya başladı.

Örneğin, ['title'] $ _POST varsayarak bir form alanı olduğunu.

$title = $_POST['title'];
$query = "insert into blog(userID, title) values (?, ?)"
$st = $sql->prepare($query);
$st->bindParam(1, $_SESSION['user']['userID'], PDO::PARAM_INT);
$st->bindParam(2, $title);
$st->execute();

Bu gerçekten güvenli mi? Ben başka bir şey yapmak zorunda mı? i dikkate almak başka ne var?

Teşekkürler.

4 Cevap

Parametre değeri sorgu dizesi yansıtılmadan asla çünkü Açıkçası, aslında hiçbir ihtiyaç öncelenimin var.

Sorgu parametreleri çalışma yolu prepare() çağrıldığında sorgu veritabanı sunucusuna gönderilir ve execute() çağrıldığında parametre değerleri, daha sonra gönderilmek olmasıdır. Böylece sorgunun metinsel formda ayrı tutulur. SQL enjeksiyon için bir fırsattır (PDO::ATTR_EMULATE_PREPARES false olması koşuluyla) vardır asla.

Yani evet, sorgu parametreleri güvenlik açığı bu formu önlemek için yardımcı.

Herhangi bir güvenlik açığına karşı% 100 dayanıklı mı? Hayır, elbette değil. Bildiğiniz gibi, bir sorgu parametresi, yalnızca bir SQL ifadesindeki bir tek değişmez değer gerçekleşir. Örneğin bir değerler listesi için tek bir parametre yerine, yapamaz:

SELECT * FROM blog WHERE userid IN ( ? );

Siz tablo veya kolon isimleri dinamik hale getirmek için bir parametre kullanamazsınız:

SELECT * FROM blog ORDER BY ?;

SQL sözdizimi başka bir türü için bir parametre kullanamazsınız:

SELECT EXTRACT( ? FROM datetime_column) AS variable_datetime_element FROM blog;

Yani önce prepare() çağrı, bir dize olarak sorgu işlemek zorunda epeyce durumlar vardır. Bu durumda, yine SQL enjeksiyon önlemek için dikkatli bir şekilde kod yazmak gerekir.

Bu, SQL enjeksiyon güvenli.

Bu güvenli olmayan bir kaç şey:

  • Denial of service (oluşturulacak satırların aşırı miktarda birikimine neden)
  • Cross-site scripting saldırıları (başlık hiç başka bir kullanıcıya geri yankılandı ise)

Güvenlik sadece SQL enjeksiyon önlemede daha fazladır.

SQL Enjeksiyon ile ilgili, ben size PDO :: PARAM_INT gibi sabitleri kullanın, eğer özel o alabilirsiniz güvenli olduğuna inanıyorum.

XSS belirtildiği gibi görünce, ben http://www.phpclasses.org/browse/package/2189.html XSS saldırıları önlemek için böyle bu girdi temizleme sınıf gibi şeyleri kullanarak bakmak için de iyi olduğunu düşünüyorum