如何处理必须存在的数据中的引用?
此javascript语句正常工作,直到城市名称为“ST JOHN'S”。 我们无法更改数据库中城市名称的更改 - 或者 - 使用更可靠的密钥。
$('#map_output').html('<p><img src="img/map/<?=$CITY_OUT?>_map.PNG" width="600"></p>')
答案 0 :(得分:6)
编辑:您使用它(sorta),如json_encode
:
<?=htmlspecialchars($CITY_OUT, ENT_QUOTES)?>
但是htmlspecialchars
更具语义性 - json_encode
是关于生成JSON(内部,数据表示),而不是关于表示。
Nick Craver是对的 - 它也会奏效。
修改:需要ENT_QUOTES
才能正确呈现“'”...
答案 1 :(得分:2)
您可以使用json_encode()
来转义引号,如下所示:
<?=json_encode($CITY_OUT)?>
答案 2 :(得分:2)
需要三种级别的编码:
您正在创建一个网址,因此您需要对其进行网址编码:
$url = rawurlencode('img/map/'.$CITY_OUT.'_map.PNG');
您正在创建HTML属性,因此您需要对其进行HTML编码:
$html = '<p><img src="'.htmlspecialchars($url).'" width="600"></p>';
第二步可能没什么大不同,因为您不太可能有'
,"
,&
,<
或{{1}在您的网址中。但是如果你想要严格正确,你应该编码所有HTML属性。这是一个很好的习惯,所以你可以处理所有特殊字符。
最后,您正在创建一个JavaScript值,因此您需要对其进行JSON编码:
>
(已编辑以添加JSON编码)
答案 3 :(得分:1)
在我的快速测试中,这两个答案都没有奏效:
<?php
$string = "ST JOHN'S";
$json = json_encode($string);
$html = htmlspecialchars($string);
$escape = str_replace("'", "\'", $string);
?>
<script type="text/javascript">
alert('<?php echo $escape?>');
alert('<?php echo $html?>');
alert('<?php echo $json?>');
</script>
唯一没有产生javascript错误的测试是我使用str_replace来实际逃避单引号。
答案 4 :(得分:0)
“rawurlencode”是您需要确保URL中的字符在“img / map / ...”请求中的解释方式与此PHP脚本中的相同。 顺便说一句,“rawurlencode”安全地逃脱了你在XSS注射中需要担心的所有角色。
<?php
$string = "ST JOHN'S";
$json = json_encode($string);
$html = htmlspecialchars($string, ENT_QUOTES);
$htmlent = htmlentities($string, ENT_QUOTES);
$escape = str_replace("'", "\'", $string);
$urlenc = rawurlencode($string);
?>
<script type="text/javascript">
alert('<?php echo $html; ?>');
alert('<?php echo $htmlent; ?>');
alert('<?php echo $urlenc; ?>');
</script>
答案 5 :(得分:0)
你已经说到目前为止给出的解决方案都没有对你有用,但我认为它们实际上很好(至少其中一些)。让我演示一下:
以下是您列出的示例:
$json:
<img src="img/map/"ST JOHN'S"_map.PNG"/ width="600">
$html:
<img src="img/map/ST JOHN'S_map.PNG"/ width="600">
$htmlent:
<img src="img/map/ST JOHN's_map.PNG"/ width="600">
$escape:
<img src="img/map/ST JOHN\'S_map.PNG"/ width="600">
$urlenc:
<img src="img/map/ST%20JOHN%27S_map.PNG"/ width="600">
我没有看到任何这些问题(除了JSON之外,我稍后会解释)。
我刚刚尝试了所有这些示例,尝试尽可能地模拟您的场景(甚至使用相同的文件名)....除了JSON示例之外,所有这些都正确地加载了图形。
JSON示例需要进行一些小调整以使其正常工作,但它也会以可行的方式转义字符串。为了使它工作,你需要考虑到JSON产生一个完全引用的Javasscript字符串而不是像其他人那样转义它,所以你要修改输出以关闭引号并将字符串添加到一起,如下所示: / p>
$('#map_output').html('<p><img src="img/map/"+<?=$json?>+"_map.PNG"/ width="600"></p>');
其他解决方案不需要这个。他们都按原样工作。正如我所说,我尝试了它们,并且它们都将图形加载到页面中。
在上下文中,所有三种机制(转义\'
,实体'
和URL编码%27
)都有效:
转义是有效的,因为你在Javascript的上下文中,所以反斜杠由Javascript处理,最终生成的HTML插入到页面中将不包含它。
实体的工作原理是因为HTML将实体转换为映射的字符,因此HTML页面中的'
与单引号相同,即使在属性值中也是如此。
网址编码有效,因为浏览器会在加载网址时对其进行翻译。
我建议在这种情况下,URL编码是正确的解决方案,因为它用于URL。原因是尽管所有解决方案都适用于给定示例,但如果您有任何包含问号或&符号(&
)或其他一些保留字符的示例,则URL编码将是唯一的在这些情况下可以使用的解决方案。另一方面,如果您在另一个上下文中的HTML页面中显示输出,那么实体就是您的选择。如果它将在Javascript中使用,那么JSON就是答案。
但是你说没有人能做到这一点。我的问题是:你真的试过吗?你运行代码并且图形无法加载吗?它对我有用。另一方面,如果他们确实有效,但仍然没有“耍手段”,那么你真正想要的是什么?
我的猜测是,你的意思是你想在那里得到一个简单的引用字符,但它有神奇的功效。这不可能发生;报价必须以某种方式或其他方式进行转义才能使其正常工作,但是用户永远不会看到转义版本,因此无需担心它。
实际上,您应该转义或编码所有您输入或输出的字符串,以便无效字符可以正常工作。否则,奥布莱恩先生将很难在他的网站上输入他的名字,如果他管理它,你将无法在之后显示它。
答案 6 :(得分:-1)
不幸的是,上述解决方案都没有成功。
<?
$string = "ST JOHN'S";
$json = json_encode($string);
$html = htmlspecialchars($string, ENT_QUOTES);
$htmlent = htmlentities($string, ENT_QUOTES);
$escape = str_replace("'", "\'", $string);
$urlenc = rawurlencode($string);
?>
$json:
<img src="img/map/<?=$json?>_map.PNG"/ width="600">
$html:
<img src="img/map/<?=$html?>_map.PNG"/ width="600">
$htmlent:
<img src="img/map/<?=$htmlent?>_map.PNG"/ width="600">
$escape:
<img src="img/map/<?=$escape?>_map.PNG"/ width="600">
$urlenc:
<img src="img/map/<?=$urlenc?>_map.PNG"/ width="600">
输出:
$json:
<img src="img/map/"ST JOHN'S"_map.PNG"/ width="600">
$html:
<img src="img/map/ST JOHN'S_map.PNG"/ width="600">
$htmlent:
<img src="img/map/ST JOHN's_map.PNG"/ width="600">
$escape:
<img src="img/map/ST JOHN\'S_map.PNG"/ width="600">
$urlenc:
<img src="img/map/ST%20JOHN%27S_map.PNG"/ width="600">