首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保护AJAX请求的方法是什么?

保护AJAX请求的方法是什么?
EN

Stack Overflow用户
提问于 2014-02-19 15:38:03
回答 3查看 4.4K关注 0票数 1

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

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

是否值得去使用SSL (因为这里没有超安全的东西,而且我每分钟收到1000 s的请求)?我是一个数据安全新手,所以请指导我。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-19 16:05:20

最终,您无法从屏幕删除.阅读更多中保护任何公共资源,但是如果您只想添加一个基本的保护层,不让某人编写直接访问的站点API,那么您可以在AJAX请求上设置一个单用 CSRF 令牌,另外一个明智的步骤是不要使用GET和使用POST。

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

代码语言:javascript
复制
<?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请求。然后取消设置会话键以停止多个请求,或者您可以为后续请求返回新的键(如果您的轮询)。

代码语言:javascript
复制
<?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%,但会停止大多数。

票数 2
EN

Stack Overflow用户

发布于 2014-02-19 15:52:07

好吧,你可以看看这个领域的一些大球员。要从Google等访问服务,您需要一个API密钥,作为一种简单的身份验证形式。这可以作为参数传输,也可以作为HTTP报头传输。

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

请记住,不建议将GET用于这类信息,因为否则API密钥在代理日志中是可读的。

票数 0
EN

Stack Overflow用户

发布于 2014-02-19 15:56:15

您应该验证传入的URL。你可以这样做:

  • 验证提供的URL是有效的URL
  • 不允许某些URL,如IP地址(只有在未分类的情况下)
  • 如果可以,则要求客户端使用帐户进行身份验证,如果发出一些无效请求,则可以自动禁止该帐户。在这种情况下,您需要SSL。
  • 限制每个客户端每秒的请求数量,以防止拒绝服务和不合理的资源消耗
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21885257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档