我有一个客户机,它发出AJAX调用来对URL进行分类。它将调用myserver.php?url=facebook.com,服务器将响应Social。没有涉及密码,只有一个URL字符串,服务器将返回一个类别。
我们为url类别构建了一个大型数据库,我不希望人们调用这个API并窃取数据。有什么方法可以确保我在服务器上得到的请求是我的客户端?是否在服务器端为每个IP设置请求限制?
是否值得去使用SSL (因为这里没有超安全的东西,而且我每分钟收到1000 s的请求)?我是一个数据安全新手,所以请指导我。
发布于 2014-02-19 16:05:20
最终,您无法从屏幕删除.阅读更多中保护任何公共资源,但是如果您只想添加一个基本的保护层,不让某人编写直接访问的站点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%,但会停止大多数。
发布于 2014-02-19 15:52:07
好吧,你可以看看这个领域的一些大球员。要从Google等访问服务,您需要一个API密钥,作为一种简单的身份验证形式。这可以作为参数传输,也可以作为HTTP报头传输。
SSL有助于防止对API密钥的窃听。
请记住,不建议将GET用于这类信息,因为否则API密钥在代理日志中是可读的。
发布于 2014-02-19 15:56:15
您应该验证传入的URL。你可以这样做:
https://stackoverflow.com/questions/21885257
复制相似问题