【问题标题】:Securing A PHP Page receiving AJAX POST and GET requests [closed]保护接收 AJAX POST 和 GET 请求的 PHP 页面 [关闭]
【发布时间】:2014-08-15 00:49:51
【问题描述】:

我有一个应用程序,其中我有一个类文件来处理我所有的 ajax POST 和 GET 请求。

  • ajax.class.php

任何人都可以推荐一种解决方案来阻止该页面接收任何恶意或未经授权的请求。我已经在使用 PDO 准备好的语句,并且还使用 PurifyHTML 类来清理一些包含 HTML 的用户输入。我主要担心有人查看我的源代码并看到我所有的表单操作都设置为“/classes/ajax.class.php”,然后尝试向它发送不需要的请求。

if($_GET['ajax'] == 'callerIdInfo'){
    $number = $_GET['number'];
    ... [RECORD TO DB]
}

if($_POST['ajax'] == 'submitTicket'){
   ... [MORE FUNCTIONS]
}

etc etc..

【问题讨论】:

  • “使用身份验证”可能是最好的答案,但这个问题方式太宽泛了。
  • 所有用户都经过身份验证。我有一个“保护”类来检查会话的正确用户级别,但我只是在寻找一些额外的安全性。我想我会在每个表单上使用令牌
  • 那个,和/或只是include/require另一个文件中的一个文件。
  • 这是一个好的开始。让我以这种方式向您提出:您认为 Facebook 是否关心您是否查看他们的页面源并查看他们的表单在哪里 POSTing ?不,因为他们有适当的身份验证程序等。
  • 如需更深入的安全相关帮助解决您的问题,我建议您前往Security.SE。他们可能不会在代码级别为您提供帮助,但他们可能会就您可以采取哪些措施来防止这些伪造请求提出一些建议。

标签: php ajax security pdo


【解决方案1】:

你可以让事情变得简单。

您可以在您的应用程序中定义一个强加密密钥:

define('TOKEN_KEY', '%b&*0D0/V%)^l76L_O4(eWm6R&tv3^d916PV+"m_}te8On8L0a4-bd1');

例如,将其放在config.php 文件中

include('config.php');
try {

    $token = $_POST['token'];
    if ($_POST['token']!==TOKEN_KEY) {
        throw new Exception('You Are not autorized '.$token);
    }

    //continue execution
    include('/classes/ajax.class.php');


} catch (Exception $e) {
    error_log('Error!',  $e->getMessage(), "\n");
    //stop execution exit 
}

因此,您可以实现类似上面的内容,但非常简单,而不仅仅是生成一个会话并检查它是否为空。

您可以将逻辑包装到函数中

function get_token() {
    return TOKEN_KEY;
}


function token_isvalid($token) {
    return $token===TOKEN_KEY;
}

用法

    if (!token_isvalid($_POST['token'])) {
        throw new Exception('Division by zero.');
    }

【讨论】:

  • 我猜你的意思是return $token===TOKEN_KEY; (one "=" too much) in function token_isvalid($token)...对吧? PHP Operators - Comparison
  • @Pixic 是的,你说得对,我修好了,谢谢
  • 呵呵...真的,你没有标记我。 =)
【解决方案2】:

我将此函数添加到我的主类中:

function generateToken() {

    if(empty($_SESSION['form']['token']))
        $_SESSION['form']['token'] = md5(uniqid(mt_rand(),true));

}

然后将其添加到我的表单中并为每个表单生成一个隐藏令牌。

<input type="hidden" name="token" value="<?php echo $_SESSION['form']['token']; ?>"/>

然后检查每个请求中的令牌

if (empty($_POST['token'])){
  return false;
} else {
    // Do AJAX
    if($_POST['ajax'] == 'submitTicket'){
    ... 
    }

}

【讨论】:

  • 重要的是要注意,有动机的恶意行为者可能会欺骗您的用户并查看他们的页面内容以检索他们的令牌,然后可以利用这些令牌发出您担心的这些虚假请求. (您可能还想花一些时间研究 SSL/TLS。)
  • 感谢现在查看一些 TLS 问题...
  • 您需要为每个新表单更改表单令牌。也给它一个超时。比如在有用的几秒钟后让它失效。阅读有关 CSRF 的信息,它附带的问题类似于您想要防止的问题:owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-12
  • 2014-05-31
  • 1970-01-01
相关资源
最近更新 更多