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

Я новичок в PDO и задаюсь вопросом, безопасен ли мой запрос ниже SQL-инъекции. Я буду использовать этот метод на всем сайте, если это так.

    // make connection to DB
$db = new PDO('mysql:host='.$dateBaseHost.';dbname='.$dateBaseName, $dateBaseUsername, $dateBasePassword);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);


//simple query and binding with results
$query = $db->prepare(" SELECT * FROM `profile` WHERE `fullname` = :fullname ");

$search = (isset($_GET['search']) === true) ? $_GET['search'] : '' ; // ? : shorthand for if else

// bind parameters - avoids SQL injection
$query->bindValue(':fullname', $search);

//try... if not catch exception
try {
    // run the query
    $query->execute();

    $rows = $query->fetchAll(PDO::FETCH_ASSOC);
    echo '<pre>', print_r($rows, true),'</pre>';
}
catch (PDOException $e){
    sendErrorMail($e->getMessage(), $e->getFile(), $e->getLine());
}

Ответ 1

Да - параметризованные запросы безопасны от инъекций, когда они используются таким образом.

Ответ 2

До тех пор, пока вы правильно используете подготовленные заявления, вы можете быть в безопасности от инъекций. но как только вы DIRECTLY вставьте какие-либо внешние данные в запрос, даже если это иначе подготовленный оператор, например

INSERT INTO $table VALUES (:param)

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

Любой, кто говорит вам просто переключать mysql- > PDO или mysqli, сделает вас более безопасным, это плоский WRONG. Вы можете быть так же уязвимы для инъекционных атак с помощью любой библиотеки.

Ответ 3

Вы также должны

$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

По умолчанию используется эмулированный режим, который просто выполняет то, что делает mysql_real_escape_string. В некоторых случаях с краями вы все еще уязвимы для SQL-инъекций.

Ответ 4

да, это довольно безопасно, но цельный script может быть улучшен:

if (isset($_GET['search']) {
    // make connection to DB
    $opt = array(
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    );
    $dsn = "mysql:host=$dateBaseHost;dbname=$dateBaseName;charset=$dateBaseCharset";
    $db  = new PDO($dsn, $dateBaseUsername, $dateBasePassword, $opt);

    //simple query and binding with results
    $query = $db->prepare("SELECT * FROM profile WHERE fullname = ?");
    $query->execute(array($_GET['search']));
    $rows = $query->fetchAll();
    echo '<pre>', print_r($rows, true),'</pre>';
}
  • вам нужно установить errmode в качестве опции подключения
  • никогда использовать try..catch для обработки сообщения об ошибке. если вы хотите получить электронное письмо по каждой ошибке (это просто сумасшествие), вам нужно настроить my_exception handler() для этого.
  • установка поиска в пустую строку не имеет смысла
  • подключиться к PDO следует перемещать таким образом отдельный файл (не показан)
  • кодировка должна быть установлена ​​в DSN