Является ли этот код безопасным от SQL-инъекции

Я хочу сделать мой код максимально безопасным от любого типа нападений, на которые я надеялся получить некоторое представление о простом коде, который я использую ниже. Любые указатели на то, как сделать его более безопасным, если он уязвим, и почему это было бы потрясающе. Я читал, что использование подготовленных заявлений – лучшая практика для защиты от атак.

<?php try { $conn = new PDO('mysql:host=localhost;dbname=test', 'user', 'XXXXX'); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $conn->prepare('INSERT INTO people (name, email) VALUES (:name, :email)'); $stmt->execute(array(':name' => $_POST['name'], ':email' => $_POST['email'])); #If one or more rows were returned... } catch(PDOException $e){ echo'ERROR: ' . $e->getMessage(); } echo "Added $_POST[name] with email $_POST[email] succsessfully"; $conn = null; ?> 

Related of "Является ли этот код безопасным от SQL-инъекции"

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

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

должен стать

 echo "Added" . htmlspecialchars($_POST['name']) . "with email" . htmlspecialchars($_POST['email']) . "succsessfully"; 

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

Да, использование параметров в 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, эти поля базы данных должны принимать значения, равные нулю

Я бы также подумал об использовании 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();