Фильтрация пользовательского ввода - PullRequest
5 голосов
/ 11 мая 2011

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

Данные, отправленные через форму, которая будет использоваться в запросе MySQL:

function clean($field, $link)
{
    return mysql_real_escape_string($field, $link);
}

Данные, отправленные через форму, которая будет отображаться обратно в HTML /Страница PHP или электронная почта:

function output_html($value)
{
    return stripslashes(htmlspecialchars($value));
}

Данные, отображаемые из базы данных:

function output_db($value)
{
    return stripslashes($value);
}

Достаточно ли этого для моих нужд?Есть что-то, что я не рассматриваю?

Спасибо!

Ответы [ 5 ]

6 голосов
/ 11 мая 2011

Используйте mysql_real_escape_string() при вставке строк в запросы SQL, независимо от того, откуда поступает ввод.

Используйте htmlspecialchars() или htmlentities() при вставке строк в код HTML, независимо от того, откуда поступает ввод.

Используйте urlencode() при вставке значений в строку запроса URL-адреса, независимо от того, откуда они берутся.

Если эти данные получены от пользователя, то вам определенно следует сделать этовещи, потому что есть вероятность, что пользователь пытается делать плохие вещи.Но в сторону безопасности - что, если вы хотите вставить допустимую строку в SQL-запрос, и в этой строке окажется символ одинарной кавычки?Вы все еще должны избежать этого.

2 голосов
/ 11 мая 2011

Когда вы вставляете данные в базу данных SQL, вам нужно избегать их, чтобы предотвратить инъекции SQL, и mysql_real_escape_string() - это то, что нужно использовать для этого в mysql. Вы должны помнить, чтобы использовать это для всего, хотя, так что это подвержено ошибкам. Вместо этого вы должны использовать что-то вроде PDO, которое автоматически экранирует каждое входящее значение.

Данные, поступающие из базы данных, обычно не требуют какой-либо специальной обработки (т. Е. Неэкранирования) Я не знаю, что вы пытаетесь сделать с stripslashes() там. Если это для удаления волшебных кавычек, которые вставил PHP, вы должны делать это там, где извлекаете пользовательские значения из GET / POST / etc. (или полностью отключите магические кавычки, если можете, и у вас нет другого программного обеспечения, которое полагается на него)

Данные, отправляемые в html, должны быть экранированы для предотвращения XSS. htmlspecialchars() - правильная функция для этого. Опять же, я не знаю, для чего вы пытаетесь использовать stripslashes(). И опять же, вам нужно помнить, чтобы экранировать каждое значение, которое подвержено ошибкам. Вы должны хотя бы рассмотреть преимущества использования шаблонизатора или чего-то еще, что автоматически экранирует все значения, идущие в html.

2 голосов
/ 11 мая 2011

Я бы действительно хотел использовать что-то вроде PDO, если вы только начинаете. В конечном итоге вы захотите перейти таким образом, так почему бы не начать сейчас.

PDO автоматически очистит ваш ввод, и это здорово. Также будут использоваться операторы prepare (), поэтому вам гарантирован один запрос, который предотвращает атаку кого-либо с помощью «; DROP TABLE xxx;» или такой.

http://php.net/manual/en/book.pdo.php

1 голос
/ 11 мая 2011

Если у вас есть такая возможность, я бы рекомендовал использовать mysqli вместо mysql и использовать подготовленные операторы:

<?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();
?>

Источник: http://php.net/manual/en/mysqli.prepare.php

Это обеспечивает базовую проверку типов и позволяет вам избежать ее. Я бы не рекомендовал stripslashes при выводе данных в БД, потому что:

  1. В данных БД могут быть косые черты
  2. База данных в любом случае уходит для вас

Что касается отображения HTML, есть также htmlstriptags, который может лишить людей, пытающихся быть милыми, с помощью тегов и тому подобного.

0 голосов
/ 11 мая 2011

Я рекомендую вам использовать фильтры, представленные в php 5.2, они великолепны и экономят много строк проверки и санации данных. проверьте здесь

filter_input

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...