我有一个客户端进行AJAX调用以对URL进行分类。它将调用myserver.php?url = facebook.com,服务器将响应Social。没有涉及密码,只有一个URL字符串,服务器将为其返回一个类别。
我们为网址类别构建了一个大型数据库,我不希望有人调用此API并窃取数据。有什么方法可以确保我在服务器上获得的请求是我的客户端?是否会在服务器端设置每个IP工作的请求限制?
是否值得使用SSL(因为没有涉及超安全的内容,我每分钟会收到1000个请求)?我是数据安全新手,所以请指导我。
答案 0 :(得分:0)
那么你可以看看这个领域的一些大玩家。要从Google等访问服务,您需要一个API密钥,作为一种简单的身份验证形式。这可以作为参数或HTTP-Header传输。
SSL有助于防止窃听API密钥。
请记住,建议不要使用GET来获取此类信息,因为API密钥在代理日志等中是可读的。
答案 1 :(得分:0)
您应验证传入的网址。您可以执行以下操作:
答案 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%但会停止最多。