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

如何处理必须存在的数据中的引用? 这个javascript语句正常工作,直到城市名称为“ST JOHN'S”。 我们无法更改数据库中城市名称的更改 - 或者 - 使用更可靠的密钥。
$('#map_output').html('<p><img src="img/map/<?=$CITY_OUT?>_map.PNG" width="600"></p>')
    
已邀请:
使用
htmlspecialchars()
。 编辑:你使用它(sorta)像
json_encode
<?=htmlspecialchars($CITY_OUT, ENT_QUOTES)?>
但是
htmlspecialchars
更具语义性 -
json_encode
是关于生成JSON(内部,数据表示),而不是关于表示。 尼克克拉弗是对的 - 它也会奏效。 编辑:需要
ENT_QUOTES
正确渲染“'”     
您可以使用
json_encode()
来逃避报价,如下所示:
<?=json_encode($CITY_OUT)?>
    
需要三种级别的编码: 您正在创建一个URL,因此您需要对其进行URL编码:
$url = rawurlencode('img/map/'.$CITY_OUT.'_map.PNG');
您正在创建HTML属性,因此您需要对其进行HTML编码:
$html = '<p><img src="'.htmlspecialchars($url).'" width="600"></p>';
第二步可能没有太大的区别,因为你的URL中不太可能有
'
"
&
<
>
。但是如果你想要严格正确,你应该编码所有HTML属性。这是一个很好的习惯,所以你可以处理所有特殊字符。 最后,您正在创建一个JavaScript值,因此您需要对其进行JSON编码:
$('#map_output').html(<?= json_encode($html) ?>)
(编辑以添加JSON编码)     
在我的快速测试中,这两个答案都没有奏效:
<?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来实际逃避单引号。     
您需要“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>
    
你已经说到目前为止给出的解决方案都没有对你有用,但我认为它们实际上很好(至少其中一些)。让我来证明: 以下是您列出的示例:
$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字符串而不是像其他人那样转义它,所以你要修改输出以关闭引号并将字符串添加到一起,如下所示:
$('#map_output').html('<p><img src="img/map/"+<?=$json?>+"_map.PNG"/ width="600"></p>');
其他解决方案不需要这个。他们都按原样工作。正如我所说的,我尝试了它们,并且它们都将图形加载到页面中。 在上下文中,所有三种机制(转义
'
,实体
&#039
和URL编码
%27
)都是有效的: 转义是有效的,因为你在Javascript的上下文中,所以反斜杠由Javascript处理,并且插入到页面中的最终生成的HTML将不包含它。 实体的工作原理是因为HTML将实体转换为映射的字符,因此HTML页面中的
&#039
与单引号相同,即使在属性值中也是如此。 URL编码有效,因为浏览器在加载URL时会对其进行翻译。 我建议URL编码在这种情况下是正确的解决方案,因为它用于URL。原因是虽然所有解决方案都适用于给定示例,但如果您有任何包含问号或&符号(
&
)或其他一些保留字符的示例,那么URL编码将是唯一可行的解​​决方案在这些情况下。另一方面,如果您在另一个上下文中的HTML页面中显示输出,那么实体就是您的选择。如果它只是在Javascript中使用,那么JSON就是答案。 但是你说没有人能做到这一点。我的问题是:你真的试过吗?你运行代码并且图形无法加载吗?它对我有用。另一方面,如果他们确实有效,但仍然没有“耍手段”,那么你真正想要的是什么? 我的猜测是你真正的意思是你想在那里得到一个简单的引号字符,但它有神奇的功效。这不可能发生;报价必须以某种方式或其他方式进行转义以使其工作,但是用户永远不会看到转义版本,因此无需担心它。 实际上,您应该转义或编码您输入或输出的所有字符串,以便无效字符可以正常工作。否则,奥布莱恩先生将难以在您的网站上输入他的名字,如果他管理它,您将无法在之后显示它。     
不幸的是,上述解决方案都没有成功。
<?
    $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">
    

要回复问题请先登录注册