DB中的双引号打破HTML输出

时间:2016-11-28 02:31:03

标签: php pdo

我已经尝试了一切,我仍然无法弄明白。 addslahes()str_replace()htmlentities(),我无法理解为什么双引号没有显示在我的网站上。

$sql = $con->prepare("SELECT * FROM `user_settings` WHERE `user_session` = '$user_session'");
$sql -> execute();

$result = $sql->fetchAll(PDO::FETCH_ASSOC);

foreach ($result as $row) {
    $advertising_1 = $row['advertising_1'];
    $advertising_2 = $row['advertising_2'];
    $website_name = $row['website_name'];
    $website_url = $row['website_url'];
    $statistics = $row['statistics'];
}
echo '<input type="text" name="website_name" placeholder="Your Website URL" value="'. $website_name. '" />' ?>

有人可以解释我在哪里出错吗?问题出现在我的字符串中的双引号。单引号用mysql_escape修复,但似乎已被弃用。

2 个答案:

答案 0 :(得分:3)

您需要将输出的数据转义为浏览器使用htmlspecialchars并使用引号常量(ENT_QUOTES),以便将所有引号转换为实体。请注意,这也是如何防止/执行XSS注射。

表示元素/属性在它们不是假设的情况下被关闭。

echo htmlspecialchars('Encode all of these "test" test \'test \'', ENT_QUOTES);

输出:

Encode all of these &quot;test&quot; test &#039;test &#039;

并在浏览器中:

  

对所有这些进行编码&#34;测试&#34;测试&#39;

同样从您显示的代码中,您滥用预备语句。值必须绑定,而不是与查询连接。这样PDO驱动程序将处理引用/转义。如果您继续使用它,这可能会在将来导致类似的问题。还可以打开SQL注入。

有关预准备陈述的更多信息,请参阅:http://php.net/manual/en/pdo.prepared-statements.php

答案 1 :(得分:0)

您需要在语句上使用不带变量的准备,然后将它们作为数组添加到 execute() 中,如下所示:

$sql ="SELECT * FROM `user_settings` WHERE `user_session` = ?";
$stmt = $con->prepare($sql);
$stmt->execute([$user_session]);