gpt4 book ai didi

php - 使用 PHP 动态生成 MySQL 建表脚本

转载 作者:搜寻专家 更新时间:2023-10-30 22:18:40 26 4
gpt4 key购买 nike

我认为这之前没有发布过 - 因为这是一个非常具体的问题。

我有一个脚本可以生成一个“创建表”脚本,其中包含带有自定义类型和名称的自定义列数。

这是一个示例,应该足以让您从中工作 -

$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 中返回一个语法错误。这可能与换行符有关,但我无法弄清楚。帮助!

最佳答案

您有多个 SQL 注入(inject)漏洞
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

请看这个问题的答案:
How to prevent SQL injection with dynamic tablenames?

永远不要在查询中使用\n
使用空格分隔元素。 MySQL 非常乐意接受您的查询作为一个长字符串。
如果您想漂亮地打印查询,请使用两个空格代替 \n,并在屏幕上显示查询的代码中用换行符替换双空格。

更多 SQL 注入(inject)
$SESSION['user_id'] 不安全,建议您将其转换为整数,然后将其提供给查询。因为您无法根据白名单检查它并且转义表名是没有意义的。

$safesession_id = intval($SESSION['user_id']);  

用反引号包围所有表名和列名 `
这对于手写代码来说是不需要的,但对于自动生成的代码来说是必不可少的。

例子:

CREATE TABLE `table_18993` (`id` INTEGER .....

向大师学习
您可以使用以下 MySQL 查询在 MySQL 中生成表的创建语句:

SHOW CREATE TABLE tblname;

您的代码需要准确复制此语句的输出。

关于php - 使用 PHP 动态生成 MySQL 建表脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7536261/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com