将用户提供的javascript代码从网页表单存储到数据库时的安全性

问题描述 投票:1回答:2

假定一个在线编码平台,该平台允许用户输入代码并以网页形式提交代码。通过存储在数据库中,它还显示了先前输入的代码。如何确保恶意代码不会同时在前端和后端执行?安全性需要考虑哪些方面。

我知道维护和实施-

  1. 会话劫持
  2. XSS攻击
  3. CSRF
  4. SQL注入
  5. 输入用户密码
  6. 中级攻击者

我的问题是找出需要做的其他事情,以阻止用户提供的代码在我的后端执行。我可以阅读的任何有趣的话题。

对代码文本进行加密/编码并以加密格式存储它们会有所帮助吗?还是建议将代码文本存储在服务器上的非可执行文件中,为每个用户动态创建它们?

java jquery mongodb security
2个回答
0
投票

我至少会给您一部分答案:

对于

  • SQL语句:使用准备好的语句!
  • XSS攻击:查看受信任的类型,但是在大多数浏览器中并未激活该类型,因此,您将必须找到某人来为您实施良好的CSP,从而降低了风险。
  • CSRF:使用CSRF令牌

  • 加密用户密码:使用安全的哈希,结合盐和胡椒粉!

  • 中级攻击者:使用HTTPS证书并使用HSTS在您的站点上强制执行https。

请注意,这是我刚刚为您写的答案,很抱歉。您可以看看一些主题。总是有很多要考虑的问题,并且一切都会在您的应用程序上增加一个额外的(可能是逃避的)安全层。

我可以向您推荐Django,这是一个后端框架,已经非常关注安全性。

欢呼声


0
投票

[使用MongoDB作为数据存储的在线编码平台之类的服务存在以下风险:

代码注入

攻击者注入了由应用程序解释/执行的代码。例如,JavaScript eval()方法:

let str = '2 + 2';
console.log(eval(str)); //4

如果用户提供str,则攻击者可以传递一些恶意代码。

在Java中,执行或评估脚本并不常见。

因此,除非执行用户提供的代码,否则您是安全的。

尽管仍然可以像https://ideone.com/一样在服务器端执行用户提供的代码。对于此代码,必须在隔离的沙箱中执行,例如隔离的Docker容器。

此外,您也可以通过用户提供的Gzip代码和/或在Base64中进行编码,并以此方式将其存储在数据库中。

NoSQL注入

以下查询易受注入攻击:

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-mongodbhttps://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方法或其他语言的替代方法。

© www.soinside.com 2019 - 2024. All rights reserved.