我目前正在构建一个框架,其中例如form
submit
被实现为jQuery
ajax
调用.php
(服务)文件。
jQuery
的一部分供参考:
var dataSerialized = $(form).serialize();
var service = $(form).attr("action");
$.ajax({
url: "services/" + service + ".php",
data: dataSerialized,
type: "POST",
cache: false,
dataType: "json",
success: function(json) {
$(json).each(function() {
loadPage(this.callback);
});
},
error: function(json, message) {
finalError(message);
}
});
.php
目前只做了:
include_once("../content/includes/connect.php");
include_once("_functions.php");
//TODO: support sending variables
$check = true;
$callback = "error";
foreach ($_POST as $key => $value) {
list($pass, $errormessage) = checkRules("register", $key, $value);
if (!$pass) {
$check = false;
$callback = "error";
break;
}
}
if ($check) {
$callback = "register_success";
}
echo json_encode(array(
"callback" => $callback
));
SQL::close();
现在我希望服务电话尽可能安全,根据我的情况,我看到以下选项:
$_SERVER
个变量可用于帮助保护服务.php
页面,但不可靠。$_SESSION
可用于生成令牌。我已经实施了一项简单的衡量标准:将GET
更改为POST
。这只会阻止最容易的攻击,现在攻击者实际上需要使用一些篡改工具,而不是直接通过浏览器来实现。
我认为我可以保护来自浏览器中输入的URL
的每个来电,但我看到两个严重的威胁:
jQuery
请求。我认为在这种情况下再次尝试使用.php
令牌保护服务$_SESSION
页面是最好的,但我该如何解决这些问题?
需要在服务呼叫之前将它们设置为某个时间点,然后服务呼叫可以检查它
我还可以访问网站空间中的MySQL
数据库,当然还有纯文本文件。
任何人都可以帮助我吗?
答案 0 :(得分:0)
将csrf令牌与表单一起发送,并在.php
文件中使用此类内容
session_start();
if ($_SERVER['HTTP_X_CSRF_TOKEN'] !== $_SESSION['csrfToken']) {
return false;
die();
}
使用所有服务电话发送CSRF令牌
$.ajaxSetup({
headers: {
'X-Csrf-Token': "TOKEN HERE"
}
});