это безопасно, чтобы не избежать моего ввода в SQL - PullRequest
0 голосов
/ 24 мая 2018

Мне интересно, должен ли я использовать именованные параметры только для ввода пользователя или мне нужно сделать это для всех, например

$id = $_POST['id'] ; 

$update = $conn->prepare("UPDATE users SET profile ='reset', 
status='closed' WHERE id = :id ") ;
$update->bindValue(":id",$id,PDO::PARAM_INT) ;
$update->execute() ;

Я использовал именованные параметры для идентификатора, потому что это ввод пользователя, а также для профилястатус от меня, это плохо и небезопасно?должен ли я использовать именованные параметры для них

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Неправильно думать, что вам нужно беспокоиться только о пользовательском вводе.

Ваш код может получать небезопасный контент из любого источника, например:

  • Чтение файлов
  • Открытие URL-адреса, например, вызов веб-службы
  • Чтение из вашей собственной базы данных

Правильно, даже данные, которые были безопасно вставлены в вашу собственную базу данных, могут стать небезопасным контентом.

Пример. Предположим, вы хотите найти всех пользователей, имена которых совпадают с именем пользователя 123 (я знаю, что это можно сделать с помощью JOIN, но это всего лишь пример, так что потерпите меня):

$name = $conn->query("SELECT name FROM users WHERE id=123")->fetchColumn();

$data = $conn->query("SELECT * FROM users WHERE name = '$name'")->fetchAll();

Это безопасно?$name - это что-то, что я достал из базы данных, и мы предполагаем, что он был благополучно вставлен ранее.Как данные в моей собственной базе данных могут представлять риск для SQL-инъекции?

Что если имя «O'Reilly»?Это приведет к тому, что второй запрос будет иметь синтаксическую ошибку по крайней мере, потому что одинарные кавычки будут несбалансированными.

Это технически SQL-инъекция, хотя риск, скорее всего, будет простой ошибкой, чем любая зловещая попытка взлома.

С другой стороны, были реальные случаи, когда хакер намеренно регистрировалсяих «имя» на веб-сайте таким образом, что он использовал SQL-инъекцию или межсайтовый скриптинг.Когда имя злоумышленника позже использовалось веб-сайтом в каком-либо другом запросе или веб-выводе, он успешно завершил взлом.Я не шучу.

Решение, как обычно, заключается в использовании подготовленного оператора с параметром запроса:

$stmt = $conn->prepare("SELECT * FROM users WHERE name = ?");
$stmt->execute([$name]);
$data = $stmt->fetchAll();

Предположение, что SQL-инъекция происходит только из пользовательского ввода, напоминает мнеэтой цитаты:

«Объяснения существуют; они существовали всегда; всегда есть хорошо известное решение для каждой человеческой проблемы - аккуратное, правдоподобное и неправильное».- HL Mencken

0 голосов
/ 24 мая 2018

Это небезопасно, только если вы принимаете пользовательский ввод и не экранируете его каким-либо образом.

Ваши собственные входные данные, которые не получены из $_POST, $_GET, $_COOKIE или$_REQUEST абсолютно безопасны.


Редактировать Как указывает Билл Карвин, существуют, конечно, и другие потенциальные источники опасности.Полагаю, мне следует уточнить мою точку зрения:

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

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