Ответ 1
Да - параметризованные запросы безопасны от инъекций, когда они используются таким образом.
Я новичок в 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());
}
Да - параметризованные запросы безопасны от инъекций, когда они используются таким образом.
До тех пор, пока вы правильно используете подготовленные заявления, вы можете быть в безопасности от инъекций. но как только вы DIRECTLY вставьте какие-либо внешние данные в запрос, даже если это иначе подготовленный оператор, например
INSERT INTO $table VALUES (:param)
вы уязвимы - $table
может быть искажен в этом случае, даже если вы используете подготовленный оператор.
Любой, кто говорит вам просто переключать mysql- > PDO или mysqli, сделает вас более безопасным, это плоский WRONG. Вы можете быть так же уязвимы для инъекционных атак с помощью любой библиотеки.
Вы также должны
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
По умолчанию используется эмулированный режим, который просто выполняет то, что делает mysql_real_escape_string
. В некоторых случаях с краями вы все еще уязвимы для SQL-инъекций.
да, это довольно безопасно, но цельный 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>';
}
my_exception handler()
для этого.