php - PDO准备语句来存储html内容

标签 php sqlite pdo prepared-statement

我正在寻找一种在准备好的语句中处理 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/

相关文章:

php - 结帐过程中 magento 单页结帐中未显示帐单信息

android - 如何获取具有相同列名的连接表的值?

php - PDO 没有绑定(bind) PostgreSQL 查询

sqlite - 将 sqlite3 与 IronPython 2.6 一起用于 .Net4

python - SQLite:转置 GROUP BY 的结果并用名称填充 ID

php - 使用 PDO 搜索

php - 数组到字符串转换错误?

php - Drupal - 如何使数组可全局访问?

php - 无法将数据从数据库读取到下拉列表中

php - Laravel/ Eloquent : How to use WHERE LIKE for combined fields?