深入理解Form表单

前言:随着框架的普遍,原生的Form表单用得很少了(我用得不多)。框架也是从原生来的,先把基础的理解透彻了,以后出现了bug也好解决。

一、Form表单的作用

Form表单是用户与服务器(或应用程序)交互的桥梁。用户通过Form表单将数据发送到服务器上,但是web网页也可以拦截Form表单的数据。

二、一个基本的Form表单

  <form action="/handleForm" method="post">
    <div>
      <label for="name">姓名:</label>
      <input type="text" id="name" name="user_name">
    </div>
    <div>
      <label for="email">邮箱:</label>
      <input type="email" id="email" name="user_email">
    </div>
    <div>
      <label for="msg">信息:</label>
      <textarea id="msg" cols="30" rows="10" name="user_msg"></textarea>
    </div>
     <div>
      <button type="submit">提交</button>
    </div>
  </form>

这是一个简单的form表单,action 表示表单提交的url,method 表示表单提交的HTTP方式,有 getpostdialog 三种选项。在这个例子中,点击 button 按钮时,表单会发送三个已命名(name)的数据块 user_nameuser_emailuser_msg。这些数据会用 HTTPPOST 方法,把信息发送到URL为 /handleForm 目录下。

在服务端,位于URL /handleForm 上的脚本将接受HTTP请求中包含的3个键值对。

  • actionurl:
    • url 为相对路径时:表单数据会提交到自己站点上
    • url 为绝对路径时: 表单数据会提交到自己站点之外。当前后端部署路径不同时, 使用绝对路径。
    • url 为空时: 表单数据提交到当前页面的URL上。(HTML5开始,不需要使用#
  • method 的两个常用选项:
    • GET:请求服务器资源。浏览器发送一个空的主体,发送的数据被追加到URL上了。可以直接在浏览器的URL中看到用户输入的数据。所以GET 不适合发送大量数据或包含安全信息的数据。
    • POST:使用 POST 方法提交表单时,数据不会被附加到URL上,HTTP请求头中会有 Content-Type: application/x-www-form-urlencoded , 发送的数据会放在请求体中。

三、使用Form表单发送文件

由于HTTP是一种文本型协议,所以处理二进制数据有特殊的要求。需要设置Form表单的 enctype 属性。

enctype属性: 这个属性指定了提交表单时请求头中的 Content-TypeContent-Type 大家都耳熟能详了,它是告诉服务器,咱们浏览器发送过去的数据是什么类型。使用 POST 方法时,Content-Type 默认的值是 x-www-urlencoded。 意思是:“这是已经编码为URL参数的表单数据”

想要发送文件, 需要以下步骤

  • 将表单的 method 设置为 POST。因为文件内容不能放入URL参数中
  • enctype 的值设置为 multipart/form-data。因为数据将会被分成多个部分,每个文件单独占一个部分,表单正文中包含的文本数据(如果有的话)占用一个部分。
  • 包含一个或多个 <input type="file">,这样用户才能上传文件

代码:

<form method="post" enctype="multipart/form-data">
  <div>
    <label for="file">选择文件</label>
    <input type="file" id="file" name="myFile">
  </div>
  <div>
    <button>上传文件</button>
  </div>
</form>

tip:如果想上传多个文件, 在 input 中添加 multiple 属性。

四、表单小部件

表单小部件,指的是组成表单的基本HTML元素,如 <input><button><checkbox> 等。 基本的表单部件我就不说了,我说几个少见的原生部件

  • 进度条: <progress>
  • 仪表: <meter>
  • 滑块: <input type="range">
  • 数字输入: <input type="number" max="10" min="1">
  • and so on...

五、表单的安全问题

每次向服务器发送数据时,都需要考虑安全性。到目前为止,表单是最常见的攻击路径。但是这些问题都不是来自表单,而来自于服务器如何处理数据。

比较出名的安全问题:

  • XSSCSRF

    简单介绍一下跨站脚本(XSS)和跨站点请求伪造(CSRF)

    • xss:用户通过各种方式将恶意代码注入到其他用户的页面中。就可以通过脚本获取信息,发起请求,之类的操作。

    • CSRF:跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。CSRF并不能够拿到用户的任何信息,它只是欺骗用户浏览器,让其以用户的名义进行操作。

    XSS攻击利用用户对web站点的信任,而CSRF攻击则利用网站对其用户的信任。

  • SQL注入

    SQL 注入是一种试图在目标web站点使用的数据库上执行操作的攻击类型。这通常包括发送一个SQL请求,希望服务器能够执行它(通常发生在应用服务器试图存储由用户发送的数据时)。

程序员该如何避免这些问题呢? 因为我还没处理过安全问题,所以讲不出答案。但是我有一个原则: 永远不要相信用户

五、使用XHR发送表单数据

目前基本是这种方式来发送表单数据了,首先是很方便,可以对用户的输入做逻辑处理,还可以封装HTTP请求,形成过滤的的效果,处理Token等。这种方式我在之前的博客里面讲过了。这里不再复述。

六、 Form表单的样式

我曾经尝试过去修改一些表单部件的样式,很生硬,建议是使用UI组件,或者用其他HTML标签来模拟。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,875评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,569评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,475评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,459评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,537评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,563评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,580评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,326评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,773评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,086评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,252评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,921评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,566评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,190评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,435评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,129评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,125评论 2 352

推荐阅读更多精彩内容