Данные, полученные через Запрос с помощью Doctrine должны быть обработаны?


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

Я получаю данные из forms через Request,Symfony (Symfony\Component\HttpFoundation\Request) и хотел бы знать, если мне нужно использовать какой-то метод, чтобы отфильтровать эти данные, тип filter_input, htmlspecialchars, strip_tags, etc?

В моем случае я получаю эти данные так:

$dados = $request->request->all(); 

, оказавшихся они:

$dados['nome'] 

, пример. Нужно лечить или нет?

Author: novic, 2017-01-25

2 answers

Код (source) Request и, следовательно, ParameterBag, может быть использован следующим образом, что уже получают то, что предполагается:

$id = $request->request->getInt('id'); 
$nm = $request->request->getAlpha('name');
$st = $request->request->getBoolean('status');

Или задать свой собственный фильтр:

$mail = $request->request->filter('id', 0, FILTER_SANITIZE_EMAIL);

В случае, упомянутом all(), они не обрабатывают данные, но, как было сообщено, существует вариант, где можно сделать это с помощью filter или осуществляется getInt, getAlpha, getBoolean, getDigits и getAlnum , внутренне используют этот тип кода, например getBoolean:

public function getBoolean($key, $default = false)
{
    return $this->filter($key, $default, FILTER_VALIDATE_BOOLEAN);
}

Doctrine - Security есть часть безопасности, но это может быть дополнена кода показано чуть выше, или даже Проверки Класса, может запереть большинство проблем, возникающих в разработке Веб-данных, полученных посредством запросов http.

Фильмография:

 2
Author: novic, 2017-01-25 15:10:13

, Заполнив ответ @Virgilio Novic, что говорит документации Doctrine:

In general you should assume that Api in Doctrine are not safe for user input. There are however some exceptions.

Вольный Перевод:

В общем, вы должны предположить, что Api-интерфейсы в Работе, не являются безопасными для входа пользователя. Существуют, однако, некоторые исключения.

Исключения могут быть в следующих вид ссылки:

Обратите внимание на то, что говорит разделе 12.2.1. Wrong: String Concatenation (concatenção строк), вы никогда не должны никогда не построить ваши запросы динамически и сцепления inputs пользователя в SQL запрос или DQL. Для Doctrine нет абсолютно никакого способа выяснить, какие части SQL inputs пользователя и какие - нет.

, например:

<?php
$sql = "SELECT * FROM users WHERE name = '" . $_GET['username']. "'";

Хотя DQL-это оболочка вокруг SQL, которые могут защитить от некоторые последствия для безопасности, предыдущий пример также является угрозой для запросов DQL, что в конце концов приведет к query:

$dql = "SELECT u FROM User u WHERE u.username = '" . $_GET['username'] . "'";

В Этом случае злоумышленник все еще можете передать имя пользователя, определяется как 'OR 1 = 1 и создать запрос DQL допустимым.

Итак, как сделать запросы более безопасные?

  • Prepared Statements: вы должны всегда использовать его, чтобы выполнить ваши запросы. Процедура в два этапа, разделив SQL-запрос с параметрами. Они поддерживаются запросы DBAL SQL и запросов ORM DQL.

Примере DQL:

$dql = "SELECT u FROM User u WHERE u.username = :name";
$query = $em->createQuery($dql);
$query->setParameter("name", $_GET['username']);
$data = $query->getResult();

Пример SQL:

$sql = "SELECT * FROM users WHERE username = ?";
$stmt = $connection->executeQuery($sql, array($_GET['username']));

Посмотреть более подробную информацию о том, как использовать его здесь.

  • Экранирование/Escaping: Хотя ранее сказал, что конкатенации строк, это неправильно, есть ли способ сделать это правильно, используя метод Connection#quote. Этот метод доступен только для SQL, а не для DQL. Для DQL всегда рекомендуется использовать Prepared Statements не только для безопасности, но и причины кэш.

Например:

$sql = "SELECT * FROM users WHERE name = " . $connection->quote($_GET['username'], \PDO::PARAM_STR);

Данных, полученных с помощью Request, используя Doctrine должны быть обработаны?

Зависит от API, который используется как указано в документации, но в целом, если запрос строится на основе ввода пользователя, да, нужно лечить всех закуска.

 1
Author: Filipe Moraes, 2020-06-11 14:45:34