Node-3.构建Web应用(二)

前言

在Web应用的整个构建过程中,随着框架和库的成型,我们往往迷糊地知道应用框架和库,而不知道细节的实现。这篇文章简要介绍在Web应用中设计的原理性知识及技术,对认识一个Web应用的具体实现有相对具体而全面的了解,可以帮助我们去学习和思考其他框架和库的实现、

一、数据上传

Node的HTTP请求在HTTP_Parser解析报文头结束后,报文内容部分会通过data事件触发,我们只需要以流的方式处理即可。

表单数据

默认的表单提交,请求头中的Content-Type字段值为application/x-www-form-urlencoded

其他格式

JSON类型请求头中的Content-Type字段的值为application/json
XML类型请求头中的Content-Type字段的值为application/xml
在Content-Type中可以附带编码信息。
Content-Type: application/json; charset=utf-8

附件上传

通常的表单,其内容可以通过urlencoded的方式编码内容形成报文体,再发送给服务器端,
特殊表单可以含有file类型的控件,以及需要指定表单属性enctype为multipart/form-data

浏览器在遇到multipart/form-data表单提交时,构造的请求报文与普通表单完全不同。

Content-Type: multipart/form-data; boundary=AaB03x
Content-Length: 18231

它代表本次提交的内容是由多部分构成的,其中boundary=AaB03x指定的是每部分内容的分界符,AaB03x是随机生成的一段字符串,报文体的内容将通过在它前面添加–进行分割,报文结束时在它前后都加上–表示结束。另外,Content-Length的值必须确保是报文体的长度。

数据上传与安全

内存限制

在解析表单、JSON、XML部分,如果使用先保存用户提交的所有数据,然后再进行解析处理,最后才传递给业务逻辑的策略,一旦数据量过大,将发生内存被占光的情况,这种策略存在的潜在问题是它仅适合数据量小的提交数据。
攻击者通过客户端能够十分容易地模拟伪造大量数据,如果攻击者每次提交1 MB的内容,那么只要并发请求数量一大,内存就会很快地被吃光。

要文件上传会导致内存占光的问题,可以。

  • 限制上传内容的大小,一旦超过限制,停止接收数据,并响应400状态码。
  • 通过流式解析,将数据流导向到磁盘中,Node只保留文件路径等小数据。

采用的上传数据量进行限制可以通过Content-Length进行判断:
数据是由包含Content-Length的请求报文判断是否长度超过限制的,超过则直接响应413状态码;
对于没有Content-Length的请求报文,略微简略一点,在每个data事件中判定即可。一旦超过限制值,服务器停止接收新的数据片段。
如果是JSON文件或XML文件,极有可能无法完成解析。
对于上线的Web应用,添加一个上传大小限制十分有利于保护服务器,在遭遇攻击时,能镇定从容应对。

CSRF(跨站请求伪造)

CSRF(Cross-Site Request Forgery) 中文意思为跨站请求伪造
以一个留言的例子来说明。假设某个网站有这样一个留言程序,提交留言的接口如下所示:

http://domain_a.com/guestbook

用户通过POST提交content字段就能成功留言。服务器端会自动从Session数据中判断是谁提交的数据,补足username和updatedAt两个字段后向数据库中写入数据,正常的情况下,谁提交的留言,就会在列表中显示谁的信息。
如果某个攻击者发现了这里的接口存在CSRF漏洞,那么他就可以在另一个网站(http://domain_b.com/attack)上构造了一个表单提交,如下所示:

<form id="test" method="POST" action="http://domain_a.com/guestbook">
  <input type="hidden" name="content" value="vim是这个世界上最好的编辑器" />
</form>
<script type="text/javascript">
  $(function () {
    $("#test").submit();
  });
</script>

这种情况下,攻击者只要引诱某个domain_a的登录用户访问这个domain_b的网站,就会自动提交一个留言。由于在提交到domain_a的过程中,浏览器会将domain_a的Cookie发送到服务器,尽管这个请求是来自domain_b的,但是服务器并不知情,用户也不知情。

以上过程就是一个CSRF攻击的过程。而这里的示例仅仅是一个留言的漏洞,如果出现漏洞的是转账的接口,那么其危害程度可想而知。
解决CSRF攻击可以添加随机值,在后端渲染的时候后台产生一个随机值,存放在表单中隐藏的input框,提交数据的时候一起提交到后台进行校验。

二、路由解析

文件路径型

  • 静态文件
    URL的路径与网站目录路径一致,无需转换,也非常直观。
    这种路由的处理也很简单,将请求路径对于的文件发送给客户端即可。

  • 动态文件
    在MVC流行起来前,Web服务器根据URL路径找到对应的文件,然后服务器根据文件后缀名寻找脚本解析器,并传入HTTP请求上下文(动态生成HTML页面)。

MVC

MVC模型的主要思想是将业务逻辑按职责分离,主要有:

  • 控制器(Controller),一组行为的集合
  • 模型(Model),数据相关的操作和封装
  • 视图(View),视图的渲染

这是目前最为经典的分层模式,它的工作模式如下:

  • 路由解析,根据URL寻找对应的控制器和行为;
  • 行为调用相关的模型,进行数据操作
  • 数据操作结束后,调用视图和相关数据进行页面渲染,输出到客户端

如何根据URL做路由映射?可以有两种实现方式:

  • 手工关联映射(适合小项目),由对应的路由文件来将URL映射到对应的控制器,手工映射对URL比较灵活,可以通过正则匹配参数解析等手动指定对应路径映射的控制器
    缺点:如果URL变动,需要改动路由的映射。
  • 通过自然关联映射,路由按照一种约定的方式自然而然地实现了路由,无须维护路由映射,如
/controller/action/param
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值