【问题标题】:single quote in file name - javascript,php文件名中的单引号 - javascript,php
【发布时间】:2011-05-04 19:17:27
【问题描述】:

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

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

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

【问题讨论】:

    标签: php javascript quotes


    【解决方案1】:

    使用htmlspecialchars()

    编辑:你使用它(排序)就像json_encode

    <?=htmlspecialchars($CITY_OUT, ENT_QUOTES)?>
    

    htmlspecialchars 更符合语义 - json_encode 是关于生成 JSON(内部,数据表示),而不是关于呈现。

    Nick Craver 是对的 - 它也会起作用。

    编辑:需要ENT_QUOTES 才能正确渲染“'”...

    【讨论】:

    • 如果你正在创建一个 URL,你应该使用 URL 编码。
    【解决方案2】:

    您可以使用json_encode() 转义引号,如下所示:

    <?=json_encode($CITY_OUT)?>
    

    【讨论】:

    • 您是什么时候开始使用 PHP 的 :) ?作为一个挑剔的人,我不再使用短标签并使用&lt;?php echo json_encode($CITY_OUT)?&gt;,尽管对于大多数 PHP 安装它应该没有任何区别。
    • 我认为使用短标签并不重要。它实际上让我的代码看起来更好。
    • @karim79 - 我涉足 :) 在这些方面我倾向于尽可能少地改变,但你是对的,完整的块语法也更容易/我自己更喜欢。
    【解决方案3】:

    需要三个级别的编码:

    您正在创建一个 URL,因此您需要对其进行 URL 编码:

    $url = rawurlencode('img/map/'.$CITY_OUT.'_map.PNG');
    

    您正在创建一个 HTML 属性,因此您需要对其进行 HTML 编码:

    $html = '<p><img src="'.htmlspecialchars($url).'" width="600"></p>';
    

    第二步可能不会有太大的不同,因为您的网址中不太可能有'"&amp;&lt;&gt;。但是如果你想严格正确,你应该编码所有的 HTML 属性。这是一个好习惯,因此您可以处理所有特殊字符。

    最后,您正在创建一个 JavaScript 值,因此您需要对其进行 JSON 编码:

    $('#map_output').html(<?= json_encode($html) ?>)
    

    (已编辑以添加 JSON 编码)

    【讨论】:

      【解决方案4】:

      在我的快速测试中,两个答案都不起作用:

      <?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 来实际转义单引号。

      【讨论】:

      • 请阅读 PHP 文档。 "''' (单引号) 变成 '''仅当设置了 ENT_QUOTES 时。"
      • 好的,我确实读过了。关键是在示例中它没有传递该参数。另外,如果用 ' 替换它,是否仍会解析为正确的文件路径?我并不是说不会,因为我从未在文件路径中使用过 html 实体,但我不确定,所以我认为转义引用会更好。
      • 再想一想,我们可能需要对文件路径进行 url 编码才能工作?无论哪种方式,我都没有那么多空闲时间来测试那部分,所以其他人......请随意:-)
      【解决方案5】:

      "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>
      

      【讨论】:

        【解决方案6】:

        您曾说过到目前为止给出的解决方案都没有为您工作,但我认为实际上它们很好(至少其中一些)。让我演示一下:

        以下是您列出的示例:

        $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 生成一个完全引用的 JavaScript 字符串,而不是像其他字符串那样转义它,因此您需要修改输出以关闭引号并将字符串添加在一起,如下所示:

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

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

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

        • 转义有效,因为您处于 Javascript 的上下文中,因此反斜杠由 Javascript 处理,插入页面的最终生成的 HTML 将不包含它。

        • 实体之所以有效,是因为 HTML 将实体转换为映射字符,因此 HTML 页面中的 &amp;#039 与单引号相同,即使在本例中的属性值内也是如此。

        • URL 编码有效,因为浏览器在加载 URL 时会对其进行翻译。

        在这种情况下,我建议 URL 编码是正确的解决方案,因为它用于 URL。原因是,虽然所有解决方案都适用于给定的示例,但如果您有任何包含问号或 & 符号 (&amp;) 或其他一些保留字符的示例,那么 URL 编码将是唯一的解决方案将在这些情况下工作。另一方面,如果您要在另一个上下文中显示 HTML 页面中的输出,那么实体就是要走的路。如果只在 Javascript 中使用它,那么 JSON 就是答案。

        但你说他们都没有成功。我的问题是:你真的尝试过吗?您是否运行了代码并且图形无法加载?它对我有用。另一方面,如果他们确实工作了,但仍然没有“成功”,那么你真正想要的是什么?

        我的猜测是,您的实际意思是您希望在那里得到一个简单的引号字符,但让它神奇地工作。那不可能发生;报价必须以某种方式转义才能正常工作,但他们的用户永远不会看到转义的版本,因此无需担心。

        事实上,您应该对输入或输出的所有字符串进行转义或编码,以便无效字符起作用。否则 O'Brien 先生将难以在您的网站中输入他的名字,如果他管理它,您之后将无法显示它。

        【讨论】:

        • 感谢您的回复。正如你在下面看到的,我举了一些例子并尝试了每一个。不幸的是,地图没有按预期显示。因为每个人似乎都很有信心它应该会起作用,所以我今天晚些时候再试一次。再次感谢您的反馈!
        【解决方案7】:

        不幸的是,上述解决方案都没有成功。

        <?
            $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">
        

        【讨论】:

        • 不管你怎么说,我认为这些解决方案中的大多数都是有效的。我在 cmets 部分没有足够的空间来解释它们,所以我会发布一个新的答案......
        猜你喜欢
        • 2017-04-05
        • 1970-01-01
        • 1970-01-01
        • 2012-10-02
        • 1970-01-01
        • 2013-05-13
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多