文件名中的单引号 - javascript,php

时间:2010-11-03 23:31:36

标签: php javascript quotes

如何处理必须存在的数据中的引用?

此javascript语句正常工作,直到城市名称为“ST JOHN'S”。 我们无法更改数据库中城市名称的更改 - 或者 - 使用更可靠的密钥。

$('#map_output').html('<p><img src="img/map/<?=$CITY_OUT?>_map.PNG" width="600"></p>')

7 个答案:

答案 0 :(得分:6)

使用htmlspecialchars()

编辑:您使用它(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&#039;S_map.PNG"/ width="600">
$htmlent:
<img src="img/map/ST JOHN&#039;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>');

其他解决方案不需要这个。他们都按原样工作。正如我所说,我尝试了它们,并且它们都将图形加载到页面中。

在上下文中,所有三种机制(转义\',实体&#039和URL编码%27)都有效:

  • 转义是有效的,因为你在Javascript的上下文中,所以反斜杠由Javascript处理,最终生成的HTML插入到页面中将不包含它。

  • 实体的工作原理是因为HTML将实体转换为映射的字符,因此HTML页面中的&#039与单引号相同,即使在属性值中也是如此。

    < / LI>
  • 网址编码有效,因为浏览器会在加载网址时对其进行翻译。

我建议在这种情况下,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&#039;S_map.PNG"/ width="600">
$htmlent:
<img src="img/map/ST JOHN&#039;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">