为什么在.HTML文件的pdf编辑器哪个好用中,我输入开始标签后,pdf编辑器哪个好用不会自动显示结束标签呢?

上面例子作用是单击click here!文字,网页链接到这个网页。

认识<img>标签,为网页插入图片
在网页的制作中为使网页炫丽美观,肯定是缺少不了图片,可以使用<img>标签来插入图片。

1、src:标识图像的位置;
2、alt:指定图像的描述性文本,当图像不可见时(下载不成功时),可看到该属性指定的文本;
3、title:提供在图像可见时对图像的描述(鼠标滑过图片时显示的文本);
4、图像可以是GIF,PNG,JPEG格式的图像文件。

表单是可以把浏览者输入的数据传送到服务器端,这样服务器端程序就可以处理表单传过来的数据。

文本输入框、密码输入框
当用户要在表单中键入字母、数字等内容时,就会用到文本输入框。文本框也可以转化为密码输入框。

4.3 文本域,支持多行文本输入

当用户需要在表单中输入大段文字时,需要用到文本输入域。

4.4 单选框,复选框

1 2 3 4 5 6 7 1、type: 当type="radio"时,控件为单选框 当type="checkbox"时,控件为复选框 2、value:提交数据到服务器的值(后台程序PHP使用) 3、name:为控件命名,以备后台程序ASP、PHP使用 4、checked:当设置checked="checked"时,该选项被默认选中 注意:同一组的单选按钮,name取值一定要一致,这样同一组的单选按钮才可以起到单选的作用。 

4.5 下拉列表框,节省空间

下拉列表在网页中也常会用到,它可以有效的节省网页空间。既可以单选、又可以多选。

提交值是向服务器提交的值,选项是显示的值。

4.6 使用下拉列表框进行多选

下拉列表也可以进行多选操作,在<select>标签中设置multiple="multiple"属性,就可以实现多选功能,进行多选时按下Ctrl键同时进行单击,可以选择多个选项。

4.7 提交按钮、重置

在表单中有两种按钮可以使用,分别为:提交按钮、重置。
1,提交按钮:当用户需要提交表单信息到服务器时,需要用到提交按钮。

type:只有当type值设置为submit时,按钮才有提交作用
value:按钮上显示的文字

2,重置按钮,重置表单信息
当用户需要重置表单信息到初始时的状态时,比如用户输入“用户名”后,发现书写有误,可以使用重置按钮使输入框恢复到初始状态。只需要把type设置为"reset"就可以。

type:只有当type值设置为reset时,按钮才有重置作用
value:按钮上显示的文字

CSS全称为“层叠样式表 (Cascading Style Sheets)”,它主要是用于定义HTML内容在浏览器内的显示样式,如文字大小、颜色、字体加粗等。

使用CSS样式的一个好处是通过定义某个样式,可以让不同网页位置的文字有着统一的字体、字号或者颜色等。

css 样式由选择符和声明组成,而声明又由属性和值组成

选择符:又称选择器,指明网页中要应用样式规则的元素,如本例中是网页中所有的段(p)的文字将变成蓝色,而其他的元素(如ol)不会受到影响。
声明:在英文大括号“{}”中的的就是声明,属性和值之间用英文冒号“:”分隔。当有多条声明时,中间可以英文分号“;”分隔,如下所示:

从CSS 样式代码插入的形式来看基本可以分为以下3种:
内联式、嵌入式和外部式三种

就是把css代码直接写在现有的HTML标签中,如下面代码:

css样式代码要写在双引号中,如果有多条css样式代码设置可以写在一起,中间用分号隔开。如下代码:

2,嵌入式css样式,

3,外部式css样式,写在单独的一个文件中

外部式css样式(也可称为外联式)就是把css代码写一个单独的外部文件中,这个css样式文件以“.css”为扩展名,在<head>内(不是在<style>标签内)使用<link>标签将css样式文件链接到HTML文件内,如下面代码:

每一条css样式定义由两部分组成,形式如下:

在{}之前的部分就是“选择器”,“选择器”指明了{}中的“样式”的作用对象,也就是“样式”作用于网页中的哪些元素

上面的css样式代码的作用:为p标签设置12px字号,行间距设置1.6em的样式。

类选择器在css样式编码中是最常用到的。

.类选器名称{css样式代码;} 
1 2 1、英文圆点开头 2、其中类选器名称可以任意起名(但不要起中文噢) 

在很多方面,ID选择器都类似于类选择符,但也有一些重要的区别:

1 2 1、为标签设置id="ID名称",而不是class="类名称"2、ID选择符的前面是井号(#)号,而不是英文圆点(.)。 

6.4 类和ID选择器的区别

相同点:可以应用于任何元素
1、ID选择器只能在文档中使用一次。与类选择器不同,在一个HTML文档中,ID选择器只能使用一次,而且仅一次。而类选择器可以使用多次。

2、可以使用类选择器词列表方法为一个元素同时设置多个样式。我们可以为一个元素同时设多个样式,但只可以用类选择器的方法实现,ID选择器是不可以的(不能使用 ID 词列表)。

上面代码的作用是为“三年级”三个文字设置文本颜色为红色并且字号为25px

上面代码不可以实现为“三年级”三个文字设置文本颜色为红色并且字号为25px的作用。

还有一个比较有用的选择器子选择器,即大于符号(>),用于选择指定标签元素的子元素。如下面的代码:

这行代码会使class名为food下的子元素li加入红色实线边框。

6.6 包含(后代)选择器

包含选择器,即加入空格,用于选择指定标签元素下的后辈元素。如右侧代码编辑器中的代码:

请注意这个选择器与子选择器的区别:

1 2 3 1,子选择器(child selector)仅是指它的直接后代,或者你可以理解为作用于子元素的第一代后代 2,后代选择器是作用于所有子后代元素。后代选择器通过空格来进行选择,而子选择器是通过“>”进行选择。 总结:>作用于元素的第一代后代,空格作用于元素的所有后代。 

通用选择器是功能最强大的选择器,它使用一个(*)号指定,它的作用是匹配html中任意标签元素,如下使用下面代码使用html中任意标签元素字体颜色全部设置为红色:

更有趣的是伪类选择符,为什么叫做伪类选择符,它允许给html不存在的标签设置样式,比如说我们给html中一个标签元素的鼠标滑过的状态来设置字体颜色:

这行代码会使被<a></a>标签包裹的文字内容中的“胆小如鼠”字体颜色在鼠标滑过时变为红色。

当你想为html中多个标签元素设置同一个样式时,可以使用分组选择符(,),如下代码为右侧代码编辑器中的h1、span标签同时设置字体颜色为红色:

它相当于下面两行代码:

七、CSS的继承、层叠和特殊性

CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代。比如下面代码:如某种颜色应用于p标签,这个颜色设置不仅应用p标签,还应用于p标签中的所有子元素文本,这里子元素为span标签。

我们来思考一个问题:如果在html文件中对于同一个元素可以有多个css样式存在并且这多个css样式具有相同权重值怎么办?好,这一小节中的层叠帮你解决这个问题。
层叠就是在html文件中对于同一个元素可以有多个css样式存在,当有相同权重的样式存在时,会根据这些css样式的前后顺序来决定,处于最后面的css样式会被应用。

三年级时,我还是一个胆小如鼠的小女孩。

最后 p 中的文本会设置为green,这个层叠很好理解,理解为后面的样式会覆盖前面的样式。 所以前面的css样式优先级就不难理解了: 内联样式表(标签内部)> 嵌入样式表(当前文件中)> 外部样式表(外部文件中)。

我们在做网页代码的时,有些特殊的情况需要为某些样式设置具有最高权值,怎么办?这时候我们可以使用!important来解决。

三年级时,我还是一个胆小如鼠的小女孩。

这时 p 段落中的文本会显示的red红色。 注意:!important要写在分号的前面

我们可以使用css样式为网页中的文字设置字体、字号、颜色等样式属性。下面我们来看一个例子,下面代码实现:为网页中的文字设置字体为宋体。

这里注意不要设置不常用的字体,因为如果用户本地电脑上如果没有安装你设置的字体,就会显示浏览器默认的字体。(因为用户是否可以看到你设置的字体样式取决于用户本地电脑上是否安装你设置的字体。)
2,文字排版--字号、颜色
可以使用下面代码设置网页中文字的字号为12像素,并把字体颜色设置为#666(灰色):

我们还可以使用css样式来改变文字的样式:粗体、斜体、下划线、删除线,可以使用下面代码实现设置文字以粗体样式显示出来。

以下代码可以实现文字以斜体样式在浏览器中显示:

5,文字排版--下划线
有些情况下想为文字设置为下划线样式,这样可以在视觉上强调文字,可以使用下面代码来实现:

删除线,在电商网站上经常见。

中文文字中的段前习惯空两个文字的空白,这个特殊的样式可以用下面代码来实现:

注意:2em的意思就是文字的2倍大小。

2,段落排版--行间距
这一小节我们来学习一下另一个在段落排版中起重要作用的行间距属性(line-height),如下代码实现设置段落行间距为1.5倍。

3,段落排版--字间距、字母间距
文字间隔、字母间隔设置:
如果想在网页排版中设置文字间隔或者字母间隔就可以使用 letter-spacing来实现,如下面代码:

注意:这个样式使用在英文单词时,是设置字母与字母之间的间距。
如果我想设置英文单词之间的间距呢?可以使用word-spacing来实现。如下代码:

在讲解CSS布局之前,我们需要提前知道一些知识,在CSS中,html中的标签元素大体被分为三种不同的类型:块状元素、内联元素和内联块状元素。

常用的内联块状元素有:

1 2 3 1、每个块级元素都从新的一行开始,并且其后的元素也另起一行。(真霸道,一个块级元素独占一行) 2、元素的高度、宽度、行高以及顶和底边距都可设置。 3、元素宽度在不设置的情况下,是它本身父容器的100%(和父元素的宽度一致),除非设定一个宽度。 
1 2 3 1、和其他元素都在一行上; 2、元素的高度、宽度、行高及顶部和底部边距不可设置; 3、元素的宽度就是它包含的文字或图片的宽度,不可改变。 
1 2 1、和其他元素都在一行上; 2、元素的高度、宽度、行高以及顶和底边距都可设置。 

盒子模型的边框就是围绕着内容及补白的线,这条线你可以设置它的粗细、样式和颜色(边框三个属性)。
如下面代码为div来设置边框粗细为2px、样式为实心的、颜色为红色的边框:

上面是border代码的缩写形式,可以分开写:

现在有一个问题,如果有想为p标签单独设置下边框,而其它三边都不设置边框样式怎么办呢?css样式中允许只为一个方向的边框设置样式:

同样可以使用下面代码实现其它三边上、右、左边框的设置:

元素与其它元素之间的距离可以使用边界(margin)来设置。边界也是可分为上、右、下、左。如下代码:

如果上下左右的边界都为10px;可以这么写:

如果上下边界一样为10px,左右一样为20px,可以这么写:

元素内容与边框之间是可以设置距离的,称之为填充。填充也可分为上、右、下、左。如下代码:

顺序一定不要搞混。可以分开写上面代码:

如果上、右、下、左的填充都为10px;可以这么写

如果上下填充一样为10px,左右一样为20px,可以这么写:

还记得在讲盒模型时外边距(margin)、内边距(padding)和边框(border)设置上下左右四个方向的边距是按照顺时针方向设置的:上右下左。具体应用在margin和padding的例子如下:

通常有下面三种缩写方法:

3、如果left和right的值相同,如下面代码:

关于颜色的css样式也是可以缩写的,当你设置的颜色是16进制的色彩值时,如果每两位的值相同,可以缩写一半。

清楚了CSS 盒模型的基本概念、 盒模型类型, 我们就可以深入探讨网页布局的基本模型了。布局模型与盒模型一样都是 CSS 最基本、 最核心的概念。 但布局模型是建立在盒模型基础之上,又不同于我们常说的 CSS 布局样式或 CSS 布局模板。如果说布局模型是本,那么 CSS 布局模板就是末了,是外在的表现形式。
CSS包含3种基本的布局模型,用英文概括为:Flow、Layer 和 Float。
在网页中,元素有三种布局模型:
1、流动模型(Flow)

10-2 流动模型(一)

流动(Flow):自上而下。
先来说一说流动模型,流动(Flow)是默认的网页布局模式。也就是说网页在默认状态下的 HTML 网页元素都是根据流动模型来分布网页内容的。
流动布局模型具有2个比较典型的特征:

第一点,块状元素都会在所处的包含元素内自上而下按顺序垂直延伸分布,因为在默认状态下,块状元素的宽度都为100%。实际上,块状元素都会以行的形式占据位置。如右侧代码编辑器中三个块状元素标签(div,h1,p)宽度显示为100%。

第二点,在流动模型下,内联元素都会在所处的包含元素内从左到右水平分布显示。(内联元素可不像块状元素这么霸道独占一行)
右侧代码编辑器中内联元素标签a、span、em、strong都是内联元素。

块状元素这么霸道都是独占一行,如果现在我们想让两个块状元素并排显示,怎么办呢?不要着急,设置元素浮动就可以实现这一愿望。任何元素在默认情况下是不能浮动的,但可以用CSS定义为浮动,如div、p、table、img等元素都可以被定义为浮动。如下代码可以实现两个div元素一行显示。

注意:设置浮动的同时一定要先设置块状元素的宽度,且需要浮动的几个元素宽度加起来一定要小于容器元素的宽度。

10-4 什么是层模型?

什么是层布局模型?层布局模型就像是图像软件PhotoShop中非常流行的图层编辑功能一样,每个图层能够精确定位操作,但在网页设计领域,由于网页大小的活动性,层布局没能受到热捧。但是在网页上局部使用层布局还是有其方便之处的。下面我们来学习一下html中的层布局。
如何让html元素在网页中精确定位,就像图像软件PhotoShop中的图层一样可以对每个图层能够精确定位操作。CSS定义了一组定位(positioning)属性来支持层布局模型。

1,层模型--绝对定位(相对于父类)

如果想为元素设置层模型中的绝对定位,需要设置position:absolute(表示绝对定位),这条语句的作用将元素从文档流中拖出来,然后使用left、right、top、bottom属性相对于其最接近的一个具有定位属性的父包含块进行绝对定位。如果不存在这样的包含块,则相对于body元素,即相对于浏览器窗口。
如下面代码可以实现div元素相对于浏览器窗口向右移动100px,向下移动50px。

2,层模型--相对定位(相对于以前)

如果想为元素设置层模型中的相对定位,需要设置position:relative(表示相对定位),它通过left、right、top、bottom属性确定元素在正常文档流中的偏移位置。相对定位完成的过程是首先按static(float)方式生成一个元素(并且元素像层一样浮动了起来),然后相对于以前的位置移动,移动的方向和幅度由left、right、top、bottom属性确定,偏移前的位置保留不动。
如下代码实现相对于以前位置向下移动50px,向右移动100px;

3,层模型--固定定位(相对于网页窗口)

fixed:表示固定定位,与absolute定位类型类似,但它的相对移动的坐标是视图(屏幕内的网页窗口)本身。由于视图本身是固定的,它不会随浏览器窗口的滚动条滚动而变化,除非你在屏幕中移动浏览器窗口的屏幕位置,或改变浏览器窗口的显示大小,因此固定定位的元素会始终位于浏览器窗口内视图的某个位置,不会受文档流动影响,这与background-attachment:fixed?属性功能相同。以下代码可以实现相对于浏览器视图向右移动100px,向下移动50px。并且拖动滚动条时位置固定不变。

使用position:absolute可以实现被设置元素相对于浏览器(body)设置定位以后,大家有没有想过可不可以相对于其它元素进行定位呢?答案是肯定的,当然可以。使用position:relative来帮忙,但是必须遵守下面规范:

1、参照定位的元素必须是相对定位元素的前辈元素:

从上面代码可以看出box1是box2的父元素(父元素当然也是前辈元素了)。

这样box2就可以相对于父元素box1定位了(这里注意参照物就可以不是浏览器了,而可以自由设置了)。

}

对于开发者而言,网络安全的重要性不言而喻。任何一处代码错误、一个依赖项漏洞或是数据库的端口暴露到公网,都会有可能直接送你上热搜。

那么,哪里可以找到详细的避雷指引呢?OWASP's top 10 清单太短了,而且它更关注的是漏洞罗列,而非对预防。相比之下,ASVS 是个很好的列表,但还是满足不了实际需求。

本文这份清单将介绍 72 个实操要点,让你全方位保护你的 Web 应用程序。各位看官,准备入坑啦!

一、浏览器端的威胁防御

1、用且仅用 HTTPS,防范网络攻击

众所周知,一个安全的应用需要对浏览器和 Web 服务器之间的所有连接进行加密。此外,建议禁用一些旧的密码套件和协议。使用 HTTPS 时,仅加密网站的“敏感”部分是不够的。如非这样,攻击者可以截获某个未加密的 HTTP 请求,然后伪造来自服务器的响应,返回恶意内容。幸运的是,HTTPS 目前是很容易做到的。我们可以通过 Let's Encrypt

继续我们的清单,下一个是 HSTS 它与 HTTPS 密切相关。

2、使用 HSTS 和预加载来保护用户免受 SSL 剥离攻击

HSTS 可以防止 SSL 剥离攻击。所谓的 SSL 剥离攻击也就是:网络上的攻击者截获浏览器发出的第一个 HTTP 请求(通常是未加密的),并立即伪造对该请求的回复,假装是服务器并将连接降级为明文 HTTP。

值得注意的是,HSTS 仅在用户至少成功访问了一次应用程序的情况下才能生效。为了克服这个限制,可以把我们的网站提交到 /app1/ 和 /app2/,是非常危险的。因为浏览器会认为它们是同源应用,也就是同样的服务主机、端口和模式。正因为是同源应用,它们将对彼此有完全的访问权限。任何影响其中一个的漏洞都会同样影响到另外一个。

因此,我们需要给每个应用一个独立的域名。所以,这种情况下应该设置为://

注意:位于同一个域名下的子域名是可以为整个域名设置 Cookie 的。例如 可以为 。允许为一个站点设置 Cookie 有时会给会话固定等类型的漏洞以可乘之机。公共后缀列表可以用来应对该问题。此外,也可以通过将 Cookie 命名为 __Host- 来防止其被子域名所覆盖。

24、谨慎采用 CORS(跨域资源共享)

浏览器的安全模型大部分是依赖于同源策略,它可以防止应用的跨域读取。而 CORS(跨域资源共享)则是一种允许网站进行跨域资源访问的手段。所以,决定使用它之前,最好先搞清楚自己是否真的需要。

如果你在 的服务需要被来自 的 GET 请求访问,那么可以在 服务上指定如下header:

如果你有个公开的服务接口(比如说一个提供给互联网上 JavaScript 客户端使用的计算器服务),那么你可以指定一个随机的来源:

如果你只想让有限的几个域名访问它,那么可以在程序中读取请求的 Origin header,进行比对后处理。不过,建议使用现成的库来操作,不要徒手撸,很容易出错。

默认情况下,跨域资源共享是不带用户凭证的。但如果在 Web 服务器端指定如下 header,则将允许携带:

这对 header 组合相当危险。因为它会使跨域访问具备已登录用户的权限,并使用该权限来访问网站资源。所以,如果你不得不使用它,务必小心为上。

仅允许所需要的 HTTP 方法,从而最小化攻击面。

28、合理使用 WebSockets, 避免反跨站请求伪造等漏洞

WebSockets 迄今还是比较新的技术,技术文档较少使用它难免会有些风险。所以,采用时务必要做到以下几点:

  • 对连接进行鉴权如果使用的是基于 Cookie 的鉴权机制,且 WebSocket 服务器与应用服务器在同一个域名下,那就可以在 WebSocket 中继续使用已有的会话。不过切记要对请求源进行验证!如果不是基于 Cookie ,可以在系统中创建一个单次使用、有时间限制并与用户 IP 绑定的授权令牌,用该令牌对 WebSocket 进行授权。
  • 对连接源进行确认理解 WebSockets 的一个关键点在于要知道同源策略对其是无效的。任何一个能与你的系统建立 WebSocket 连接的网站,在使用 Cookie 鉴权的时候,都是可以直接获得用户信息的。因此,在 WebSocket 握手时,必须要确认连接源。可以通过验证请求头中的 Origin 参数来确认。

如果想要做到双重保险,可以采用反跨站请求伪造令牌作为 URL 参数。但针对每个任务则需要创建一次性的独立令牌,而不要直接使用反跨站请求伪造令牌,因为后者主要是用来为应用的其它部分提供安全保障的。

29、采用 U2F 令牌或客户端证书,保护系统关键用户免受钓鱼攻击

如果系统可能会面临钓鱼攻击的威胁,说人话也就是,“如果存在这样的可能性:攻击者创建一个假的网站,骗取管理员/CEO 或其它用户的信任,从而盗取其用户名、密码和验证码”,那么就应该使用 U2F 令牌或客户端证书来防止这种攻击,这样的话即使攻击者有了用户名、密码和验证码也无法得逞。

备注:强调钓鱼防护对于一般用户而言往往会带来不必要的麻烦。然而,提供多一种可选项对终端用户而言也非坏事。此外,向用户提前告知钓鱼攻击的危险也是非常必要的。

30、针对跨站点泄露进行保护

跨站点泄露是一系列浏览器边信道攻击。这种攻击使恶意网站可以从其它 Web 应用程序的用户中推测出信息。

这种攻击存在已有时日,但是浏览器端却是最近才开始添加针对性的预防机制。可以在 这篇文章 中了解关于该类攻击的更多细节以及应该采取的安全控制措施。

二、服务器端的威胁防御

其次,是服务器端的威胁防御,这里从应用系统、基础设施、应用架构、应用监控、事件响应等不同侧面,归纳了如下建议:

,如果运行成功,则说明你没有对外部网络连接做出适当的限制。如何处理此类问题,一般则取决于基础设施。

针对外部的 TCP/UDP/ICMP 连接,一般可以通过以下方式禁用:

  • 网关防火墙,如果有的话;
  • 如果是老式服务器,可以采用本地的防火墙(例如 iptables 或 Windows 防火墙);
  • 如果使用了 Kubernetes,可采用网络策略定义。

DNS 处理起来稍微麻烦一点,我们通常需要允许对一些 hosts 的访问。

  • 如果有本地的 hosts 文件,那就很简单,可以采取上面的任何一种方式来将 DNS 彻底禁用;
  • 如果没有,那么你需要在你上游的 DNS 中配置一个私有的区域,在网络层限制仅能访问该指定的 DNS 服务器。这个私有区域内只允许对一些预先指定的 hosts 的访问。

52、跟踪 DNS 记录,防止子域名劫持

子域名劫持发生场景举例如下:

  • 假如我们拥有一个域名 ,然后创建了一个别名从 映射到 ;
  • 这次促销活动结束后, 域名也到期了;
  • 但是,从 到 的别名映射仍存在;
  • 如果有人购买了这个到期的域名,那么 便可以直接指向该域名;
  • 如果攻击者在 域名下提供一些恶意内容,那么便可以通过 域名直接访问到;

因此,需要随时留意你的 DNS 记录。如果需要处理的类似情况较多,强烈建议你做一个自动监控方案。

的应用程序使用 auth0 进行鉴权。

  • 该应用程序访问内部 API 服务 )发起 HTTP 请求,那就需要立刻引起关注。又或者你的系统尝试访问 /etc/passwd。这两种情况都表示有人已经发现了我们系统中的漏洞。

    60、收集 Web 服务器事件

    对 Web 服务器软件,至少要对访问日志和错误日志进行收集,收集后发送到集中式的日志服务器。在突发事件响应时,这将辅助我们快速理清时间线。

    61、收集网络应用程序防火墙(WAF)日志

    如果你像上文推荐使用了网络应用程序防火墙(WAF),那么也对这个日志进行收集。但不用针对这个日志设置报警,因为它基本上会收到来自互联网各种各样的问题,而且不部分是你不用担心的。

    一旦对我们的系统进行了监控和加固,攻击者将难以快速定位系统漏洞,即使最终发现,我们也能快速了解情况。

    但仅了解情况是不够的,还需要做出如下准备:

    • 快速分析系统日志,了解当前状况和需采取的对应措施
    • 在应用防火墙等产品中,快速对个别 url 地址和参数做出限制
    • 如有需要,快速关停系统

    系统地考虑一下“可能会出现哪些问题”并据此做出调整。设计一个新的系统时,越早开始这一步越好。当对系统发生改变时,再重新梳理一遍这个过程。

    小王:如果攻击者攻破了我们连接了互联网的服务器,怎么办?

    小王:好吧!这就说明我们在这里存在着一个信任关系,我们认为连接了互联网的服务器是不会被攻破的。我们可以信任这一点吗?

    小陈:未必吧!有一百种可能导致我们的服务器被黑掉,例如我们代码中存在的脆弱性,或者依赖中存在的脆弱性,或者是我们 Web 服务器所安装软件的脆弱性。

    小王:好吧!那就让我们打破这层信任关系。接下来该做些什么呢?

    小陈:我们这样来分解一下系统:创建一些内部的接口用来实际访问数据库,由此以来,前端的 Web 服务器就不能直接访问后台的所有东西。

    小王:这是个好办法!除此以外,还有其它什么可能出问题呢?

    小陈:嗯,如果黑客攻破了我们的内网呢?

    小王:那所有东西都要丢失了,因为内网里服务器之间的连接都是未加密的。

    这就是威胁模型,它不需要多么复杂。使用这种方式,来找出系统中可能存在的威胁。

    通过技术控制手段,防止代码未经他人审核便提交入库。这是构建安全开发环境的基础,因为它可以做到:

    • 如果攻击者攻陷了一个开发人员的电脑,或者是开发人员自身企图发起攻击,将不能直接将恶意代码迁入代码库;
    • 如果开发人员的错误导致引入了有漏洞的代码,很可能在被其他人检查时及时发现。

    65、自动化持续集成管道,仅允许简单访问

    开发人员应该有权限触发 Jenkins 构建,且 Jenkins 权限配置也仅该如此,不要再允许其它权限。单个开发人员应该不能在构建阶段引入任意代码。当然,如果像上文推荐的强制性地采用了代码审查,Jenkinsfile 也可以保存在版本管理工具中。

    如果是构建容器镜像,可以把对镜像签名作为构建的一步。将签名密钥存储在安全的地方。构建阶段需要访问密钥,但是杜绝将密钥与 Jenkinsfile 一起存储在版本管理工具中。更好的方式是将密钥存储在 HashiCorp Vault 之类的地方,然后在构建时再进行拉取。

    67、持续集成管道中加入静态应用程序扫描器

    在持续集成管道中使用 SpotBugs 和 Find-Sec-Bugs(或者根据你所采用的技术栈进行选择)之类的工具。它们可以帮你在部署代码之前发现已知的漏洞。

    此外,也可以作为 IDE 的插件安装在开发人员的电脑上,在代码迁入之前就运行这些工具进行检查。

    68、构建时对依赖进行检查,保证最小的依赖集

    应用程序中依赖的每个软件包都是一个风险来源。通过依赖,我们拉取了第三人的代码并在我们的应用服务器上执行,所以,必须要搞清楚我们依赖的这个软件包是什么,为什么会依赖它?

    • 仅使用我们所信任的依赖。它们必须是广泛使用和广为人知的;
    • 采用构建框架,对依赖进行确认。

    此外,严格控制应用服务器的对外连接,从而避免后门的存在。

    69、对依赖进行安全扫描

    使用 OWASP 依赖检查工具对依赖中常见的安全问题进行扫描。除了在持续集成管道中,也可以在开发人员的开发环境运行这些工具。

    70、持续集成管道对镜像进行安全扫描

    如果采用了容器化技术,可以使用 Trivy 等工具对容器镜像进行一些常规漏洞的扫描。

    71、自动化部署和签名验证

    开发人员可以有权限到生产环境中部署,但是权限范围应该控制在前阶段已经构建和签名过的特定镜像,而不是直接访问生产服务器。如果是使用 Kubernetes,可以通过 Notary 或开放策略代理来验证待部署镜像的签名。

    72、设置一个安全人员

    一个人的精力是有限的。我们不能期望每个开发人员都精通渗透测试或是安全工程师。正如你不能期望所有的安全专家都是优秀的开发人员一样。因此,可以在团队中设置一个专门关注安全的人员,主要与开发人员、架构师进行交流,帮助保护我们的应用程序并在团队中传播安全意识。

    保证应用程序的安全性,光靠避免漏洞时不够的,必须全面通盘考虑,主动进行防御。这里对一些主要方法进行了总结:

    • 使用最新版本的的软件组件来执行危险的操作,如身份验证、访问控制、加密、访问数据库或解析 XML,并确保正确配置了这些组件,例如 XML 解析时禁用外部实体。
    • 使用平台提供的安全控制,例如反跨站请求伪造保护。
    • 对安全控制进行集中化处理,特别是身份验证和访问控制,从而避免一些遗漏,如在某些控制器方法上忘记对安全进行控制。
    • 使用 Web 应用程序防火墙,防止应用程序漏洞被发现和被利用。
    • 通过限制对文件、网络和系统资源的访问来对应用程序进行限制。
    • 利用威胁模型发现架构中的威胁,并相应进行处理。既包括在源代码层面对每个开发人员的源代码进行安全控制,也包括在架构层面对前端 Web 服务器的安全控制。
    • 对系统进行监控,制定异常处理预案。
    • 在开发环境和持续集成环境中使用漏洞扫描程序对代码、镜像、依赖进行扫描。
    • 对开发人员、架构师等开展安全培训,并在团队中配备一名安全人员。

    感谢原作者的翻译授权。如果你看到最后一定是收获颇丰,这里还有一个收获更多知识的方法,但比读完这篇文章要难得多,加入我们一起变强!

    变强之路充满荆棘,所以强者才受人尊敬

}

当你进入控制台的多行编写模式时,你可以像标准文字编辑器那样使用文本块。Shitf + Enter 允许你从控制台进入多行模式。

当你编写的 JavaScript 远比单行文字要复杂的时候,这是非常有用的。一但你创建了一个文字编写区域,在命令的最后按 Enter 就会开始运行。

关于多行控制台支持持久性问题,请阅读-该特征可以保存并执行开发工具中可用的特定 JavaScript 片段。

检查元素模式的快捷启动方式

Ctrl + Shitf + C 或者 Cmd + Shift + C 将会在检查元素模式中打开开发者工具(或者选择让它获取焦点),这样你就可以立即检查当前页面。同时焦点全部都会返回到该页面上。在 Mac 上,使用

这个命令记录了任何使用列表布局的数据。下面是一些例子,包括如何使用:

也有另一个 columns 可选参数,它会以字符串数组的形式展示。下面,我们定义了一个 family 对象,其中包含很多 “Person”,之后选择一行来显示:

同时,如果你仅仅是想输出这些数据中的前两行,使用:

日志输出的对象可以使用 console.log() 方法直接在开发工具中预览,而不需要更多的操作。

传递多个参数来指定控制台日志样式

就像我们之前在文档中说过的,你可以使用 %c 给你的控制台添加样式,就像你在 Firebug 中一样。比如:

清理控制台历史的快捷键

在开发者工具上,你可以使用 ? 来打开通用设置,从那里你可以定位到快捷键面板来查看所有

选择一个元素然后在控制台中输出 $0,它将会使用脚本来执行。如果在这个页面上已经有 jQuery 对象,你可以使用 $($0) 来重新选择这个页面上的元素。

你也可以在任何一个元素上右键然后点击 Reveal in Elements Panel,这样就可以在DOM 中找到它。

XPath 是一个在文档中选择节点的查询语言,一般来说返回一个节点的集合,字符串,boolean,或者数字。你可以在 Javascript 开发者工具控制台中使用 XPath 表达式来查询 DOM。

$x(xpath) 命令允许你执行一个脚本。下面的例子将会展示如何通过 $x('//img') 来搜索图片:

然而,该函数同样能够接受第二个参数,该参数是关于路径上下文的,比如:$x(xpath,context)。这就允许我们选择一个详细的上下文(也就是一个内嵌帧)然后使用 XPath 来查询。

在详细的内嵌帧中查询图片

使用 $_helper 会允许你获取控制台的最后结果。我们可以用另外一个 XPath 的例子来证明这个:

命令将会以一个可扩展的 JavaScript 对象形式列出所有提供的对象的所有属性。下面的例子展示了 document.body 下的一个表示属性的可扩展对象。

在具体的帧中运行 JS 控制台

开发者工具底部是下拉选项,它将根据你当前标签的上下文改变。当你在控制台面板的时候,下拉列表允许你选择一个控制台能够操作的帧上下文。在下拉框中选择你的帧,然后你会马上在右侧找到它。

当导航到一个新的页面时停止清理控制台

有时候要跳转到一个新的页面上时,你想保持在控制台上的日志信息。要实现这个,只要在控制台右键,然后选择 "Preserve Log upon Navigation"。当你从当前页面导航到一个不同的页面时,控制台历史信息将不会被清除。

用一个特定的标签开启一个新的计时器。当用相同的标签调用 console.timeEnd() 的时候计时器停止,在控制台上会显示两次记录间流逝的时间。在不调用函数的情况下,该方法用于衡量循环或者代码非常有用:

配置。一般来说一个配置只能标记一个标签,就像下面的 console.("Processing") 一样。要结束这个配置,调用 。

每一个配置文件运行后都会添加到 面板中

查看更多有关控制台技巧,请进入。

  • 通过提供的方法来记录程序的诊断信息,比如 console.log() 或者是
  • 提供的方法,比如选择元素的 $() 命令,或者开启 CPU 配置的 profile() 命令。

利用时间轴帧模式配置帧

时间轴面板提供了关于加载你的 web 应用时花费时间的预览,比如进入 DOM 事件花费的时间,提交页面布局或者在屏幕渲染元素的花费。它也允许你进入三个单独的方面来查明为什么你的应用会很慢,这三个界面是:时间,帧以及实际内存使用。

时间轴默认情况下并不会显示任何数据。但是通过打开你的 app,然后点击在窗口底部的圆圈 ,来开启一个 session 的记录。或者使用 Ctrl + E 或者 Cmd + E 的快捷键也会开始一个录制的标记。

这个录制按钮将会从灰色变为红色,时间轴也会开始捕获你的 app。在你的 app 中完成几个动作后再次按下按钮来停止录制。

帧模式让你洞察到进行中的任务,你的应用程序会按帧(更新)在屏幕上显示。在这个模式中,阴影的垂直区域标尺对应重新计算的样式,合成等等。每一个垂直长条的透明部分表示空闲时间,至少是在你页面上的空闲时间。

举个例子,你的第一帧需要 15 毫秒,但是执行第二帧需要 30 毫秒。一个常见的情况是帧的刷新率是同步的,所以第二帧将稍微比 15 毫秒多一点去渲染。这里,3 号帧丢失了 “true” 硬件帧并且已经提交给了后面一帧,因此第二帧的时长其实相当于双倍了。

如果你的应用并没有很多的动画在其中,并且在执行输入事件的时候浏览器需要执行大量重复的动作,那么使用帧是个好办法。当你有足够的时间在帧内执行完这样的事件,那么你的应用响应能力会更高,并且将会有良好的用户体验。

当我们设定为 60 fps时,我们有最多 16.66 ms来做点事情。这点时间并不算多,所以让尽可能提升你动画的性能是十分重要的。

使用警告定位到指定的布局事件

在时间轴中,如果你在记录视图中看见一个黄色的图标,就说明你的一些代码触发了强制/同步布局事件。

你希望避免这些不必要的布局触发器,因为他们能够显著影响到你的页面的性能。

通过别人来分享和分析一段时间轴记录

你可以浏览和并且跟其他开发者分享时间轴,这要感谢一个有用的导入/导出插件。使用 Ctrl + E 或者 Cmd + E 来开始/结束记录然后在时间轴上右键,选择 Save Timeline data。该菜单还支持重新浏览已经导出的时间轴数据。

使用 console.timeStamp() 函数可以给你的时间轴记录添加注解。这就帮你把你的 web 中的代码和另外一个窗口或者浏览事件关联在了一起。

你的应用可以通过调用 console.timeStamp() 函数来对你的时间轴记录进行注释。这就使你可以轻易的将代码和另一个窗口以及浏览事件绑定在一起。在下面的记录中,时间轴被标记为 “Adding Result”。下面来看看通过使用控制台来制作时间轴的例子。

real-time FPS 计数器是一个用来视图化帧速和躲闪的工具。该工具可以通过进入设置菜单然后选中 ”Show FPS meter“ 来使用。

当这个工具开始运转,你将会看到在右下角有一个黑色的盒子,同时还有帧的统计数字。该计数器可以在实时编辑中用于诊断你的页面为什么掉帧,而不必在时间轴视图间来回切换。

需要谨记的是如果你只是追踪 FPS 计数器可能会使你没有注意到的断断续续的跳帧现象。在使用 content 的时候一定要注意。如果 FPS 在桌面上的效果与在设备上的效果不一样,这也没有意义。所以要特别的小心在性能上的配置。

更多配置使用时间轴的实用技巧,请跳转到:

  • 一个只要应用运行就会记录并分析所有活动的地方,这是开始调查你的应用性能问题的最好的地方。
  • 深入了解帧速,记录中生成的几种类型以及 Chrome 计算页面元素的位置和大小时的布局流程。
  1. 打开开发者工具选择概述面板
  2. 在你的页面进行一些引起漏洞的操作
  3. 重复步骤 2 和步骤 3 三次
  4. 将过滤器从”所有对象“改为”快照 1 和 2 之间的对象“
  5. 你现在应该已经可以看到漏洞对象的集合。你可以选择其中的一个并在对象保留树中来查看其包含内容的列表,这有助于找到泄露的原因。

红色节点是处于生命周期的,因为他们是分离的 DOM 树中的一部分,并且树中有一个节点被 JavaScript (或者是一个闭包变量,一些属性)引用。

黄色节点表示一个从 DOM 节点,引用的一个对象的属性或者一个数组元素。应该有一系列从 DOM 窗口到元素的属性(比如 window.foo.bar[2].baz)。

理解在 CPU 概述中的时间开销

在 CPU 概述中,”(idel)“,时间是当前标记的。花费在非浏览器中的程序是(”program“)。

Comparsion 视图通过显示已经被垃圾回收器正确清理的对象来帮助你追踪内存漏洞。通常用于比较某次操作前后的两份(或更多)内存快照。具体内容是通过检查变化区释放的内存和引用计数来确认内存泄漏的存在以及造成泄露的原因。

Dominators 视图用于确认垃圾回收正常工作时出现的本不该存在于对象上的引用(也就是说他们)。

Summary 视图可帮助您在利用构造器名称分组的基础上捕获对象(和它们的内存使用)。这个视图通常对追踪 DOM 漏洞很有帮助。

Containment 视图提供了一个更好的对象构建视图,它帮助我们通过全局的命名空间(也就是窗口)来分析对象,找出是什么是他们一直保持存在。它允许分析程序闭包并从底层深入你的对象。

更多内存剖析技巧,请参考:

  • 该文章会叫你如何使用分析堆内存来找出你的应用中的内存漏洞

在 DOM 修改器上调试

右键点击一个元素然后选中 “Break on Subtree Modification”:不论什么时候脚本穿过了元素并且修改了他们,调试器都能够自动的运转起来,以便告诉你正在发生什么:

另外值得一提的是,暂停内嵌样式属性的修改,对于调试 DOM 动画非常有用 。

从 Sources 面板中,双击暂停脚本执行按钮会在未捕获异常发生时中断代码执行,并保留调用堆栈和应用程序的当前状态-有些人将之称为紫色暂停。

我们知道开发者工具支持条件断点,只需要你在想要的行上点击一下设置一个断点,就跟普通的设置断点一样。

你可以在某一行右键然后选择 "Edit Breakpoint",然后就出现了一个表达式编辑区域。把你需要的条件写在这里(比如:如果表达式的返回值为真,则断点将会在这里停止)

一个普通的表达式可能是这个样子:x === 5,然而 console.log 声明同样是完全有效的输入。

这个方法十分有效,并且我们也可以轻易的看见在断点上调用的 console.log 语句:

由于 console.log 没有一个真正的返回值,不确定的条件断点不会导致执行被暂停,你的代码将继续运行。这非常像一个通过硬编码来执行 console.log 表达式而不直接修改你的代码。

开发者工具支持格式化精简后的 JavaScript 以便阅读。要格式化,你需要:

  • 进入 Sources 面板,然后从脚本列表中选择你想要格式化脚本。
  • 然后点击在开发者工具底部的格式化按钮(用大括号来标记)
  • 你的代码应该已经排版好了

重点观察一个表达式或者一个变量的值

在一次调试会话中,为了避免重复编写一个你要多次查看的变量或者表达式,你可以把它添加到 “Watch Expression” 列表中。当你修改它们之后可以刷新或者直接运行代码来查看改变后的效果。

假设你定了一个变量,其值为 s 并且对它执行下面的操作:

你认为 s 是一个字符串么?事实上不一定。它也可能是一个字符串对象的包装。试试看下面的观察表达式:

第一个是字符串常量,第二个是一个完整的对象。令人困惑是,这两个值几乎是一模一样的。但是第二个有一个真正的属性,你也可以自行设置。

展开属性列表你就会注意到,它为什么不是一个完整的对象:它会有一个内在的属性 [[PrimitiveValue]],这里面存储着字符串原本的值。你并不能通过你的代码来访问这个属性,但是你现在可以通过开发者工具的调试工具来查看它。

从调试器中打开 "XHR 断点"选项,当开始一个 XHR 请求时你可以指定你的代码跳入任何一个 URL (甚至是一个子字符串)。甚至是告诉它加载每一个 XHR 时都中断。

取消注册在元素上的事件处理器

随着 “Element” 标签的打开,找到在 DOM 树中的元素,然后点击要选择的节点。注意:你也可以通过使用控制台 API 中的 getEventListener(targetNode) 来实现。

在右侧,点击展开 “Event Listeners” 选项。在那里你会找到所有注册在元素上的事件监听列表。

当在 Sources 面板中调试的时候,你有时候会希望同时进入控制台。这时你只需要简单的点击下 escape 键就可以打开控制台了。

你可以在这个控制台编写执行 JavaScript 来查看预期效果,但是更好的地方是如果你在一个断点初暂停,已经执行的 JS 将会在当前暂停的上下文中。

提升在断点处暂停时的效率

当你的脚本在一个断点处暂停时,会有一些有用的参数供你使用。

你可能会知道通过 “Continue”,“Step Over”,"Step Into" 以及 “Step Out” 来控制代码的执行,但是这些按钮都有键盘快捷键。学习这些会让你的在代码中导航时更加高效。

观察表达式(在侧边栏的右侧)将会将会监视表达式,所以你不必总是跳回控制台(例如 X===Y)。调用堆栈显示了从系统开始运行一直到当前位置时经历过的函数调用。

DOM 断点展示了任何在元素面板中右键一个节点时使用 “Break on” 做出的更改。这对调试监听器是否已经正确的添加到节点上以及当他们被调用时发生了什么很有帮助。

XHR 断点面板也同样十分有用,因为它可以为 XMLHttpRequests 设置断点。通过输入一个你想要查看 URL 子字符串来具体说明断点。

你可能想在抛出一个异常的时候暂停 JavaScript 的执行,并检查调用栈,范围变量和您的应用程序的状态。

在脚本面板的顶部有一个暂停按钮,它可以让你选择不同的异常处理模式。你可能不想暂停所有的异常,除非你正在调试的代码是被 try/catch 包裹着的。

如果你想在所有加载在一个页面上的文件中查找一个指定的字符串,你可以通过下面的快捷键调用搜索面板:

这个搜索同时支持正则表达式和区分大小写。

源映射提供了一个语言无关的方法来将编译过的工程代码映射到你原来的开发环境中编写的源代码。

当分析产品代码的时候,代码通常已经被缩小过(以防一个语言被翻译成编译过的 JavaScript),这就使你很难找到哪一行代码是映射到你原本的代码中的。

在编译阶段,源映射(source map)可以保存这个信息以允许你调试产品代码,并且会将你原本文件中的行号返回给你。这使得整个世界都不同了,因为你可以再阅读产品代码的同时进行调试了,不管它是在 CoffeeScript 中或是其它分位置 - 只要它具有一个源映射,你就可以轻松调试。

要在 Chrome 中启用源映射:

当你开始调试你的 CoffeeScript 代码的时候,应该感谢这个声明,是它让开发者工具知道了你的源文件在哪里。

然后,您可以利用这个源映射,在您的优化 / 缩小阶段使用类似 UglifyJS2 的工具引用第一个源映射( CS 到 JS ),并把它所映射的简化后的 JavaScript 文件返回到 CoffeeScript 上,而不是直接传给编译后的 JavaScript 的输出位置。这就允许你直接调试产品代码,并且改动会直接返回到 CoffeeScript 源代码中。

更多有用的创作工作流程技巧,请转到:

  • 在这里你可以学习如何优化你的开发工作流程以节省一些常规操作所花的时间,比如定位到文件或者某个函数,持续编辑脚本或样式表以及简化调整布局的过程。
  • 学习有关新特性的内容,比如 Snippet,该特性可以用于保存并执行开发工具内置的特定的 JavaScripts 片段。

在 Setting > General > Show rulers 下可以启用一个尺子,当你鼠标悬停在某个元素上或者选中一个元素的时候,它会显示出来。

CSS 属性的自动完成

开发者工具支持 CSS 属性以及值的自动完成(包括那些需要前缀的),这对于决定为当前元素设置什么属性是很有帮助的。

当你开始为属性或者值输出一个名称的时候就会弹出建议,而且你也可以使用右键在可用的属性列表中滚动。要知道,选中的选项会直接应用到页面样式表中因此它的效果是可以直接看到的。

在样式面板中,使用已命名的字段(比如:“red”),HSL,HEX 或者 RGB 值可以定义颜色。如果需要的话,你可以按住 shift/鼠标点击以在这些值之间迭代选择。

如果你想要展示所有支持的属性,你可以使用 Ctrl + space 来展示一个建议列表。

建议列表是和特定内容相关的并且在特定情况下(比如,针对字体的时候)数字,已命名或者带前缀的值也是也可以显示出来的。

在开发者工具中的颜色选择器

开发者工具中包含了一个内置的颜色选择器,当你点击任何有效颜色的预览方块时,就会显示出来。

你可以 Shift + 点击,来更改选中颜色的格式。

添加新的 CSS 样式

在 CSS 规则的代码块(包括 "element.style")内点击任何地方都可以添加一个新的 CSS 属性,并且该属性会立即应用到当前页面。

一旦你已经成功添加了一个属性,你可以按下 tab 键来设置下一个属性。

点击 按钮,新的选择器将会被添加到右边的 Style 子面板中。这样可以定义一个选择器,同样地,你可以用这种方式添加新的属性以及值。

注意:你也可以通过单击一个选择器的名称来编辑 Style 面板中的任何选择器。一旦名称发生改变,选择器已经存在的属性将会被添加到新的选择器定义的元素中。

新的伪类选择器可以通过一种类似的方式来添加,就是将他们加入到选择器的名称之后。同样需要注意的是点击新建选择器按钮旁边的 “toggle element states” 按钮后,将转换到 "Force element state" 面板中。

返回到 “Matched CSS Rules” 面板中,点击规则后面样式表的链接将会进入 Sources 面板。在该面板中会显示完整的样式表定义,并且会跳转到相应规则所在的行。

在元素面板中你可以拖拽一个元素来改变他在父类中的位置,或者将它移动到文档中一个完全不同的地方。

想要强制元素适应某种特定状态?

  • 可以选择其中一个:active,:hover,:focus,:visited 来强制进入其中一种状态。

通过开发者工具编写并调试 Sass

注意:要在 Chrome 中编写 Sass 你必须要有 版本的 Sass 编译器,这是现在仅有的支持源映射的版本。

调整一个含有预编译的 CSS 样式的文件可以算是一种挑战,因为在开发工具中对 CSS 样式做出的修改并不会返回到 Sass 源文件中。这意味着,当你做出更改后,如果你希望这些改动能够生效,那就必须返回到源文件中通过外部编辑器手动做出更改。

最近 Sass 开发工作流做出了改进,使得这不再是问题。要获取 Sass 支持:

  1. 确认你有在开发者工具使用 about:flags 的经验
  2. 导航到你想在 Chrome 上对 Sass 进行调试的工程页面(通过开发者工具打开)文件创建源映射文件(.map)。接下来,你看到的就像是在控制台中的一样:这就证明了 Sass 调试器确实在工作
  3. 如果按照预期启动了工作,你可以进入元素面板。首先你将会注意到你的样式的文件名现在显示的是相应的 .scss 源文件,并且源文件中对应的行号也显示出来了。
  4. 在这里点击文件名将会直接进入到 Sources 面板中去,并且会高亮显示相应选择器所在的行。现在你就可以再开发工具内调整 Sass 源文件了,并且该内置编辑器支持语法高亮。
  5. 如果你想要在 Source 面板中编辑一个 Sass 文件,首先需要确保的就是开发工具能够知道相应文件存在于本地文件系统的哪个位置。在编辑器中右键,然后选择 ”Save As“ 可以用当前正在编辑的文件重写原本的文件。由于自动重加载已经开启并且 Sass 已经在后台运行,所以我们做的更改会马上的显示在 Chrome 和开发者编辑器中。

更多有关使用元素和样式的技巧,请进入

  • 在这里,你可以学习如何查看页面的实际结构。比如,你可能对一个图片是否有 HTML id 属性很好奇,并且想知道这个属性的值是什么。
  • 了解如何观察 DOM 树中的每一个信息,包括检查以及快速编辑 DOM 元素。如果你需要确认页面某个部分的 HTML 片段时你可能会经常访问元素选项卡。

也许你可能知道,网络面板会展示你的页面上所有的请求,包括 XHRs。在请求上右键点击会显示上下文菜单,之后选择 “Replay XHR”,就可以重新发出 XHRs 请求(POST 或者 GET)

  • 点击 “record” 捕捉一个多页面痕迹

在网络面板上获取更多信息的技巧

左键点击网络面板中时间轴列的头部,可以访问更多网络请求的细节。你可以在以下的选择中选择一个:

浏览灰色的文字来深入查看:

  • 每次请求的 HTTP 网络定义是什么?

  • 每次请求第一个字节是什么时候?

  • 什么才是响应时间最慢的资源?

  • 什么是持续时间最短的资源?

在网络面板中的任何一行的头部右键,你可以启用或者禁用列。默认情况下有 3 列不会显示:

在网络面板中,你可以使用底部窗口的过滤器来观察 WebSocket 信息帧。

比如:进入 实例中,在网络面板底部选择 “WebSocket” 过滤器然后点击 “Connect” 按钮。你通过 “Send” 按钮发送的任何信息都可以用 “Frames” 子面板观察到。

在网络面板中查找和过滤 XHRs

当你在网络面板中观察网络请求时,可以通过键盘上的特殊键来缩小查找范围。使用 Ctrl + F 或者 Cmd + F 可以让整个过程更轻松。

在搜索输入框中,输入你要搜索的关键字,那些请求中有文件名/ URL 与之匹配的就会高亮显示。结果显示出来后,你可以使用输入框旁边的上下按钮来选择你需要的那一项。

尽管这很有用,但是如果它能够只显示和你搜索的关键字相匹配的选项的话就会更有用。"Filter" 选项就可以做到这一点,下面请看例子:

"about:net-internals" 页面是一个特殊的 URL,它存放了网络堆内部状态的一个临时视图。这对调试性能和连接问题十分有帮助。这里面包括请求性能的信息,代理设置以及 DNS 缓存。

更多计算网络性能的技巧,请前往

  • 在这里可以学习如何在你的应用中深入查看网络选项。包括时间数据详情,HTTP 请求和相应头,cookies,WebSocket 数据以及更多。
  • 学习哪个资源开始加载的时间最慢?哪个资源占需要最长的加载时间(持续时间)?谁开启了一个网络请求?等等。

触摸是一种在电脑上很难测试的输入方式,因为大多数桌面上不支持触摸输入。在移动端上测试则会延长你的开发周期,一旦你做出了改变,你就需要上传到服务器然后切换到设备上测试。

这个问题的一个解决方法是在你的开发机器上模拟一个触摸事件。对单点触摸来说,Chrome 开发者工具支持单个的模拟,这使得在电脑上调试移动应用变得更加简单。

现在我们可以像标准桌面事件那样调试触控事件,也可以在源面板中设置事件监听断点。

模拟 UA 字符串 & 设备视图

通常在桌面上启动一个样品然后在你想支持的设备上处理具体移动设备部分会更加容易一些,设备模拟器可以帮助我们使这个过程更加简单。

开发者工具支持包括本地 User Agent 以及尺寸的重载在内的设备仿真。这就使开发者可以在不同的设备和操作系统上调试移动端的显示效果。

现在你可以模拟确切设备的尺寸,比如 Galaxy Nexus 以及 iPhone 等来测试你的查询驱动设计。

在一个支持地理信息支持的 HTML5 应用中,调试不同经纬度下的输出是十分有用的。

开发者工具支持重写 navigator.geolocation 的位置信息,也可以模拟一个模拟地理位置。

  1. 允许页面使用你的位置。这样可以获取精确位置。
  2. 打开在开发者工具中的重写菜单。
  1. 刷新页面。这个例子会使用你重写后的位置信息来定位。
  1. 刷新页面。页面就会提示你查找你的位置信息失败。

Dock-to-right 模式同样对在一个缩小的视图中预览你页面的表现是很有帮助的。要使用这个:

  • 通过长按开发者工具窗口底部的布局选择器图标来开启 dock-to-right 模式。
  • 你现在可以拖拽窗口分配器然后左右拖拽来改变视图的宽度,然后触发你的媒体查询断点。

点击右下角的设置齿轮,然后在 Setting > General 中启用 ”Disable Javascript“。当开发者工具已经打开并且这个选项也被选中,那么当前页面 JavaScript 脚本就会失效。

Cmd + ]Cmd + [(或者 Ctrl + ]Ctrl + [)快捷键允许你轻松地在开发者工具的不同标签之间切换。使用他们就可以避免手动选择标签。

改进后的元素面板和源面板是水平分开放置的,并且,只要你打开了 dock-to-right 模式,你就可以在 Chrome 测试版中体验该特性:

然而,如果你已经有一个非常宽的屏幕并且不想使用这个屏幕,只需要在设置面板中取消选中 ”Split panels vertically when docked to right“ 选项即可。

在设置齿轮下面,你可以启用 Disable cache 选项来使磁盘缓存失效。这对开发来说用处是巨大的,但是开发者工具必须是可见并打开的才能实现这个功能。

含有 Shadow DOM 的元素并不会在元素标签中显示。

如果你发现你自己已经会使用 remote 调试了,你可能想试试 ”about:inspect“,它会展示在 Chrome 中展示所有可检查的标签/扩展插件。点击 ”inspect“ 来选择一个页面然后加载开发工具并且跳转到相应页面。

详细观察哪个站点有应用缓存

通过访问 "about:appcache-internals",你可以看到有关应用缓存的信息。这允许你查看当最后做出更改的时候哪些站点是有缓存的,以及他们占用了多少空间。你也可以在这里移除这些缓存:

在网络/控制台面板中选择多重过滤器

你可能已经意识到在网络和控制台面板中也是可以使用过滤器的,这允许你基于不同的标准缩小数据的范围。

你可能不知道的是你可以使用快捷键( Cmd/Ctrl + 点击)来选择过滤器并将其应用到视图中。下面你可以看到在多个面板键的行为:

如果你请求一个硬刷新,在开发者工具打开的情况下点击并按住 Chromes 的刷新按钮。你应该会看见一个下拉菜单,它允许你进行清除缓存和并进行硬重载。这有助节省时间!

深入理解 Chrome 任务管理器

Chrome 中的任务管理可以让你深入了解任何选项卡对应的 GPU,CPU 以及 JavaScript 内存使用状况,CSS 和脚本缓存使用状况。

按照下面的步骤来打开任务管理:

  1. 在浏览器工具栏中点击 Chrome 菜单。
  2. 从那里,你可以通过右键点击任何一行来进入扩展视图或者通过右键来结束一个程序。

利用开发者工具测试 iOS 应用

是一个客户端的库同时也是一个使用 Chrome 开发工具来调试应用网络状况以及管理对象上下文的网关服务器。

编写了一个非常有用的开发者工具扩展插件,它可以在内存中检索可用的 JavaScript 对象并生成相应的图,还可以根据值或者名称来进行匹配。

}

我要回帖

更多关于 pdf编辑器哪个好用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信