Данные, полученные через Запрос с помощью Doctrine должны быть обработаны?
Я разрабатываю новый проект, это первый раз, когда я использую Doctrine
Silex
, и я сомневаюсь, что касается получения информации через формы.
Я получаю данные из forms
через Request
,Symfony
(Symfony\Component\HttpFoundation\Request
) и хотел бы знать, если мне нужно использовать какой-то метод, чтобы отфильтровать эти данные, тип filter_input
, htmlspecialchars
, strip_tags
, etc?
В моем случае я получаю эти данные так:
$dados = $request->request->all();
, оказавшихся они:
$dados['nome']
, пример. Нужно лечить или нет?
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.
Фильмография:
, Заполнив ответ @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, который используется как указано в документации, но в целом, если запрос строится на основе ввода пользователя, да, нужно лечить всех закуска.