2017-04-02 72 views
0

我在ajax文件中使用eval()函数,该函数允许我从Javascript调用函数(类似于Securely calling PHP code from JavaScript);Php如何验证字符串是用于安全验证的特定函数

我有大约20个功能,我希望能够使用。我不想传入恶意代码。我如何验证传入的字符串是我的函数之一,仅此而已?

+0

为什么不在你的php中使用你的函数,而javascript只是传入一个值,指示你的哪个函数应该运行? – Andrew

+0

@Andrew这就是我正在谈论的事情。我想知道如何验证它是一个函数,让黑客获得对该ajax文件的访问权限。我不希望人们通过字符串传递并在不是我的某个函数时执行它们。 – Wyatt

+0

这取决于环境;如果你的网站是用户控制的,每个人都必须登录;那么你可以让会话和cookie为你做验证。您还可以使用'addslashes'和'htmlspecialchars'函数来过滤传入的字符串,以减少恶意数据通过的机会。 –

回答

2

通过使用eval来实现这一点,您正在过度复杂化。您可以简单地在服务器端定义您的功能,并使用简单的开关盒切换到正确的功能。这样你就不必担心安全相关的问题。

的jQuery:

function callPhp(func, callback){ 
    $.ajax({ 
    type: 'GET', 
    url: 'callPhp.php', 
    data: {action:'register'}, 
    success: function (data) { 
     data = JSON.parse(data); 
     callback(data); 
    } 
}); 
} 

PHP:

<?php 

$action = $_GET['action']; 

switch ($action) { 
    case "register": 
     register_user(); 
     break; 
    case "login": 
     login(); 
     break; 

?> 

如果你真的想用eval,这一点我非常不鼓励你使用,你可以简单地实现一种白名单应该在服务器端执行的方法名称。

<?php 

$whiteListMethod = array('register', 'login', 'forgotPassword'); 
$action = $_GET['action']; 

// Is the user supplied function present in my whitelist? 

if(in_array($action,$whiteListMethod)){ 

    // You can call this method safely 

}else{ 

    // Hack attempt detected 

} 
+0

这将工作,除了一个问题。如果我的功能每个都有自己的设置/参数数量呢? – Wyatt

+0

如果每个函数的参数不同,则可以简单地创建一个多维数组。 –

0

您可以使用@Hyder B是方法。我个人认为这是最好的选择,如果你只是想调用一个函数。此外,如果您担心有人访问您的ajax文件(除了通过浏览器的源代码阅读器查看);他们也可以访问函数文件,以便在服务器上进行改进。但是,您可以通过添加这种直接阻止试图加载功能文件的人:

<?php 
 
if (count(get_required_files()) <= 1) { 
 
    header("location: ./index.php"); 
 
} 
 
?>

如果文件被直接访问将重定向用户。

+0

你应该编辑@HyderB的帖子,因为这不是一个单独的答案。 – Nytrix

+0

如果函数的参数不同,该怎么办? – Wyatt

+0

我相信你也可以通过ajax传递参数。看看下面的链接。 http://stackoverflow.com/questions/18697034/how-to-pass-parameters-in-ajax-post –