2

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

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

显然,我将检查并插入寄存器全局问题等,但是否还有其他可能由此产生的漏洞?考虑到 100,000+ 人将使用此脚本查看页面。

4

2 回答 2

5

不,服务器会像解析任何其他 PHP 文件一样解析它。

该文件将由 HTTP 请求检索,与任何其他网页完全相同。如果您包含它,<script>它将通过 GET 请求检索,但这并不能阻止好奇的用户向它发布信息。您需要使用与任何其他 PHP 脚本相同的预防措施 - 不多也不少。

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

只要您不留下将javascript注入文件的方法,就可以了。只要确保不信任输入和转义输出。

于 2009-09-14T09:22:36.913 回答
1

是否还有其他可能由此产生的漏洞?

在 PHP 本身中,将值输出到 JavaScript 需要与输出到 HTML 不同的编码方案。如果你没有做对,你就会面临与没有htmlspecialchars()在生成 HTML 的 PHP 中使用相同类型的跨站点脚本问题:

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>

最后,您将不得不处理缓存。如果您的数据是高度动态的,您需要在脚本响应上设置 no-cache 标头,以便浏览器不会缓存它。另一方面,对于更改频率较低的数据,您希望处理过期、etag 和 if-modified-since/not-modified 标头,以便浏览器可以更有效地缓存;如果您可以提供帮助,您不希望有 100,000 人一次又一次地获取脚本,从而导致服务器负载。

正确处理缓存可能会很痛苦,当你弄错时会产生奇怪的结果。

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

于 2009-09-14T11:20:42.177 回答