mysql INSERT INTO SELECT是否易受SQL注入攻击?

mwyxok5s  于 2023-04-04  发布在  Mysql
关注(0)|答案(1)|浏览(154)

假设你让用户插入他们的名字(或任何东西到一个表),有人试图SQL注入,但你正确地使用准备好的语句,所以查询不受影响。

$stmt = $db->prepare("INSERT INTO users (user_name) VALUES (?)");
$stmt->bindParam(1, $_POST['user_name']);

但是现在您使用插入到user_name列中的值并将其插入到另一个表中。

$stmt = $db->prepare("INSERT INTO different_table (name) VALUES (
    SELECT user_name FROM users WHERE userId = ?
)");

user_name是否被视为字符串(假设数据类型为varchar)?换句话说,是否只需要在用户输入第一次插入并来自客户端时准备用户输入?

编辑

如果user_name中的值包含一个注入,现在我想把这个值插入到另一个表中,我是否需要首先运行select来获取这个值,然后在插入时在一个准备好的语句中使用它?像这样?

$stmt = $db->prepare("SELECT user_name FROM users WHERE user_id = 1");

然后

$stmt = $db->prepare("INSERT INTO another_table (name) VALUES (?)");
$stmt->bindParam(1, $resultFromFirstQuery['user_name']);

或者我可以这样做吗?

$stmt = $db->prepare("INSERT INTO different_table (name) SELECT user_name FROM users WHERE userId = ?");
pbpqsu0x

pbpqsu0x1#

我会说没有SQL注入是可能的,因为没有SQL语句被构造。换句话说:,SQL注入只能发生在创建SQL语句的编程语言中,而不是SQL语句本身。
详细说明:SQL注入攻击的核心是未经检查的用户输入被 * 用于 * 生成 * 一条SQL语句,该语句超出了用户输入的原始目的。

$sql = "SELECT * FROM Users WHERE Email = '{input.email}'"

以及用户输入

hacker@example.com' OR 1 = 1; --

对于{input.email},则变量$sql最终为

SELECT * FROM Users WHERE Email = 'hacker@example.com' OR 1 = 1; -- '

现在的安全风险来自于在数据库上执行这个未经检查的语句。
在您的示例中,没有构造SQL。如果执行语句

INSERT INTO table1 SELECT * FROM table2

SELECT的结果可能包含被视为SQL时不安全的输入,但文本字段的值永远不会在数据库上作为语句运行,因此表中是否包含12345hacker@example.com' OR 1 = 1; --并不相关。
我能想到的唯一可能的情况是,如果你的数据库服务器有一个错误,在内存中的特定位置有一些特定的字节集可能会导致内存溢出,然后打开一个攻击向量。它也是一种你无法对抗的东西,与SQL注入无关。

相关问题