代码之家  ›  专栏  ›  技术社区  ›  Joel

使用PHP作为javascript文件-安全性?

  •  2
  • Joel  · 技术社区  · 16 年前

    在javascript中使用php文件而不是.js文件有什么问题?

    <script type='text/javascript' src='myjavascript.php'></script> 
    

    很明显,我将讨论并插件注册全局问题等,但是否还有其他可能由此产生的漏洞?考虑到超过100000人将使用此脚本查看页面。

    2 回复  |  直到 16 年前
        1
  •  1
  •   bobince    16 年前

    是否存在其他可能由此产生的漏洞?

    在PHP本身中,将值输出到javascript需要与输出到HTML不同的编码方案。如果你不正确的话,你会面临同样的跨站点脚本问题,就像你没能使用一样。 htmlspecialchars() 在生成PHP的HTML中:

    var name= '<?= $name ?>';
    
    <?php
        echo "var name='$name';"
    ?>
    

    如果你的名字包含撇号或反斜杠,这两个词都会给你带来问题。这是为数不多的几个地方之一 addslashes() 事实上,这一次可能是对的!

    另外,您应该知道,javascript文件可以包含在另一个域上的一个<script>标记中,该域通常会被拒绝访问javascript相同来源策略下的页面。如果脚本包含敏感的特定于用户的数据,则这将使您面临跨站点信息泄漏攻击:

    <script src="http://www.targetsite.com/script.php" type="text/javascript"></script>
    <script type="text/javascript">
        alert('Ha ha, I know you are logged in to targetsite.com as user '+name);
    </script>
    

    最后,您必须处理缓存。如果您的数据是高度动态的,那么您需要在脚本响应上不设置缓存头,这样浏览器就不会缓存它。另一方面,对于不太经常更改的数据,您希望处理到期、etags,如果修改了自/未修改的头,那么浏览器可以更高效地缓存;如果可以帮助的话,您不希望让10万人一次又一次地获取脚本,从而在服务器上造成负载。

    处理好缓存可能会非常痛苦,当你出错时会产生奇怪的结果。

    总之,这就是为什么PHP模板化到JavaScript中通常不受欢迎的原因。对于脚本的主体是静态的并且必须添加的数据量很小的典型用法,通常最好将数据模板化到HTML中,或者在关联元素的属性中,或者将其隐藏在可从DOM读取的注释中,或者通过包含内联脚本<script>。

        2
  •  5
  •   Greg    16 年前

    不,服务器将与任何其他PHP文件一样分析它。

    HTTP请求将检索与任何其他网页完全相同的文件。 如果你把它和 <script> 它将通过GET请求进行检索,但这并不能阻止好奇的用户向它发送消息。您需要在任何其他PHP脚本中使用相同的预防措施-不多不少。

    就浏览器而言,它只是一个javascript——它不知道它是由PHP生成的,因此没有额外的考虑。

    只要你不留下一个方法把javascript注入到文件中,你会没事的。只需确保不要信任输入和转义输出。