准备好的语句,转义变量

问题描述 投票:0回答:2

我需要采取任何措施来保护这三个变量,例如使用转义字符串或绑定它们吗?我不确定我是否正确地执行了此操作,人们只是建议使用准备好的语句,所以我正在尝试弄清楚它们。

$order = $_POST['order'];
$heading = $_POST['heading'];
$content = $_POST['content'];    
try {
$dbh = new PDO("mysql:host=$hostname;dbname=saintfiv_faq", $username, $password);
/*** echo a message saying we have connected ***/
echo 'Connected to database<br />';

/*** INSERT data ***/
$stmt = $dbh->prepare("INSERT INTO faq(`order`, `heading`, `content`) VALUES (:order, :heading, :content)");
$stmt->bindParam(':order', $order, PDO::PARAM_INT);
$stmt->bindParam(':heading', $heading, PDO::PARAM_STR, strlen($heading));
$stmt->bindParam(':content', $content, PDO::PARAM_STR, strlen($content));
/*** close the database connection ***/
$stmt->execute();
}
catch(PDOException $e)
{
echo $e->getMessage();
}
php pdo
2个回答
2
投票

您没有在代码中使用准备好的语句。准备好的语句看起来更像这样:

$stmt = $db->prepare("INSERT INTO foo (bar, baz) VALUES (?, ?);");

$stmt->bindValue(1, "Fez");
$stmt->bindValue(2, "Hat");
$stmt->execute();

您的示例代码可能容易受到 SQL 注入的攻击,因为您只是将变量直接插入到 SQL 字符串中。您将需要使用准备好的语句并绑定值(这是首选解决方案),或者只是确保正确转义所有输入到

exec()

还值得一提的是,

exec()
适用于完全硬编码的语句 - 例如,
$db->exec("SELECT foo FROM bar;");
- 由于 SQL 是硬编码的,因此不存在 SQL 注入的可能性。然而,作为一种风格,我喜欢总是使用
prepare
来代替。

要在代码中专门执行查询,您可以执行以下操作:

$stmt = $db->prepare("INSERT INTO faq (`order`, `heading`, `content`) " .
    "VALUES (?, ?, ?);");

$stmt->bindValue(1, $order);
$stmt->bindValue(2, $heading);
$stmt->bindValue(3, $content);
$stmt->execute();

我还推荐官方 PHP 文档,因为它显示了执行相同操作的其他一些方法(即,您可以将参数作为数组传递给

execute()
,而不是单独绑定它们):http://php.ini。 net/manual/en/pdo.prepare.php.


1
投票

您绝对需要保护它们 - 否则,有人可能会放入“AMADANON 的标题”标题 - 并且撇号将在数据库中将其视为闭引号。这是一个无意的例子,也会有人试图攻击你的数据库。

推荐的(1)方法是使用参数。使用

VALUES(?,?,?)
,然后在调用execute时,将变量传递到那里。

有关更多信息,阅读 PHP 手册,查看示例

我不喜欢绑定变量,很难看出哪里发生了什么。

这也意味着您可以准备一次游标(使用 SQL 语句),然后使用不同的参数多次使用它。

Escape可以接受,但我没看出它增加了什么好处,而且参数更清晰。

(1)我写的

© www.soinside.com 2019 - 2024. All rights reserved.