我正在寻找一种在预准备语句中处理HTML内容的方法。
我的应用程序提供了一个基本的WYSIWYG编辑器,在用户保存内容后,我的脚本将HTML-Data存储在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();
}
答案 0 :(得分:7)
预备语句不会转义变量。命令和变量同时但独立地传输到数据库。如果您在数据库中看到数据已转义,则还有另一个原因。例如。 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'";
并发送到数据库。这样攻击者就可以访问任何帐户。
准备好的语句会做什么,它们会独立于查询传递查询参数。在将变量传输到数据库之前,查询不是变量的构建。相反,变量以某种方式在查询旁边传输。它们在查询中引用。这样,不能有意或无意地欺骗查询。
使用预准备语句,exampled $login
将按原样传输,不会影响查询结构。
如果可以乘飞机运送乘客,乘客实际上没有登机,那将被称为“准备好的飞行”:)乘客将无法影响航线并劫持飞机。他们会在飞机着陆时出现在目标机场。
答案 1 :(得分:2)