人!
我正在思考ERP System的架构,它将是Single-Page App。我会告诉你我的思考过程以及我是如何得出问题的。
工作原理: DBCore
将提供查询数据库的API,ERP
将是我们需要的所有商务模块,I/O
会照顾将ERP
响应转换为HTML格式和Request
将是服务器和客户端之间的门,将POST阵列转换为I/O
数组。
模块限制:模块只能在它之后或之前与模块通信。因此,DBCore
只会与MySQL
或ERP
进行对话,ERP
只能与DBCore
和I/O
进行对话...等等。
安全推理:所有模块都有一个输入和一个输出源。所以我的想法是,我可以通过每个IO点上的一套严格的规则来准确控制进出的内容。这意味着在到达ERP
或DBCore
模块上的敏感数据之前,输入将被2个不同的过滤器过滤,并且可以进行两次过滤(一次在Auth
内的ERP
模块和DBCore
mysqli::real_escape_string()
模块中的var data = '<div class="data">' + someUserInput + '</div>';
$('#someContainer').html(data);
模块。
所有这些都将在Public WWW文件夹之外。要与应用程序通信,WWW文件夹中将有一个文件 index.php 。此页面将启动系统并在POST被发送时启动请求。然后它只是将响应回传给客户端。
*可能因为如果过滤器是废话,那么安全性将是废话。
然后我开始考虑JavaScript如何工作。我的第一个想法是JS只会处理系统的基本行为(点击,悬停,动画,定位,排序等......)。但后来我开始搜索JavaScript安全性并发现有些人说我应该对以下案例的用户输入进行处理:
var foo = $('input#foo-input').val();
$.post('foo.php', {action: foo}, function(r) {
$('div#foo').html(r);
});
原因是我不相信我的用户。我明白了。我不信任用户 - 这就是为什么我要检查服务器中每个IO点的用户空间数据。但是,如果JS只是在客户端,而且如果这个人正在攻击JS,他唯一会破解的是他自己对系统的看法,对吧?所以JS&#34;安全&#34;变得无用。
这样说:如果我的PHP代码非常好,没有数据会过滤,并且这些过滤器是100%安全的,JS安全性会失去它的价值,对吧? / p>
换句话说,我可以(安全地):
{{1}}
此外,如果我所有的PHP代码都是废话并且我确实拥有所有最佳 JS安全性,那么只需查看代码就可以绕过它,对吧?我的意思是,我们现在在浏览器上拥有所有这些很酷的JS控制台,可以做各种各样的事情。他可以使用一个简单的$ .post()打开一个JS控制台并发布他想要的东西,对吗?然后我们回到PHP需要过滤用户空间数据的第一步......
这让我想到了脑子里的潜在问题:
我的意思是,这只是偏执吗?我知道你做的安全检查得分越多越好,但当你想到一个最好最有决心的黑客试图破解你的系统的世界时(假设他不打算直接利用你的服务器),缩小隐藏和保护JS代码变得毫无用处 - 毕竟,这个人手中的所有代码都要分析,他只需要耐心。
答案 0 :(得分:4)
两者都是。服务器不应该信任客户端,因为人们可以注入javascript并覆盖你的javascript逻辑。实际上,人们可能甚至不会运行您的javascript并只是向您发送错误数据(想想使用curl或wget访问您网站的shell脚本)。
同时,您的javascript不应该信任来自服务器的数据,因为人们可能会进行MITM攻击并将内容注入您的页面。 MITM不需要是您网络上的黑客。它也可能是一个糟糕/恶意的浏览器插件。即使没有MITM攻击者,它也应该保护自己免受自己在服务器代码中的错误的影响。大多数安全漏洞都是错误。
所以你需要两者。 PHP代码应该清理您的数据。 javascript代码不应该只是来自服务器的.innerHTML
或eval()
内容而不进行检查。