Это мой код:
$email= mysqli_real_escape_string($db_con,$_POST['email']); $psw= mysqli_real_escape_string($db_con,$_POST['psw']); $query = "INSERT INTO `users` (`email`,`psw`) VALUES ('".$email."','".$psw."')";
Может ли кто-нибудь сказать мне, является ли он безопасным или уязвим для атаки SQL Injection или других SQL-атак?
Может ли кто-нибудь сказать мне, является ли он безопасным или уязвим для атаки SQL Injection или других SQL-атак?
Как говорит uri2x, см. SQL-инъекцию, которая распространяется вокруг mysql_real_escape_string()
.
Лучший способ предотвратить SQL-инъекцию – использовать подготовленные операторы. Они отделяют данные (ваши параметры) от инструкций (строка запроса SQL) и не оставляют места для данных, чтобы загрязнить структуру вашего запроса. Подготовленные заявления решают одну из основных проблем безопасности приложений .
Для ситуации, когда вы не можете использовать подготовленные заявления (например, LIMIT
), использование строгого белого списка для каждой конкретной цели – единственный способ гарантировать безопасность.
// This is a string literal whitelist switch ($sortby) { case 'column_b': case 'col_c': // If it literally matches here, it's safe to use break; default: $sortby = 'rowid'; } // Only numeric characters will pass through this part of the code thanks to type casting $start = (int) $start; $howmany = (int) $howmany; if ($start < 0) { $start = 0; } if ($howmany < 1) { $howmany = 1; } // The actual query execution $stmt = $db->prepare( "SELECT * FROM table WHERE col = ? ORDER BY {$sortby} ASC LIMIT {$start}, {$howmany}" ); $stmt->execute(['value']); $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
Я полагаю, что вышеуказанный код невосприимчив к SQL-инъекции, даже в неясных случаях. Если вы используете MySQL, убедитесь, что вы включили эмуляцию.
$db->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);