Нужно ли дезинфицировать вход при использовании подготовленных запросов PHP / MySQL? - PullRequest
9 голосов
/ 20 января 2011

Учитывая следующий фрагмент кода, нужно ли мне бежать и дезинфицировать $city?

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$city = "Amersfoort";

/* create a prepared statement */
if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {

    /* bind parameters for markers */
    $stmt->bind_param("s", $city);

    /* execute query */
    $stmt->execute();

    /* bind result variables */
    $stmt->bind_result($district);

    /* fetch value */
    $stmt->fetch();

    printf("%s is in district %s\n", $city, $district);

    /* close statement */
    $stmt->close();
}

/* close connection */
$mysqli->close();
?>

Нужно ли дезинфицировать входные данные при использовании подготовленных запросов?

Ответы [ 4 ]

13 голосов
/ 20 января 2011

Нет, вам не нужно избегать его или продезинфицировать для защиты от инъекций. Для других вещей, относящихся к конкретному приложению, вы можете очистить его.

Некоторое время назад у меня был похожий вопрос:

mysqli_stmt_bind_param SQL-инъекция

9 голосов
/ 20 января 2011

@ Гэри: Вы скопировали этот фрагмент кода прямо из руководства на php.net о mysqli :: prepare. На этой же странице следующий текст:

"Цель подготовленных операторов - не включать данные в ваши операторы SQL. Включать их в ваши операторы SQL НЕ безопасно. Всегда использовать подготовленные операторы. Их удобнее использовать (код легче читать) и они не подвержены SQL инъекции ".

Какой ответ на твой вопрос;)

1 голос
/ 10 ноября 2015

Я понимаю, что этот вопрос очень старый.Я наткнулся на него, когда искал ту же информацию сам.Я бы прокомментировал ответ Сандера, но у меня пока недостаточно репутации, чтобы комментировать.

Сандер говорит, что вам не нужно проводить санитарную обработку, но на http://www.w3schools.com/php/php_mysql_prepared_statements.asp (и я понимаю, что w3schools не 't всегда всегда актуальный и точный источник информации, но я нахожу, что это объясняется разумным и простым для понимания способом), они говорят: «Примечание: если мы хотим вставить какие-либо данные из внешних источников (например, пользовательский ввод), очень важно, чтобы данные были санированы и проверены. "

Так что, похоже, при использовании форм и приеме пользовательского ввода вы должны санировать.

1 голос
/ 20 января 2011

Дополнительно.Кроме того.

Подготовленные государственные деятели, при правильном использовании, почти полностью устраняют проблемы SQL-инъекций.Но вы все равно должны отформатировать / очистить входные данные, где это уместно.Очистка входных данных не является функцией безопасности, но рекомендуется для надежности и удобства использования.В случае вашего $ city вы можете удалить все несловарные символы:

$city = trim(preg_replace("/[^\w-]+/", " ", $city));

Что опять же: не заменяет экранирование базы данных или подготовленные операторы, но обеспечивает согласованность данных для работы.

...