Я использую $ _POST без фильтрации и PDO для ввода данных в базу данных MYSQL. Является ли мой код еще уязвимым для SQL-инъекции? [Дубликат]

В любом случае «синтаксис искажен». Это неправильная семантика. Следовательно, ИМХО 400 не подходит. Вместо этого было бы целесообразно вернуть 200 вместе с каким-то объектом ошибки, таким как { "error": { "message": "Unknown request keyword" } } или что-то еще.

Рассмотрим пути (ы) обработки клиента. Ошибка в синтаксисе (например, недопустимый JSON) является ошибкой в ​​логике программы, другими словами, какой-то ошибкой, и ее следует обрабатывать соответствующим образом, аналогично 403; Другими словами, что-то плохое пошло не так.

Ошибка в значении параметра, с другой стороны, является ошибкой семантики, возможно, из-за плохо подтвержденного ввода пользователем. Это не ошибка HTTP (хотя я полагаю, что это может быть 422). Путь обработки был бы другим.

Например, в jQuery я бы предпочел не писать один обработчик ошибок, который имеет дело с такими вещами, как 500 и некоторые семантические ошибки, специфичные для приложения. Другие фреймворки, Ember для одного, также обрабатывают ошибки HTTP, такие как 400 и 500, одинаково, как большие отказы жира, требующие от программиста обнаружить, что происходит и что происходит, в зависимости от того, является ли это «реальной» ошибкой или нет.

3
задан Yamaha32088 31 October 2012 в 04:59
поделиться

4 ответа

Похоже, вы в безопасности от SQL-инъекции, но теперь у вас проблемы с XSS в вашем эхом. Убедитесь, что вы всегда дезинфицируете / избегаете ввода пользователя перед его эхо-сигналом.

echo "Added $_POST[name] with email $_POST[email] succsessfully";

должен стать

echo "Added" . htmlspecialchars($_POST['name']) . "with email" . htmlspecialchars($_POST['email']) . "succsessfully";
7
ответ дан Ryan Adams 26 August 2018 в 14:00
поделиться

Я бы также подумал об использовании bindParam из привычки .. Мое понимание заключается в том, что PDO будет выполнять проверку типа (не то, что это важно для PARAM_STR), что может спасти вас от некоторых других векторов атаки.

(и добавьте в XSS, дезинфицирующее Скатокс, Райан и Иоанн упоминание.)

$name = isset($_POST['name']) ? htmlspecialchars($_POST['name']) : NULL;
$email = isset($_POST['email']) ? htmlspecialchars($_POST['email']) : NULL;
stmt = bindParam(':name',$name, PDO::PARAM_STR);
stmt = bindParam(':email',$email, PDO::PARAM_STR);
$stmt->execute();
1
ответ дан Erics 26 August 2018 в 14:00
поделиться

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

5
ответ дан Green Black 26 August 2018 в 14:00
поделиться

Да, использование параметров в SQL-запросе снижает вероятность атаки SQL-инъекции. Но я бы очистил данные, полученные от POST, а также проверить, существует ли это.

$name = isset($_POST['name']) ? htmlspecialchars($_POST['name']) : NULL;
$email = isset($_POST['email']) ? htmlspecialchars($_POST['email']) : NULL;
$stmt->execute(array(':name' => $name, ':email' => $email));

Имейте в виду, что если вы передаете значение null, эти поля базы данных должны принимать значения null

4
ответ дан Skatox 26 August 2018 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: