У вас есть несколько отверстий для SQL-инъекций
mysql_real_escape_string()
работает только для значений, а не для чего-либо еще.
Также вы используете это неправильно, вам нужно заключить свои значения или параметры в одинарные кавычки.
$normal_query = "SELECT col1 FROM table1 WHERE col2 = '$escaped_var' ";
Если вы этого не сделаете, mysql_real_escape_string()
не будет работать, и вы получите синтаксические ошибки в качестве бонуса.
В операторе CREATE
нет параметров, поэтому экранирование не имеет смысла и не имеет смысла.
Вам необходимо внести в белый список имена столбцов, поскольку этот код абсолютно ничего не делает , чтобы защитить вас.
Код ужаса
$dbname = mysql_real_escape_string($_POST['name']); //unsafe
см. Этот вопрос для ответов:
Как предотвратить внедрение SQL с динамическими именами таблиц?
Никогда не используйте \n
в запросе
Используйте отдельные элементы, используя пробелы. MySQL очень рад принять ваш запрос в виде одной длинной строки.
Если вы хотите распечатать запрос, используйте два пробела вместо \n
и замените двойной пробел переводом строки в коде, отображающем запрос на экране.
Больше SQL-инъекций
$SESSION['user_id']
небезопасно, вы предлагаете преобразовать это в целое число, а затем передать его в запрос. Потому что вы не можете проверить это по белому списку, а экранирование имен таблиц не имеет смысла.
$safesession_id = intval($SESSION['user_id']);
Окружить все имена таблиц и столбцов в кавычках `
Это не требуется для рукописного кода, но для автоматически сгенерированного кода это важно.
Пример:
CREATE TABLE `table_18993` (`id` INTEGER .....
Учиться у мастера
Вы можете сгенерировать оператор создания таблицы в MySQL, используя следующий запрос MySQL:
SHOW CREATE TABLE tblname;
Ваш код должен точно повторять вывод этого оператора.