2010-07-20 29 views
0

我有一个网站,其中所有的页面都通过index.php处理,其中包含取决于请求的URL(这通过mod_rewrite完成)的不同PHP文件。JS中的函数动态评估(这是安全的吗?)

我用下面的方法,在页面加载到执行特定的功能:

的index.php

<script type="text/javascript"> 
readyFns = Array(); 
</script> 

<?php 
// Do some stuff here, and pull the name of the PHP page to include from the DB 
include $pageToInclude 
?> 

<script type="text/javascript"> 

    commonFunctionToApplyToAllThePages(); 
    otherCommonFunction(); 

    // page-specific functions 
    for (i=0; i<readyFns.length; i++) 
    { 
    if (typeof(window[readyFns[i]]) == "function") 
     window[readyFns[i]](); 
    }  
</script> 

includedPage.php

<?php 
// Generate page 
?> 
<script type="text/javascript"> 
readyFns.push("someFunction"); 
readyFns.push("someOtherFunction"); 
</script> 

我很喜欢这种方法,因为我只需要在这个页面的末尾设置readyFns和所有的东西否则将被index.php很好地控制。 我的问题是:这是安全的吗?它可能对某个人产生链接的敏感,该链接任意设置readyFns指向一些恶意代码,然后链接到我的网站? 我会如何预防?

感谢 尼科

回答

1

这很有趣。原则上,这可能是好的,但你有点担心。这只是编译一个键列表来查找作为对象的函数,并执行,所以它在这方面不是一个真正的安全问题。但是,您基本上提供了像这样的所有全局变量的访问权限。你可能会更好做一个全局对象除了window存储您的功能上,像这样:

var funcs = {}; 
funcs.someFunction = function() {/*blah*/}; 
funcs.someOther = function() {/*blah*/}; 

,然后你readyFuncs事情会遍历funcs而不是window。我不认为过去会有什么担心的。

当然,您的方法还有其他一些可以改进的地方,但我认为如果它适合您,它就可以。

+0

感谢您的回答,但不会只是移动问题?我的意思是,可以在'functs'中定义一个恶意函数,而不是主范围,否?或者我错过了什么? – nico 2010-07-20 21:58:12

+0

这在技术上是可行的,但它不值得担心。我把它从窗口移出来,所以你不能像'setTimeout'或'alert'那样访问内建插件。 – bcherry 2010-07-22 22:06:52