- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
嘿伙计们,我已经在这个问题上呆了一个星期了,但我不太明白。
我正在构建一个移相器游戏,并使用 Node 设置了一个记分板,这是我第一次使用 Node ,我不太清楚如何使用 csurf,因为文档非常困惑。
ForbiddenError: invalid csrf token
at verifytoken (/Users/jorybraun/web/highscore/node_modules/csurf/index.js:269:11)
at csrf (/Users/jorybraun/web/highscore/node_modules/csurf/index.js:97:7)
at Layer.handle [as handle_request] (/Users/jorybraun/web/highscore/node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/Users/jorybraun/web/highscore/node_modules/express/lib/router/index.js:312:13)
at /Users/jorybraun/web/highscore/node_modules/express/lib/router/index.js:280:7
at Function.process_params (/Users/jorybraun/web/highscore/node_modules/express/lib/router/index.js:330:12)
at next (/Users/jorybraun/web/highscore/node_modules/express/lib/router/index.js:271:10)
at /Users/jorybraun/web/highscore/app.js:43:5
at Layer.handle [as handle_request] (/Users/jorybraun/web/highscore/node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/Users/jorybraun/web/highscore/node_modules/express/lib/router/index.js:312:13)
每次我尝试从索引路由向我的路由得分路由发送 jquery post 请求时,都会收到 403 错误。我真的很喜欢限制对路由的访问,这样除非您发出内部 ajax 请求,否则您实际上无法访问它们。
这是我的 app.js 文件
// app.js
var mongodb = require('mongodb');
var monk = require('monk');
var credentials = require('./credentials');
var db = monk(credentials.uri);
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var csrf = require('csurf');
var loadCsrf = csrf({ cookie: true })
var parseForm = bodyParser.urlencoded({ extended: false })
var scores = require("./routes/scores");
var routes = require('./routes/index');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(loadCsrf);
app.use('/', routes);
app.use('/scores', scores);
索引路由index.js
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { csrfToken: req.csrfToken() })
});
评分路线scores.js
// scores.js
var express = require('express');
var router = express.Router();
// GET scores, sorted by time
router.get('/', function(req, res) {
console.log('GET scores');
// Get the database object we attached to the request
var db = req.db;
// Get the collection
var collection = db.get('scores');
// Find all entries, sort by time (ascending)
collection.find({}, { sort: { score : 1 } }, function (err, docs) {
if (err) {
// Handle error
console.error('Failed to get scores', err);
res.status(500).send('Failed to get scores');
} else {
// Respond with the JSON object
res.json(docs);
}
});
});
// GET a number of top scores
// (the /top route without a number won't work unless we add it)
router.get("/top/:number", function(req, res) {
console.log("GET top scores");
// Read the request parameter
var num = req.params.number;
var db = req.db;
var collection = db.get("scores");
// Get all scores, but limit the number of results
collection.find({}, { limit: num, sort: { score : 1 } }, function(err, docs) {
if (err) {
console.error("Failed to get scores", err);
res.status(500).send("Failed to get scores");
} else {
res.json(docs);
}
});
});
// POST a score
router.post("/", function(req, res) {
module.exports = router
console.log("POST score");
var name = req.body.name;
var score = Number(req.body.score);
var email = req.body.email;
if (!(name && score)) {
console.error("Data formatting error");
res.status(400).send("Data formatting error");
return;
}
var db = req.db;
var collection = db.get("scores");
collection.insert({
"name": name,
"score": score,
"email": email
}, function(err, doc) {
if (err) {
console.error("DB write failed", err);
res.status(500).send("DB write failed");
} else {
// Return the added score
res.json(doc);
}
});
});
module.exports = router;
Phaser Canvas 中的 Ajax 请求, 函数提交(){
var name = prompt("Please enter your name");
var email = prompt("Please enter your email adress, this will not be featured on the scoreboard");
var csrf_token = "#{csrfToken}";
$("body").bind("ajaxSend", function(elm, xhr, s){
if (s.type == "POST") {
xhr.setRequestHeader('X-CSRF-Token', csrf_token);
}
});
$.post({
url: 'http://localhost:3000/scores/',
data: {
name: name,
email: email,
score: score
},
success: function(data) {
console.log('Score posted', data);
},
error: function(xhr, msg) {
console.error('AJAX error', xhr.status, msg);
}
});
}
这会导致如下错误:
n.ajaxTransport.l.cors.a.crossDomain.send @ jquery.min.js:4
n.extend.ajax @ jquery.min.js:4
n.each.n.(anonymous function) @ jquery.min.js:4
submit @ game.js:263
c.SignalBinding.execute @ phaser.min.js:8
c.Signal.dispatch @ phaser.min.js:8
c.Button.onInputUpHandler @ phaser.min.js:12
c.SignalBinding.execute @ phaser.min.js:8
c.Signal.dispatch
我尝试了很多不同的选项,但如果有人可以帮助我找到一个简单的解决方案,那就太棒了!
谢谢
最佳答案
好吧,我明白了为什么这不起作用 - 我已经浏览了大量的 stackoverflows 和教程,每个人都说将其设置在标题中。我还没有对此进行测试,但我认为您需要使用不同的 csrf token 才能使 head 正常工作。该 token 设置在正文中:
res.render('index', { csrfToken: req.csrfToken() })
它正在寻找以 _csrf 作为正文中的 key 的 key 对值。目前正在运行:
var csrf_Token = getCsrfToken();
function getCsrfToken() {
var metas = document.getElementsByTagName('meta');
for (i=0; i<metas.length; i++) {
if (metas[i].getAttribute("name") == "_csrf") {
return metas[i].getAttribute("content");
}
}
return "";
}
$.post({
url: 'http://localhost:3000/scores/',
data: {
_csrf: csrf_Token,
name: name,
email: email,
score: score
},
success: function() {
console.log('Score posted');
},
error: function(xhr, msg) {
console.error('AJAX error', xhr.status, msg);
}
});
如果有人可以帮助我找到另一种方法来完成这项工作,我会很高兴,因为通过元标记将 token 传递给客户端似乎并不是最好的方法。
关于javascript - forbiddenError/403 Ajax Express Csurf - 如何正确使用 Csurf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32060393/
尝试了基本的位置检索代码(如下所示) String uri = "https://management.core.windows.net/"; String subscriptionI
我试图让 csurf 工作,但似乎偶然发现了一些东西。到目前为止的代码如下所示: 索引.ejs . . 在表单中输入密码和
我读了很多关于该主题的帖子,但似乎没有一个对我收到的错误消息“ForbiddenError:无效的 csrf token ”有帮助。 从下面的入口app.js文件中可以看到,我在session中设置了
我正在修改 this GitHub sample app使用 Express 而不是 KOA。但是当 Express 中的 / 路由尝试加载 index.html 时,我收到了 Access Deni
嘿伙计们,我已经在这个问题上呆了一个星期了,但我不太明白。 我正在构建一个移相器游戏,并使用 Node 设置了一个记分板,这是我第一次使用 Node ,我不太清楚如何使用 csurf,因为文档非常困惑
我正在使用csurf在我的express项目。我有 3 个文件: app.js - 主入口点 routes/index.js - 索引路线 routes/users.js - 用户路由 使用 expr
尝试使用 Windows PowerShell 设置 Azure 订阅时遇到错误。 Set-AzureSubscription -SubscriptionName $azureSubscripti
我有这个代码: def save_to_gcs(self, img, img_obj): ''' Image data, Image metadata object -> Blob K
我有经过身份验证的用户和联合 ID。但是当我尝试访问 AWS IOT 的东西时,我收到了这个让我发疯的错误。 我正在关注 iot sample code .所有相关凭证也都是正确的。 `MQT
我正在开发示例应用程序,在服务器端使用 Node.js,在前端使用 Angular 2。 为了防止 CSRF 攻击,我使用了“csurf”中间件下面是设置中间件的相关代码 // cookie pars
我是一名优秀的程序员,十分优秀!