我正在寻找一种在准备好的语句中处理 HTML 内容的方法。
我的应用程序提供了一个基本的所见即所得编辑器,在用户保存内容后,我的脚本将 HTML 数据存储在 sqlite 数据库中。
但是如果我使用准备好的语句,我的 HTML 会自然地转义。
这就是我目前的情况:
try {
/* Create databases and open connections */
$dbh = new PDO( 'sqlite:db/coaching.sqlite' );
/* Set Error Mode for Exception Handling */
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
/* Prepare SQL Statement */
$query = $dbh->prepare( "UPDATE Content SET Value=:value WHERE Token=:token" );
/* Bind Param to Statement */
$query->bindParam( ':token', $_POST['id'], PDO::PARAM_STR);
$query->bindParam( ':value', $_POST['value'], PDO::PARAM_STR);
/* Execute Query */
$query->execute();
/* Echo Data */
echo $_POST['value'];
/* Close connections to Database */
$dbh = NULL;
}
catch( PDOException $e ) {
/* Print Error-Messages */
echo $e->getMessage();
}
最佳答案
准备好的语句不会转义变量。命令和变量同时但独立地传输到数据库。如果您发现您的数据在数据库中被转义,还有另一个原因。例如。 magic_quotes
已打开。您能否在脚本中回显 get_magic_quotes_gpc
以查看它们是打开还是关闭?如果它们打开,您可以使用 different techniques 将它们关闭.这将解决问题。
此外,根据您的评论,准备好的陈述会执行 prevent SQL injection attacks所以你不必担心转义你的变量。可能难以理解的是准备好的语句的工作方式。假设您有一个查询:
$query = "SELECT `id` FROM `users` WHERE `login` = '" . $login . "' AND `password` = '" . $password ."'";
$login
和 $password
按原样直接传递给查询。如果有人试图将 mylogin' --
传递给 $login
,则查询变为:
$query = "SELECT `id` FROM `users` WHERE `login` = 'mylogin' -- ' AND `password` = 'anypassword'";
并被发送到数据库。这样攻击者就可以访问任何帐户。
预处理语句的作用是,它们独立于查询传输查询参数。在将查询传输到数据库之前,查询不是变量的构建。相反,变量以某种方式在查询旁边传输。它们在查询中被引用。这样查询就不会被有意或无意地欺骗。
使用准备好的语句,示例 $login
将按原样传输,不会影响查询结构。
如果可以用飞机运载乘客,而乘客实际上没有登机,那将被称为“准备好的航类”:) 乘客将无法影响航线和劫持飞机。他们会随着飞机降落出现在目标机场。
关于php - PDO准备语句来存储html内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10217402/