【问题标题】:Using a table to parametrize column/table names in PDO使用表参数化 PDO 中的列/表名称
【发布时间】:2017-03-29 22:05:05
【问题描述】:

不能use parameters to describe column or table names in PDO

例如:

CREATE TABLE ? (id INT(6) PRIMARY KEY AUTO_INCREMENT, ...)

如何使用临时表处理恶意数据,然后将其反馈到语句中?

$hex = bin2hex(random_bytes(8));
$stmt = $db->prepare('INSERT INTO tmpdata (value,hex) VALUES (:val,:hex)');
$stmt->execute(array(
  ":val" => $_POST['catname'],
  ":hex" => $hex
));
$stmt = $db->prepare('SELECT value FROM tmpdata WHERE hex=?');
$stmt->execute(array($hex));
$row = $stmt->fetchAll(PDO::FETCH_ASSOC);
$cleaned_value = $row[0]['value'];

这是一种可接受且更重要的是安全的方式将参数输入 PDO 以获取列名和表名吗?

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    一点也不。

    如果你拿一个装有毒药的瓶子喝下去,你会死的。
    是什么让您认为在饮用前将其存放在橱柜中会使其无害?

    更直接地针对您的问题,您应该永远不要根据用户输入创建表格。不是因为任何危险,而是因为理智。您的数据库设计应该是固定的和静态的,一劳永逸,只偶尔更改,仅限管理员。

    所以你现在最关心的是学习数据库设计基础知识。

    【讨论】:

    • 最终目标是为每种类型的项目创建一个类似于 item_$ 的表,因为我在这里处理库存。所以有一个清晰的设计,但是数据库随着用户的需求而增长。
    • 它一点也不干净。它应该是一个表,其中 $ 进入一个字段。所以结论还是一样——学习数据库基础知识
    猜你喜欢
    • 1970-01-01
    • 2011-08-04
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多