假定一个在线编码平台,该平台允许用户输入代码并以网页形式提交代码。通过存储在数据库中,它还显示了先前输入的代码。如何确保恶意代码不会同时在前端和后端执行?安全性需要考虑哪些方面。
我知道维护和实施-
我的问题是找出需要做的其他事情,以阻止用户提供的代码在我的后端执行。我可以阅读的任何有趣的话题。
对代码文本进行加密/编码并以加密格式存储它们会有所帮助吗?还是建议将代码文本存储在服务器上的非可执行文件中,为每个用户动态创建它们?
我至少会给您一部分答案:
对于
CSRF:使用CSRF令牌
加密用户密码:使用安全的哈希,结合盐和胡椒粉!
请注意,这是我刚刚为您写的答案,很抱歉。您可以看看一些主题。总是有很多要考虑的问题,并且一切都会在您的应用程序上增加一个额外的(可能是逃避的)安全层。
我可以向您推荐Django,这是一个后端框架,已经非常关注安全性。
欢呼声
[使用MongoDB作为数据存储的在线编码平台之类的服务存在以下风险:
攻击者注入了由应用程序解释/执行的代码。例如,JavaScript eval()
方法:
let str = '2 + 2';
console.log(eval(str)); //4
如果用户提供str
,则攻击者可以传递一些恶意代码。
在Java中,执行或评估脚本并不常见。
因此,除非执行用户提供的代码,否则您是安全的。
尽管仍然可以像https://ideone.com/一样在服务器端执行用户提供的代码。对于此代码,必须在隔离的沙箱中执行,例如隔离的Docker容器。
此外,您也可以通过用户提供的Gzip代码和/或在Base64中进行编码,并以此方式将其存储在数据库中。
以下查询易受注入攻击:
const query = {
username: req.body.username,
password: req.body.password
}
db.collection('users').findOne(query, function (err, user) {
console.log(user);
});
因为用户可以传递以下参数:
{
"username": {"$ne": null},
"password": {"$ne": null}
}
并且查询将返回第一个用户而不知道其用户名或密码。
[JavaScript也经过评估可以允许更高级的条件时,这特别危险。
db.myCollection.find( { $where: function() { return obj.credits - obj.debits < 0; } } );
https://zanon.io/posts/nosql-injection-in-mongodb和https://medium.com/better-programming/little-bobby-collections-how-to-write-a-mongodb-injection-ad58a4e2d754中的更多详细信息>
解决方案是仅接受来自用户的字符串,而不接受对象或清理输入(例如,使用mongo-sanitize)。它主要与Node.js相关。 MongoDB Java Driver提供了另一个API,该API通过设计解决了某些类型的注入(类似于JDBC PreparedStatement
):
collection.find(and(gt("i", 50), lte("i", 100))).forEach(printBlock);
此外,如果使用Java对象文档映射器Morphia,则很安全。
攻击者可以尝试利用您使用的平台或框架(JDK,Spring框架等)中的漏洞,例如,OpenSSl中著名的Heartbleed漏洞。
因此,使用最新版本的平台和框架并应用所有安全补丁非常重要。
[使用Maven或Gradle插件甚至使用CLI-OWASP Dependency Check扫描Java库的强大工具。它会自动扫描所有依赖项,并在发现漏洞时进行准备并发出警报。
重要的是使用一些著名的数据格式(如JSON,并使用成熟且稳定的库进行反序列化(Jackson或Gson),而不是手动解析输入,特别是使用eval()
JavaScript方法或其他语言的替代方法。