PHP: Yeterince güvenli filter_var sanitization?

2 Cevap php

Ben aşağıdaki satır ile bir PHP komut dosyası var:

$query = "SELECT * FROM products WHERE product_id='" . filter_var($_GET[id], FILTER_SANITIZE_NUMBER_INT) . "'";

Bu yeterince güvenli mi? Nasıl bu kod geliştirmek istiyorsunuz?

2 Cevap

O durumda güvenli, ancak daha genel bir yaklaşım için, ben değil türü döküm ile birlikte mysql_real_escape_string kullanmak istiyorum:

$query = "SELECT * FROM products WHERE product_id='" . (int)mysql_real_escape_string($_GET['id']) . "'";

En kötü durumda, bir 0 neden olur ve aynı zamanda tüm kötü amaçlı giriş kaçış olacaktır. mysql_real_escape_string tüm kaçış / sanitasyon fonksiyonlarının çok yönlü yapar sorguları için güvenli hale getirmek için her türlü veri üzerinde kullanılabilir.

Kadar hazırlanmış deyimleri kullanarak gibi gitmeden, size SQL oluşturmak için sprintf'i kullanabilir ve otomatik tip döküm işlemek için:

$query = sprintf("SELECT * FROM products WHERE product_id = '%d'", mysql_real_escape_string($_GET['id']));

Sözdizimi için PHP manuel sprintf girişine bakın.

Olduğu gibi tüm $_GET ve $_POST değişkenleri kaçmak için array_map kullanıyorsanız bile basit alır, sonra onları kullanabilirsiniz:

$_GET = array_map('mysql_real_escape_string', $_GET);
$_POST = array_map('mysql_real_escape_string', $_POST);

$query = sprintf("SELECT * FROM products WHERE product_id = '%d'", $_GET['id']);

Ben genellikle sadece kullanmak intval:

$product_id = intval($_GET['id']);
$query = "SELECT * FROM products WHERE product_id='" . $product_id . "'";