PHP Web服务将HTML字符作为实体返回


PHP Web Service returning HTML characters as entities

我有一个PHP web服务,它以JSON格式返回数据。我有一个自定义的后台来维护数据。当我通过后端保存记录时,我会在字符串字段上使用htmlspecialchar()。

一个示例web服务调用将运行以下代码:

$dbh = getConnection('read');
$sql = "SELECT Name, Location FROM Venues WHERE id = :venueID";
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute(array(':venueID' => $venue));
$data = $sth->fetchAll(PDO::FETCH_ASSOC);
header("Content-type: application/json");
print(json_encode(array('venues'=>$data)));

因此,假设对于所提供的场所ID,名称具有&web服务由Android应用程序调用,因此在应用程序中显示为&而不是&

问题:

  1. 我是否调整自定义后端以不使用htmlspecialchar?我是唯一的管理员,所以进入的数据是安全的
  2. 在打印JSON之前,有没有一种方法可以在结果集上运行htmlspecialchars_decode,而不必循环遍历结果

这里真正的答案是,您不应该对进入数据库的数据进行html编码。您希望数据库中的数据与用户输入的数据完全相同。

工程师不希望数据库中的数据以任何方式进行转义。正如您所看到的,这样做会迫使您记住,无论何时将数据从数据库中取出,都要对其进行解密。在您的案例中,问题是htmlspecialchars永远不会被反转,因为浏览器在呈现HTML时会为您处理这一问题。

您通常会在PHP模板中使用HMTL转义,如下所示:

<?php
$db = //get database connection
$data = $db->read//....
?>
<div>
<?=htmlspecialchars($data)?>
</div>