我正在使用webapp接受将项目添加到mongoDB实例的请求。
这令人惊奇,因为它允许与其他服务兼容。
我目前有两个问题:
我对所有查询元素进行检查。不幸的是,无论我如何检查它们,它们似乎总是以字符串形式传递,是否有任何方法可以接受int类型。
除了使用check来验证json查询的结构外,还有什么我可以用来避免跨站点注入的? (XSS)
这对我来说至关重要,因为此查询中的项目将传递到我的数据库中
如上所述,当结构不完美时,我确实使用了check并抛出错误,我意识到仅仅因为结构正确并不意味着内容不能用于XSS攻击>
针对以下请求
WebApp.connectHandlers.use('/request', (req, res, next) => {
//check validity of the query
try{
var matchTest = check(req.query, {
token : String,
id : String,
timeStamp : String,
item : String,
anotherItem : String
});
}catch (err){
res.writeHead(406);
res.end(`request failed check`);
}
//check validity of the token
try{
//is it a good idea to use req.query.token? or should I stringify it first?
validateToken(req.query.token);
}
catch(err) {
res.writeHead(401);
res.end(`Invalid Token`);
}
//finally save information needed to DB
myCollectionName.insert(req.query);
res.writeHead(200);
res.end(`request Passed!`);
});
我要实现的目标是避免xss的可靠方法,也许还可以执行检查以验证(例如,令牌)实际上是一个整数并且其中没有字母,依此类推
答案 0 :(得分:1)
首先,您应转义HTML特殊字符<
,>
,"
,&
。将它们替换为<
,>
,"
,&
。
但是那个might not be enough。还要检查OWASP XSS cheat sheet是否存在潜在威胁。
您可以做的另一件事是实现CSP标头,以阻止所有未经您设置的内容批准的内容。 Google和Mozilla指南。 此外,XSS-Protection标头也可以有所帮助。
问题的第二部分..要验证输入,您很可能应该使用正则表达式。
答案 1 :(得分:0)
所以cray的答案中包含了在正确的路径发送我的信息。
为了向最终落在这里的人澄清一下,我最终使用了流星检查来确保收到的所有内容都是字符串。并且完全在我需要的结构之内,即未添加其他查询项。
var matchTest = check(req.query, {
token : String,
id : String,
timeStamp : String,
item : String,
anotherItem : String
});
然后我继续使用正则表达式检查其中是否有不良字符(实际上非常简单)
try{
var itemToCheck = "hello{console.log(\"attemptingSomething\")}";
const pattern = /\W/g; //Checks for any non word characters, anything that is not letters or numbers
return pattern.test(itemToCheck); //will return true if something,in this case, bad is found
}
catch(e){
if(e) throw e;
}