【问题标题】:PHP/JavaScript Security - Is JS security worthless?PHP/JavaScript 安全性 - JS 安全性一文不值?
【发布时间】:2015-09-03 19:49:01
【问题描述】:

人!

我正在考虑ERP System 的架构,这将是Single-Page App。我将向您展示我的思考过程以及我是如何得出这些问题的。

PHP 结构与推理

  • 0。 MySQL
  • 1。数据库核心
  • 2。 ERP 模块(用户验证在这里)
  • 3。输入输出
  • 4。请求

工作原理: DBCore 将提供查询数据库的 API,ERP 将是我们需要的所有业务模块,I/O 将负责翻译 ERP 响应转换为 HTML 格式,Request 将成为服务器和客户端之间的大门,将 POST 数组转换为 I/O 数组。

模块限制:模块只能在模块之后或之前与模块对话。所以,DBCore 只会与MySQLERP 交谈,ERP 只能与DBCoreI/O 交谈……等等。

安全推理:所有模块都将有一个输入和一个输出源。所以我的想法是,我可以通过每个 IO 点的一套严格的规则来准确控制进出的内容。这意味着在到达 ERPDBCore 模块上的敏感数据之前,输入将被 2 个不同的过滤器过滤,并且可以再过滤两次(一个在 ERP 内的 Auth 模块中)和DBCore 模块中的一个mysqli::real_escape_string())。

所有这些都将位于公共 WWW 文件夹之外。为了与应用程序通信,在 WWW 文件夹中会有一个文件 index.php。此页面将引导系统并在它被 POST 时启动一个请求。然后它只是将响应回显给客户端。

1。这种架构安全吗?

2。这些 IO 瓶颈是否会提高我的(潜在*)安全性?

*有可能,因为如果过滤器很糟糕,那么安全性也会很糟糕。

JavaScript 推理

然后我开始思考 JavaScript 将如何工作。我的第一个想法是 JS 只会处理系统的基本行为(点击、悬停、动画、定位、排序等)。但后来我开始搜索 JavaScript 安全性,发现有人说我应该在以下情况下处理用户输入:

var data = '<div class="data">' + someUserInput + '</div>';
$('#someContainer').html(data);

原因是我不应该信任我的用户。我明白了。我不信任用户——这就是为什么我会在服务器的每个 IO 点检查用户空间数据。但是,如果 JS 只是在客户端并且如果那个人正在 hack JS,那么他唯一要破解的是 他自己对系统的看法,对吗?所以 JS 的“安全”就变得没用了。

这样说吧:如果我的 PHP 代码非常好,没有数据会未经过滤,而且这些过滤器是 100% 安全的,那么 JS 安全性就失去了它的价值,对吧?

换句话说,我可以(安全地)做:

var foo = $('input#foo-input').val();

$.post('foo.php', {action: foo}, function(r) {
    $('div#foo').html(r);
});

3。 JS 安全是否会因为 PHP 进行安全检查而失去其价值?

此外,如果我所有的 PHP 代码都是垃圾,并且我确实拥有所有 最佳 JS 安全性,那么它仍然可以通过查看代码来绕过,对吗?我的意思是,我们现在确实在浏览器上拥有了所有这些很酷的 JS 控制台,它们可以做各种各样的事情。他可以用一个简单的 $.post() 打开一个 JS 控制台并发布任何他想要的东西,对吧?然后我们回到 PHP 需要过滤用户空间数据的第一步......

这让我想到了我脑海中的潜在问题:

4。 JS Security 一文不值?

我的意思是,这只是偏执狂吗?我知道你做的安全检查越多越好,但是当你想象一个世界上最好和最坚定的黑客试图破解你的系统时(假设他不会直接利用你的服务器),缩小,模糊和保护JS代码变得没用了——毕竟这家伙手里有所有代码要分析,他只需要耐心。

【问题讨论】:

  • 如果用户试图破坏您的安全性,这是另一件事。它还减少了服务器的负载,因为可以在客户端检测到意外错误,然后再打扰服务器。
  • 它还可以帮助提升用户体验。如果您在 JavaScipt 中进行了验证检查,则页面不必在每次出错时重新加载。

标签: javascript php security


【解决方案1】:

两者兼而有之。服务器不应该信任客户端,因为人们可以注入 javascript 并覆盖您的 javascript 逻辑。事实上,人们甚至可能不会运行您的 javascript,而只是向您发送不良数据(想想使用 curl 或 wget 访问您网站的 shell 脚本)。

同时,您的 javascript 不应信任来自服务器的数据,因为人们可能会进行 MITM 攻击并将内容注入您的页面。 MITM 不需要成为您网络上的黑客。它也可能是一个坏/恶意的浏览器插件。即使没有 MITM 攻击者,它也应该保护自己免受服务器代码中的错误。大多数安全漏洞都是错误。

所以你需要两者。 PHP 代码应该清理您的数据。 javascript 代码不应该简单地从服务器发送.innerHTMLeval() 内容而不进行检查。

【讨论】:

  • 我能否在 JS 中安全地加密消息以防止 MITM 攻击(即使来自浏览器插件)?由于密钥将在源代码中公开,任何人都可以查看,对吧?甚至是一个插件......
  • @EnzoFerber 简单回答:不。你在 JS 中所做的一切都可以轻松更改。
  • 对于网络攻击,您需要使用 HTTPS。为了保护浏览器,有一些方法可以通过使用闭包来隐藏变量。为了保护从页面到服务器的通信,这是不切实际的。当然,有可能替换 XMLHttpRequest 以使您页面上的外部脚本无法使用它。但他们仍然可以创建imgscript 标签来与您的服务器通信。
  • 所以 JavaScript 是一个安全漏洞。据我了解,我对 JS 所做的一切都只会成为攻击者的一个小障碍。你有什么好的资源可以告诉我解决 PHP/JS 安全问题吗?
  • 我不知道单一来源。请注意您的语言/框架的最佳实践,并始终确保您的库是最新的。如果您使用流行的库/框架也会有所帮助,因为与不太流行的库相比,它们更容易被黑客入侵,因此修复了更多错误。安全不是一个单一的问题,而是很多事情。如果您的网络服务器配置错误,即使 HTTPS 也是一个安全漏洞。
猜你喜欢
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-27
相关资源
最近更新 更多