人!
我正在考虑一个ERP系统的架构,它将是一个单页应用程序。我将向您展示我的思考过程以及我是如何得出这些问题的。
PHP结构与推理
- 0.MySQL
- 1.数据库核心
- 2.ERP模块(此处为用户授权(
- 3.输入/输出
- 4.请求
工作原理:DBCore
将提供API来查询数据库,ERP
将是我们需要的所有业务模块,I/O
将负责将ERP
响应转换为HTML格式,Request
将是服务器和客户端之间的闸门,将POST数组转换为I/O
数组。
模块限制:模块只能与紧接在它之后或之前的模块通话。因此,DBCore
只能与MySQL
或ERP
通话,ERP
只能与DBCore
和I/O
通话。。。等等
安全推理:所有模块都将有一个输入源和另一个输出源。所以我的想法是,我可以通过每个IO点的一组严格的规则来准确地控制进出。这意味着,在到达ERP
或DBCore
模块上的敏感数据之前,输入将由两个不同的滤波器进行滤波,并将再进行两次滤波(一次在ERP
内的Auth
模块中,一次在带mysqli::real_escape_string()
的DBCore
模块中(。
所有这些都将在公共WWW文件夹之外。为了与应用程序通信,WWW文件夹中会有一个文件,index.php。如果该页面被张贴,则会启动系统并启动请求。然后,它只是将响应回显给客户端。
1.这种体系结构安全吗
2.这些IO瓶颈是否增加了我的(潜在*(安全性
*潜在的,因为如果过滤器是垃圾,那么安全性就是垃圾。
JavaScript推理
然后我开始思考JavaScript将如何工作。我最初的想法是JS只会处理系统的基本行为(点击、悬停、动画、定位、排序等(。但后来我开始搜索JavaScript安全性,发现一些人说我应该处理用户输入的情况,比如:
var data = '<div class="data">' + someUserInput + '</div>';
$('#someContainer').html(data);
原因是我不应该信任我的用户。我明白了。我不信任用户——这就是为什么我要检查服务器中每个IO点的用户空间数据。但是,如果JS只是在客户端,如果这个家伙正在攻击JS,他唯一要攻击的就是他自己对系统的看法,对吧?因此JS的"安全性"变得毫无用处。
这样说:如果我的PHP代码非常好,没有任何数据未经过滤,并且这些过滤器是100%安全的,JS安全性就会失去它的价值,对吧?
换句话说,我可以(安全地(做到:
var foo = $('input#foo-input').val();
$.post('foo.php', {action: foo}, function(r) {
$('div#foo').html(r);
});
3.PHP会做安全检查,JS安全会失去价值吗
此外,如果我所有的PHP代码都是垃圾,并且我拥有最好的JS安全性,那么只需查看代码就可以绕过它,对吧?我的意思是,我们现在在浏览器上有了所有这些很酷的JS控制台,可以做各种事情。他可以打开一个JS控制台,用一个简单的$.POST((发布任何他想要的东西,对吧?然后我们回到第一步,PHP需要过滤用户空间数据。。。
这让我想到了我脑海中潜在的问题:
4.JS Security毫无价值吗
我的意思是,这只是妄想症吗?我知道你做安全检查的次数越多越好,但当你想到一个世界时,最优秀、最坚定的黑客正试图入侵你的系统(假设他不会直接利用你的服务器(,缩小、隐藏和保护JS代码变得毫无用处——毕竟,这个人手里有所有的代码需要分析,他只需要耐心。
两者兼而有之。服务器不应该信任客户端,因为人们可以注入javascript并覆盖您的javascript逻辑。事实上,人们甚至可能不会运行你的javascript,只是简单地向你发送坏数据(想想一个shell脚本使用curl或wget访问你的网站(。
同时,您的javascript不应该信任来自服务器的数据,因为人们可能会进行MITM攻击并将内容注入您的页面。MITM不需要成为你网络上的黑客。它也可能是一个坏的/恶意的浏览器插件。即使没有MITM攻击者,它也应该保护自己免受服务器代码中的错误。大多数安全漏洞都是bug。
所以你两者都需要。PHP代码应该净化您的数据。javascript代码不应该只是来自服务器的.innerHTML
或eval()
内容而不进行检查。