PDO准备了存储html内容的语句

gea*_*tal 2 php sqlite pdo prepared-statement

我正在寻找一种在预准备语句中处理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();
}
Run Code Online (Sandbox Code Playgroud)

Taz*_*Taz 7

准备好的语句不会转义变量.命令和变量同时但独立地传输到数据库.如果您在数据库中看到数据已转义,则还有另一个原因.例如magic_quotes,打开.你可以get_magic_quotes_gpc在脚本中回显一下,看看它们是打开还是关闭?如果它们处于打开状态,您可以使用不同的技术将它们设置为关闭.这将解决问题.

另外,根据您的评论,准备好的语句可以防止 SQL注入攻击,因此您不必担心转义变量.可能难以理解的是准备好的陈述的工作方式.假设您有一个查询:

$query = "SELECT `id` FROM `users` WHERE `login` = '" . $login . "' AND `password` = '" . $password ."'";
Run Code Online (Sandbox Code Playgroud)

$login并按$password原样直接传递给查询.如果有人试图传递mylogin' --$login,则查询变为:

$query = "SELECT `id` FROM `users` WHERE `login` = 'mylogin' -- ' AND `password` = 'anypassword'";
Run Code Online (Sandbox Code Playgroud)

并发送到数据库.这样攻击者就可以访问任何帐户.

准备好的语句做什么,它们传递独立于查询的查询参数.在将变量传输到数据库之前,查询不是变量的构建.相反,变量以某种方式在查询旁边传输.它们在查询中引用.这样,不能有意或无意地欺骗查询.

使用预准备语句,exampled $login将按原样传输,不会影响查询结构.

如果乘客可以乘坐飞机,乘客实际上没有登机,那将被称为"准备好的飞行":)乘客将无法影响航线并劫持飞机.他们会在飞机着陆时出现在目标机场.