PHP: достаточно ли безопасна очистка filter_var? - PullRequest
4 голосов
/ 05 января 2010

У меня есть скрипт PHP со следующей строкой:

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

Это достаточно безопасно? Как бы вы улучшили этот код?

Ответы [ 3 ]

5 голосов
/ 05 января 2010

Это безопасно для этого случая, но для более общего подхода я бы предпочел использовать mysql_real_escape_string в сочетании с приведением типа:

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

В худшем случае, это приведет к 0 и ускорит также весь злонамеренный ввод. mysql_real_escape_string может использоваться для всех видов данных, чтобы сделать их безопасными для запросов, что делает его наиболее универсальным из всех функций по эвакуации / санации.

Не вдаваясь в использование подготовленных операторов, вы можете использовать sprintf для создания SQL-кода и автоматической обработки приведения типов:

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

Подробнее о синтаксисе см. Запись sprintf в руководстве по PHP.

Это становится еще проще, если вы используете array_map для экранирования всех $_GET и $_POST переменных, тогда вы можете использовать их как:

$_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']);
1 голос
/ 05 января 2010

Я обычно просто использую intval :

$product_id = intval($_GET['id']);
$query = "SELECT * FROM products WHERE product_id='" . $product_id . "'";
0 голосов
/ 21 февраля 2017

Может быть, это работает для вас ...!

$query=query("SELECT * FROM products WHERE product_id= ". escape_string($_GET['id']) . " ");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...