Создание сценария создания таблицы MySQL динамически с PHP - PullRequest
1 голос
/ 24 сентября 2011

Я не думаю, что это было опубликовано ранее - так как это очень специфическая проблема.

У меня есть сценарий, который генерирует сценарий «создания таблицы» с произвольным числом столбцов с настраиваемыми типами и именами.

Вот пример, который должен дать вам достаточно для работы -

$cols = array();
$count = 1;
$numcols = $_POST['cols'];
while ($numcols > 0) {

    $cols[] = mysql_real_escape_string($_POST[$count."_name"])." ".mysql_real_escape_string($_POST[$count."_type"]);
    $count ++;
    $numcols --;
}
$allcols = null;
$newcounter = $_POST['cols'];
foreach ($cols as $col) { 
    if ($newcounter > 1)
        $allcols = $allcols.$col.",\n";
    else
        $allcols = $allcols.$col."\n";
    $newcounter --;
};
$fullname = $_SESSION['user_id']."_".mysql_real_escape_string($_POST['name']);
$dbname = mysql_real_escape_string($_POST['name']);
$query = "CREATE TABLE ".$fullname." (\n".$allcols." )";
mysql_query($query);
echo create_table($query, $fullname, $dbname, $actualcols);

Но по какой-то причине, когда я запускаю этот запрос, он возвращает синтаксическую ошибку в MySQL. Это, вероятно, связано с переносами строк, но я не могу понять это. ПОМОГИТЕ!

1 Ответ

3 голосов
/ 24 сентября 2011

У вас есть несколько отверстий для 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;

Ваш код должен точно повторять вывод этого оператора.

...