我有一个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应用程序调用,因此在应用程序中显示为&而不是&
问题:
- 我是否调整自定义后端以不使用htmlspecialchar?我是唯一的管理员,所以进入的数据是安全的
- 在打印JSON之前,有没有一种方法可以在结果集上运行htmlspecialchars_decode,而不必循环遍历结果
这里真正的答案是,您不应该对进入数据库的数据进行html编码。您希望数据库中的数据与用户输入的数据完全相同。
工程师不希望数据库中的数据以任何方式进行转义。正如您所看到的,这样做会迫使您记住,无论何时将数据从数据库中取出,都要对其进行解密。在您的案例中,问题是htmlspecialchars
永远不会被反转,因为浏览器在呈现HTML时会为您处理这一问题。
您通常会在PHP模板中使用HMTL转义,如下所示:
<?php
$db = //get database connection
$data = $db->read//....
?>
<div>
<?=htmlspecialchars($data)?>
</div>