保护AJAX-> PHP Web服务调用

时间:2011-12-13 18:26:22

标签: php javascript ajax web-services

我正在尝试使用AJAX来确定一种保护Web服务调用的方法。 Web服务处理联系表单并调用PHP,该PHP使用mail函数发送没有HTTP请求的电子邮件。

我已在下面发布了一些代码,以便您更好地了解我的要求。我试图通过HTTP请求阻止对服务的直接调用,导致我的邮件服务器在每次请求页面时都能正常工作。

// Data is compiled into datastr...
var datastr = 
'input_name=' + encodeURI(input_name) + 
'&input_email=' + encodeURI(input_email) +
'&input_organization=' + encodeURI(input_organization) +
'&input_title=' + encodeURI(input_title) +
'&input_phone=' + encodeURI(input_phone) +
'&input_comments=' + encodeURI(input_comments);

 // AJAX is called with datastr param...
 $.ajax({
     type: "POST",
     url: "../common/contact-form-logic.php",
     data: datastr,
     cache: false,
     success: function(resp) {.... etc

这是PHP文件服务。

$input_name = urldecode($_REQUEST['input_name']);
$input_email = urldecode($_REQUEST['input_email']);
$input_organization = urldecode($_REQUEST['input_organization']);
$input_title = urldecode($_REQUEST['input_title']);
$input_phone = urldecode($_REQUEST['input_phone']);
$input_comments = urldecode($_REQUEST['input_comments']);

$to = "xxxxxxxxxxxxxxxxx";

$subject = "Contact form entry from xxxxxxxxxx.com";
$message = $input_name."\n".$input_email."\n".$input_organization."\n".$input_title."\n".$input_phone."\n".$input_comments;

if(mail($to, $subject,$message)){
    echo "1";
}

2 个答案:

答案 0 :(得分:2)

我正在教自己安全,并发现自己处于类似情况,这就是我所做的:

* 免责声明我不是安全专家,但我觉得这比没事要好......

  1. 确保有帖子
  2. 检查xmlhttprequest标头
  3. 然后我验证了HTTP_REFERER
  4. 然后我检查了我生成部分会话的令牌(下面的例子)

    session_start();
    $token = md5(uniqid(rand(), TRUE));
    $_SESSION['token'] = $token;
    
    if (isset($_SESSION['token']) && $_POST['token'] == $_SESSION['token'])
    {
        /* Valid Token */
    }
    
  5. 我针对白名单检查了$ _POST键,以确保我拥有所需的一切

  6. 这是一个例子

    // No post no dice!
    if( empty($_POST) )
        die('error no post');
    
    // Check for xmlhttprequest header
    // I want to make sure this post came from an ajax call.
    if( empty($_SERVER['HTTP_X_REQUESTED_WITH']) || strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest')
        die('error invalid ajax request');
    
    // Check to make sure the ajax request came from yourdomainhere.com
    if( strpos($_SERVER['HTTP_REFERER'], 'yourdomainhere') === FALSE )
        die('error invalid http ref');
    
    // DIE, if no token is present or token isn't equal to $_SESSION token.
    if (!isset($_POST['token']) || $_POST['token'] != $_SESSION['token'])
        die('error invalid token');
    
    // Check to make sure all POST array keys I need exist for my script
    $vars_needed = array("input_name", "input_email", "input_organization", "input_title", "input_phone", "input_comments");
    foreach($vars_needed as $need) {
        if(!array_key_exists($need, $_POST))
            die('error invalid post');
    }
    

答案 1 :(得分:0)

你想要保护什么?消息的内容或访问邮件功能?

对于前者,您需要使用HTTPS。