应该使用哪种 PDO 绑定方法来提高安全性?
Which PDO bind approach should be used for greater security?
我知道在 PHP 中使用 PDO 更新 MySQL 数据库记录的两种方法。请有人解释我应该使用哪一个来提高安全性以及区别,我有点困惑。
方法一:
$user = "root";
$pass = "";
$dbh = new PDO('mysql:host=somehost;dbname=somedb', $user, $pass);
$sql = "UPDATE coupons SET
coupon_code = :coupon_code,
valid_from = :valid_from,
valid_to = :valid_to,
discount_percentage = :discount_percentage,
discount_amount = :discount_amount,
calculationType = :calculationType,
limit = :limit
WHERE coupon_code = :coupon";
$stmt = $dbh->prepare($sql);
$stmt->bindParam(':coupon_code', $_POST['coupon_code'], PDO::PARAM_STR);
$stmt->bindParam(':valid_from', $_POST['$valid_from'], PDO::PARAM_STR);
$stmt->bindParam(':valid_to', $_POST['valid_to'], PDO::PARAM_STR);
$stmt->bindParam(':discount_percentage', $_POST['discount_percentage'], PDO::PARAM_STR);
$stmt->bindParam(':discount_amount', $_POST['discount_amount'], PDO::PARAM_STR);
$stmt->bindParam(':calculationType', $_POST['calculationType'], PDO::PARAM_STR);
$stmt->bindParam(':limit', $_POST['limit'], PDO::PARAM_STR);
$stmt->bindParam(':coupon', $_POST['coupon_code'], PDO::PARAM_STR);
$stmt->execute();
方法二:
$dbtype="somedbtype";
$dbhost="somehost";
$dbname="somedb";
$dbuser="someuser";
$dbpass= "somepass";
$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);
$title = 'PHP Pattern';
$author = 'Imanda';
$id = 3;
$sql = "UPDATE books
SET title=?, author=?
WHERE id=?";
$q = $conn->prepare($sql);
$q->execute(array($title,$author,$id));
据我所知,方法二不绑定数据,而是将其作为数组类型直接插入到查询中。这是否会使脚本更容易受到 SQL 注入或其他安全风险的影响?
两者之间的唯一区别是,如果您将数组传递给 execute
函数而不是自己调用 bindParam
,它会自动将所有参数视为 PDO::PARAM_STR
,而在自己调用 bindParam
时,您可以将它们绑定为整数等
来自docs:
input_parameters
An array of values with as many elements as there are bound parameters in the SQL statement being executed. All values are treated as PDO::PARAM_STR.
您还可以从那里的示例中看到,在将数组传递给 execute
函数时可以使用命名参数(例如 :limit
)。您不必只输入 ?
。在那种情况下,你给数组一个键:
$sth->execute(array(':calories' => $calories, ':colour' => $colour));
主要是个人喜好问题。两者都可以保护您免受注射。
虽然我认为使用 bind() 强制数据类型要容易得多,但使用 execute(array()) 将使用字符串。
我知道在 PHP 中使用 PDO 更新 MySQL 数据库记录的两种方法。请有人解释我应该使用哪一个来提高安全性以及区别,我有点困惑。
方法一:
$user = "root";
$pass = "";
$dbh = new PDO('mysql:host=somehost;dbname=somedb', $user, $pass);
$sql = "UPDATE coupons SET
coupon_code = :coupon_code,
valid_from = :valid_from,
valid_to = :valid_to,
discount_percentage = :discount_percentage,
discount_amount = :discount_amount,
calculationType = :calculationType,
limit = :limit
WHERE coupon_code = :coupon";
$stmt = $dbh->prepare($sql);
$stmt->bindParam(':coupon_code', $_POST['coupon_code'], PDO::PARAM_STR);
$stmt->bindParam(':valid_from', $_POST['$valid_from'], PDO::PARAM_STR);
$stmt->bindParam(':valid_to', $_POST['valid_to'], PDO::PARAM_STR);
$stmt->bindParam(':discount_percentage', $_POST['discount_percentage'], PDO::PARAM_STR);
$stmt->bindParam(':discount_amount', $_POST['discount_amount'], PDO::PARAM_STR);
$stmt->bindParam(':calculationType', $_POST['calculationType'], PDO::PARAM_STR);
$stmt->bindParam(':limit', $_POST['limit'], PDO::PARAM_STR);
$stmt->bindParam(':coupon', $_POST['coupon_code'], PDO::PARAM_STR);
$stmt->execute();
方法二:
$dbtype="somedbtype";
$dbhost="somehost";
$dbname="somedb";
$dbuser="someuser";
$dbpass= "somepass";
$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);
$title = 'PHP Pattern';
$author = 'Imanda';
$id = 3;
$sql = "UPDATE books
SET title=?, author=?
WHERE id=?";
$q = $conn->prepare($sql);
$q->execute(array($title,$author,$id));
据我所知,方法二不绑定数据,而是将其作为数组类型直接插入到查询中。这是否会使脚本更容易受到 SQL 注入或其他安全风险的影响?
两者之间的唯一区别是,如果您将数组传递给 execute
函数而不是自己调用 bindParam
,它会自动将所有参数视为 PDO::PARAM_STR
,而在自己调用 bindParam
时,您可以将它们绑定为整数等
来自docs:
input_parameters
An array of values with as many elements as there are bound parameters in the SQL statement being executed. All values are treated as PDO::PARAM_STR.
您还可以从那里的示例中看到,在将数组传递给 execute
函数时可以使用命名参数(例如 :limit
)。您不必只输入 ?
。在那种情况下,你给数组一个键:
$sth->execute(array(':calories' => $calories, ':colour' => $colour));
主要是个人喜好问题。两者都可以保护您免受注射。
虽然我认为使用 bind() 强制数据类型要容易得多,但使用 execute(array()) 将使用字符串。