最好的是,团队中经验丰富的人将展示如何操作,如何耙,他们等待什么角度以及在哪里下载DVD上2007年最佳自行车图纸。 这个故事是关于如何将希望表达为正确的,产生了什么结果,以及如何克服危机。
在我看来,在开发方面有中等水平的经验时,我正在寻找一个可以让您从一个非初级到一个自信的初级阶段发展(或变异)的地方。 通过上帝的神秘方式,找到了这样的地方,一个项目被附加到该地方,并且是“老派”程序员,在系统职业生涯中,她写的不仅仅是女孩。 “太好了! 这个项目,因此有RFP的钱,有导师,我们活着!” 我以为是,但是随后,就像描述典型恐怖一样,黑暗中的英雄们面对着可怕的恐怖……
第一件事:
1.大小很重要
我们开始使用曾经专有的php引擎进行开发,该引擎用于存储数据(在这里您可能会认为MySQL,MySQL,PostgreSQL,SQLite,MongoDB和其他东西,但有必要加上后缀DB,否则,伙计们-不明白,但他们没有猜到)api网关。
“哈哈,使用php,您是否将另一个api网关附加到它,并在上面存储数据? 直接从js代码使用api难道不是很容易吗? 还是使用DBMS + PHP?” -询问经验丰富的读者。 而且他会是对的。 但是那时,我还没有见过这种物种,所以我不这么认为,好吧,知道的,很酷的家伙可能会这样做,而“老派”程序员则更了解。
正如我进一步解释的那样:
- 网关=安全,没有人会像这样进入和退出
- 网关=安全的数据存储,您无法进入+备份
- 网关=速度,运行迅速且无故障,经过时间检验
- “老派”程序员的权威观点是,您的php充满了漏洞,默认情况下任何Web应用程序都被黑客入侵,因此旁边没有什么可存储数据的
api网关的一个特征是json数据是在get请求中传输的。 是的,是的,那些非常可爱的json对象经过了url编码,并放入了查询字符串中。 突然之间有一天,一切都会好起来的……get请求的长度不再足够了。 愚蠢的是,URL编码的json,kanalya不适合放入其中! “老派”程序员挠头问道:
“我们要做什么? 我们的json增长了,但是我们没有注意到...”
“恩,呃,也许我们将它们张贴在帖子中?” 我建议过,所以似乎更正确。
“好,传递到职位。”
这是阿塔斯第一。
2.时间和备份管理
为了将新功能添加到项目中,有必要实施
网关上相应的CRUD请求,这正是我们“老派”同志实际上所做的。 问题是他每3天做一次,给出“完成,检查”。 有时检查表明并非所有操作都可行,例如,获取列表没问题,添加新项也不行。 花费了一些时间进行修复和完善,之后才可以通过批量访问释放功能。 提议自己在网关上实施查询,因为它至少更快,但被拒绝了,因为“那里很难,您不会理解”。 这种方法的结果是“自己”完成工作。 例如,如果有必要整体修复数据库中的某些内容,则在3天等待和自己通过查询执行更正之间进行选择-我选择了第二个选项。 客户不是特别喜欢等待,新的介绍稳定地飞了起来。 这样的介绍性方法之一就是将标志大规模地贴在某个标志的使用者身上,这是委托我执行的,所有事情都花了一个小时,当局正在等待一份精美的报告。 在这里等待我们第二号。
事实是,在请求中传输的json数据格式仅暗示了几个必填字段,所有其他字段都是任意的,没有明确的最终结构。 例如,要添加用户,我传递了以下形式的json:
POST /api/users { "email":"ivanov@mail.ru", "password":"myEmailIsVeryBig", "name_last":"", "name_first":"", "name_middle":"", "birth":"01.01.1961", // , - "living_at":"., .3 .4 .24", "phone_num":"+70000000000" }
添加/更新请求中传输的可选部分已保存并完整给出(我将在下面说明如何实现)。 最重要的是,时间不能停滞不前,有必要解决问题-更新用户,放下标签。 但是,不是每次都驱动整个结构吗? 必须检查! 我对自己进行了测试-我仅在更新请求中传输了一个字段,选中该字段,该字段出现,其余数据就位。 重点在于-循环并更新其余部分。
脚本轻柔地喘着气,接收和传输数据,一切似乎都进行得很顺利...突然之间-一个电话。 “我们在系统中看不到用户名!” -从电线的那一端报告。 “来吧! 一切顺利!” -令人不愉快的寒意横过我的背。 进一步的调查表明,尽管所有其他数据均已到位,但确实在名称中显示了名称“”。 在这种情况下该怎么办? 部署备份!
“同志“老派”程序员,还有其他问题! 需要备份! 最新的相关内容何时完成?” -我问。
“呃...我现在来看...。 不,没有巴卡帕。”
几个小时前,我完成并通过报告测试了该模块,我有了一个装有所有必要数据的csv盒,又在一个小时内恢复了订单。
缺乏可理解的文档,工作算法的描述,输入有效性检查,最重要的是-数据库备份-仅为2分。
从那时起,每天开始删除备份。
3.深刻的打击
摇摇欲坠,但工作进展顺利,突然之间,问题得以解决,有些更快,有些慢……客户意识到,其他人的服务器无法理解该系统,并且出于对PD的态度以及在ISPD中组织ZI活动他们不会抚摸头部。 有必要将服务器转移给自己。
为什么系统最初没有转移? 领导层有一种激情-集中化。 管理层梦想着一个可以做所有事情的系统! 您需要让孩子上学吗? 您进入系统,在一个特殊的办公室,在那里您提交申请。 例如,您需要订购披萨-您进入系统,进入另一个专门的办公室,申请披萨。 也许您想与漂亮的女士/先生们交流? 为您服务的是第三个特别内阁-您还在那里提交申请,等等。
优点-一切都使用一个登录名和密码,数据安全地存储在网关上。 甚至还有备份。 而且,请注意,没有人会从我们这里采用这一系统! 即使将它带走-下一步是什么? 一样,他们不会理解针对“老派”程序员的保护系统-那里的一切都很复杂。
带有该系统的VDS已卸载,归因于客户,他们部署了该系统,每个人都在跳舞和唱歌,美丽!
然后一波好奇心和一些怀疑掩盖了我。
如果我们的Web应用程序充满漏洞,那么数据在哪里? 您真的住过其他服务器吗? 如果他们决定从外部关闭系统,那么一切都会崩溃吗?
一个简单的检查表明,数据以及网关处理器本身都在同一服务器上。 而且,不,由于服务器的转移,它们没有被转移到那里,它们总是在那里。
现在,我可以进行非常秘密的“老式”开发,我着手进行研究。 当然,采用Hackdb杂志的文章风格的酷逆向工程以及ollydbg,offsets和其他很酷的东西是行不通的,所以我分享我的东西。
开发本身是用python实现的,只有.pyc文件可以很容易地反编译为可读代码。 坦白说,花了很多时间(多达25分钟)才能弄清楚它是如何工作的。
因此,由“老派”程序员开发的复杂系统(很少有人能理解)包括:
- 由实际接收到请求的Apache处理的脚本。 这个脚本做什么? 打开一个到特定本地主机端口的连接,并在其中传递一个包含所有数据的请求。 仅此而已。 兴趣进一步发展。
- 处理来自脚本的请求的服务器部分。 他的动作逻辑很有趣。 首先,代码中没有数据操作,数据库中没有查询;相反,调用了PL \ SQL中的数据库功能。 所有逻辑,检查等等,所有内容均已在数据库功能中列出。 脚本的50%是一个字典,其中包含请求的名称,与之关联的函数以及应与get-request行中传递的数据相对应的函数参数的名称。 JSON数据(如果需要)作为单独的参数传递。 服务器部分组织的一个功能是用户身份验证期间的备份连接。 如果在数据库中找到登录名和密码,则将生成会话ID,并将打开的连接实例折叠到字典中(并由于10分钟的超时而被杀死,因此它不会被杀死-有延长会话寿命的特殊方法),关键是会话ID,它直接在数据库中没有存储。 会话ID与用户数据的关联度如何? 毕竟,是否存在不发送用户ID的数据请求? 它有效,这意味着这里有问题。
困难的意识得到了非常艰巨的发展,并且不急于揭示过去大师们长期丢失的秘密。
然而,获得了难以置信的(转到“定义”,感谢PhpStorm理解PL \ SQL),但对于那些遭受苦难的老外人的头脑却难以理解,他们对“老派程序员的失落文明”有了真正的了解。 通常,在连接时,会在认证数据验证功能中生成一个临时表,其中存储了用户ID。
这只是开始,发现了严重漏洞的指示性列表:
- 使用批量身份验证的DDoS(保留连接,因此取决于DBMS连接限制,鉴于可以延长会话生存时间,因此可以用连接完全填充内存,并且系统中新用户的工作将是不可能的);
- 缺乏针对蛮力的保护(未检测到失败的登录尝试次数,未存储,未检查;
- 缺乏对实体操作的控制(例如,发出用户请求的文档列表时考虑了用户所属的组织,并且如果您知道文档的ID,则可以成功执行更新/删除文档的请求,即使没有密码(附带地,密码以明文形式存储在数据库中,没有散列)可以被任何人接收)。
另一个严重的问题不是正式的数据存储方案。 如前所述,我正在谈论存储JSON中的“任何字段”。 不,它们没有在表中存储为一行。 它们被分为键值对,并存储在单独的表中。 例如,对于用户,有2个表-用户和users_data(字符串键,字符串值)-实际存储数据的表。 这种方法的结果是增加了数据库中复杂样本的时间。
实际上,这足以做出并实施将系统转移到新的api的决策,该api易于理解,已记录并受支持。
品德
也许此系统是“旧版”,而创建它的“老派”程序员则是旧版的本质。
尽管如此,结论如下:
- 如果您被告知“有困难,您将无法理解”-这意味着您将拥有完整的atas
- 如果他们被权威粉碎,那么有些不洁的东西
- 信任,但要验证-安全性不是状态,安全性是一个连续的过程,因此比以后发现所有用户突然变成“ Ivanov Ivanov Ivanitch”更好,但要验证所声明的现实质量更好,但是没有障碍。