问题
好的,但如果绑定的参数值在MySQL中用作User-Defined Variables,我真的不知道发生了什么。
初始安全绑定参数过程是否可用于在STEP 2中执行(因此注入)?
// The user input that may be the target for injection
$userInput = "input";
// STEP 1 -------------------
$q = "SET @param1 = :param1;";
// Execute query to set mysql user-defined variables
$param = [
'param1' => $userInput
];
$stmt = $pdo->prepare($q);
$stmt->execute($param);
// STEP 2 -------------------
// Query DB with User-Defined Variables
$q = "
SELECT ...
WHERE
table.field1 = @param1 OR
table.field2 = @param1 OR
table.field3 = @param1
";
// Query
$stmt = $pdo->query($q);
// STEP 3 -------------------
// Fetch Data
$row = $stmt->fetch();
我为什么要使用这种方法?
我使用来避免多个类似的命名参数,如下面的示例所示
您不能使用同名的命名参数标记
一旦在准备好的声明中,除非仿真模式打开
来自manual的
。维护复杂的查询很麻烦:
$q = "
SELECT ...
WHERE
table.field1 = :param1_1 OR
table.field2 = :param1_2 OR
table.field3 = :param1_2
";
$param = [
'param1_1' => $userInput
'param1_2' => $userInput
'param1_3' => $userInput
];
$stmt = $pdo->prepare($q);
$stmt->execute($param);