将用户提供的javascript代码从网页表单存储到数据库时的安全性
假设有一个在线编码平台,允许用户输入代码并在网页表单中提交代码。它还通过将代码存储在数据库中来显示以前输入的代码。如何确保恶意代码不会同时在前端和后端执行?安全性需要考虑哪些因素 我知道如何维护和实施-将用户提供的javascript代码从网页表单存储到数据库时的安全性,java,jquery,mongodb,security,Java,Jquery,Mongodb,Security,假设有一个在线编码平台,允许用户输入代码并在网页表单中提交代码。它还通过将代码存储在数据库中来显示以前输入的代码。如何确保恶意代码不会同时在前端和后端执行?安全性需要考虑哪些因素 我知道如何维护和实施- 会话劫持 XSS攻击 CSRF SQL注入 加密用户密码 中人攻击 我的问题是找出还需要做什么,以阻止用户提供的代码在我的后端执行。任何我能读到的有趣的话题 加密/编码代码文本并以加密格式存储它们是否有帮助?还是建议将代码文本存储在服务器上的不可执行文件中,为每个用户动态创建它们?我将至少给出部
加密/编码代码文本并以加密格式存储它们是否有帮助?还是建议将代码文本存储在服务器上的不可执行文件中,为每个用户动态创建它们?我将至少给出部分答案: 为了
- SQL语句:使用准备好的语句李>
- XSS攻击:看看可信类型,它在大多数浏览器上都没有被激活,因此你必须找人为你实现一个好的CSP,这可以降低风险
- CSRF:使用CSRF令牌
- 加密用户密码:使用安全散列,并结合盐和胡椒
干杯使用MongoDB作为数据存储的在线编码平台等服务存在以下风险:
eval()
方法:
let str = '2 + 2';
console.log(eval(str)); //4
如果用户提供了str
,攻击者可以传递一些恶意代码
在Java中,执行或评估脚本并不常见
因此,除非您执行用户提供的代码,否则您是安全的
尽管仍然可以像以前一样在服务器端执行用户提供的代码。因为此代码必须在隔离的沙箱中执行,例如隔离的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;
}
});
此外,如果使用Java对象文档映射器,则是安全的
使用具有已知漏洞的组件
攻击者可以尝试利用您使用的平台或框架(JDK、Spring framework等)中的漏洞进行攻击,例如,OpenSSl中著名的漏洞
因此,使用最新版本的平台和框架并应用所有安全补丁非常重要
使用Maven或Gradle插件甚至使用CLI-扫描Java库有一个很好的工具。它会自动扫描所有依赖项,并在发现漏洞时准备和发出警报
不安全反序列化
重要的是使用一些众所周知的数据格式,如JSON,并使用成熟稳定的库进行反序列化(Jackson或Gson),而不是手动解析输入,特别是使用
eval()。坦白地说,你需要一个经验丰富的专业程序员(或他们的一个小团队)来构建这样一个使用起来相当安全的系统。嗨@Delighted0d,我更新了问题的细节。谢谢。您使用的是SQL还是Mongo?后者不是关系数据库。要再次使用SQL注入几乎是不可能的。@AlexBlex:谢谢您的回复。我正在使用mongodb。好的,SQL注入已经结束。如何防止用户提交的代码在后端执行。我的问题与使用的数据库无关。业界其他人都做了些什么来避免它?如果您担心从合法表单提交并存储在mongo中的代码的执行,那么您是安全的。这只是一根绳子。除非您自己尝试在后端运行此代码,否则此功能本身是无害的。它可以与其他漏洞一起用于受损系统。它与在数据库中存储传入数据的任何其他请求处理程序没有什么不同。用户粘贴到我的网页上的代码的安全性如何。我应该如何在后端存储它,以防止它以任何代价被执行。我认为您应该能够像存储任何其他数据一样存储它。但是,当您将给定的用户数据(无论是否为代码,这都是正确的,因为所有输入都是有害的)反映到您的网页上时,您必须特别小心。在阅读了当前接受的答案后,我还想补充一点,就是不要使用MongoDB或其他NoSQL环境-您在这里遇到了与SQL相同的漏洞,更糟糕的是。使用Django作为后端框架(阅读文档以获得特殊提示,您必须自己注意安全性),并将其配置为使用一些SQL数据库,如PostgresSQL(或者不使用,我认为标准是MySQL)。另外,读一些网络安全方面的书——或者至少是对你来说很重要的部分——我可以推荐Michal Zalewski的《混乱的网络》,我不会参考
collection.find(and(gt("i", 50), lte("i", 100))).forEach(printBlock);