保护AJAX请求的方法有哪些?

时间:2014-02-19 15:38:04

标签: php ajax security

我有一个客户端进行AJAX调用以对URL进行分类。它将调用myserver.php?url = facebook.com,服务器将响应Social。没有涉及密码,只有一个URL字符串,服务器将为其返回一个类别。

我们为网址类别构建了一个大型数据库,我不希望有人调用此API并窃取数据。有什么方法可以确保我在服务器上获得的请求是我的客户端?是否会在服务器端设置每个IP工作的请求限制?

是否值得使用SSL(因为没有涉及超安全的内容,我每分钟会收到1000个请求)?我是数据安全新手,所以请指导我。

3 个答案:

答案 0 :(得分:0)

那么你可以看看这个领域的一些大玩家。要从Google等访问服务,您需要一个API密钥,作为一种简单的身份验证形式。这可以作为参数或HTTP-Header传输。

SSL有助于防止窃听API密钥。

请记住,建议不要使用GET来获取此类信息,因为API密钥在代理日志等中是可读的。

答案 1 :(得分:0)

您应验证传入的网址。您可以执行以下操作:

  • 验证提供的网址是否为有效网址
  • 禁止某些网址,例如IP地址(仅当这些网址未被分类时)
  • 如果可以,请求客户使用帐户进行身份验证,如果发出了一些无效请求,您可以自动禁止该帐户。 在这种情况下,您需要SSL。
  • 限制每个客户端每秒的请求数以防止拒绝服务和不合理的资源消耗

答案 2 :(得分:0)

最终,您无法保护屏幕报废中的任何公共资源...... Read More,但如果您希望只为某人添加一个基本的保护层,只需编写直接访问的内容/ strong>您的网站API,然后您可以在AJAX请求上设置单次使用CSRF令牌,同样明智的一步是不使用GET并使用POST。

这是一个快速示例,在客户端加载页面时,您将一些令牌设置到会话中,并将令牌添加到AJAX中:

<?php 
session_start(); 
$_SESSION['csrf_ajax_key'] = sha1(uniqid());
$_SESSION['csrf_ajax_val'] = sha1(uniqid());
?>
<!DOCTYPE html>
<html>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>

<body>

<span id="result">Ajax response goes here...</span>

<script>
var request = $.ajax({
    type: "POST",
    url: "yourAPI.php",
    data: {"url":"facebook.com", "<?php echo $_SESSION['csrf_ajax_key'];?>":"<?php echo $_SESSION['csrf_ajax_val'];?>"}
});
request.done(function(response) {
    $("#result").html(response);
});
request.fail(function(jqXHR, textStatus, errorThrown) {
    console.log(textStatus, errorThrown);
});
</script>

</body>
</html>

然后在您的API上执行一些简单的检查以检查密钥是否已设置,它是一个xmlhttprequest(AJAX)并且是一个POST请求。然后取消设置会话密钥以停止多个请求,或者您可以为后续请求(如果您的轮询)返回新密钥

<?php 
session_start();

if(
    //Check required variables are set
    isset($_SESSION['csrf_ajax_key']) &&
    isset($_SESSION['csrf_ajax_val']) &&
    isset($_POST[$_SESSION['csrf_ajax_key']]) &&
    isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&

    //Check is AJAX
    strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest' &&

    //Check is POST
    $_SERVER['REQUEST_METHOD'] === 'POST' &&

    //Check POST'ed keys match the session keys
    $_SESSION['csrf_ajax_val'] == $_POST[$_SESSION['csrf_ajax_key']]
){
    //good - example
    if(isset($_POST['url']) && $_POST['url']=='facebook.com'){
        echo 'This is the response for facebook.com';
    }

}

//Unset to stop multiple attempts
unset($_SESSION['csrf_ajax_val'], $_SESSION['csrf_ajax_key']);
?>

虽然它不是100%但会停止最多。