黑帽seo培训教程大纲 置顶

豆瓜学院事务王豆瓜 发表了文章 • 0 个评论 • 13 次浏览 • 1 天前 • 来自相关话题

一、黑帽seo首页排名及基础培训 ----1.1  黑帽首页 ...查看全部
一、黑帽seo首页排名及基础培训

----1.1  黑帽首页排名概念解析

----1.2  织梦cms仿站,采集更新,优化技巧。

----1.3  实战如何利用插件/二开快速采集打造权重站

----1.4  单站拓展 wordpress搭建优化实操

----1.5  单站拓展 discuz搭建优化实操

----1.6  实战打造maccms电影流量站实操

----1.7  黑帽镜像单站的搭建以及优化

----1.8  黑帽镜像站群的批量管理以及优化建议

----1.9  黑帽seo单页面优化技巧实操

----小结 单站汇总讲解,实战中问题解答

二、黑帽seo内页排名拓展培训

----2.1 黑帽seo内页排名分类及概念讲解

----2.2 单目录/二级目录实操

----2.3 泛目录实操及优化建议。目录排名核心讲解

----2.4 泛站/单/泛域名/泛内页理论区分和实操用途

----2.5 泛站群实操演练和优化技巧

----2.6 实战寄生虫程序实操演练

----2.7 蜘蛛池实操以及各大引擎蜘蛛喜好区分

----2.8 关键词的抓取方式和技巧

----2.9 老域名的分析指标和挑选方法

----小结 内页排名汇总讲解,实战中的问题解答

三、黑帽seo辅助手法延申

----3.1 服务器的搭建和安全策略

----3.2 了解安全防御的常见漏洞类型

----3.3 了解常见攻击/劫持方式和工作原理

----3.4 了解常用hack软件的的工作原理

----3.5 技术变现的几条思路指导和汇总遗留问题

SEO是什么意思

回复

白帽SEO入门admin 发起了问题 • 1 人关注 • 0 个回复 • 3 次浏览 • 5 小时前 • 来自相关话题

新版Discuz论坛应用中心接入教程

web前端开发王豆瓜 发表了文章 • 0 个评论 • 3 次浏览 • 1 天前 • 来自相关话题

方法一: 升级为 X3.4 最新版,下载地址:https://www.dismall.com ...查看全部

方法一:

升级为 X3.4 最新版,下载地址:https://www.dismall.com/thread-73-1-1.html

不想升级X3.4的看方法二



方法二:

适用版本:X2.5、X3、X3.1、X3.2、X3.3、X3.4

下载自动转换文件:文件下载地址: http://pan.dougua.net/s/sal6hbe5    (1.31 KB, 下载次数: 22705) 解压后,把 replacedismall.php 放到论坛根目录,访问 http://你的网站/replacedismall.php 执行,会自动接入到新的应用中心



如果遇到“自动替换新应用中心失败,请尝试其他方法”,一般是文件权限问题导致无法修改,设置以下文件可读写(777)权限,再执行文件

source/function/function_cloudaddons.php

source/language/lang_admincp_msg.php

source/language/lang_admincp.php



建站经验有哪些

回复

web前端开发王豆瓜 回复了问题 • 1 人关注 • 1 个回复 • 10 次浏览 • 3 天前 • 来自相关话题

HTTP协议详解

网络安全防护王豆瓜 发表了文章 • 0 个评论 • 10 次浏览 • 4 天前 • 来自相关话题

HTTP协议简介 超文本传输协议(英文:HyperText Trans ...查看全部

HTTP协议简介



超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。



HTTP的发展是由蒂姆·伯纳斯-李于1989年在欧洲核子研究组织(CERN)所发起。HTTP的标准制定由万维网协会(World Wide Web Consortium,W3C)和互联网工程任务组(Internet Engineering Task Force,IETF)进行协调,最终发布了一系列的RFC,其中最著名的是1999年6月公布的 RFC 2616,定义了HTTP协议中现今广泛使用的一个版本——HTTP 1.1。



2014年12月,互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis(httpbis)工作小组将HTTP/2标准提议递交至IESG进行讨论,于2015年2月17日被批准。 HTTP/2标准于2015年5月以RFC 7540正式发表,取代HTTP 1.1成为HTTP的实现标准。



HTTP协议概述



HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通过使用网页浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel)。



尽管TCP/IP协议是互联网上最流行的应用,HTTP协议中,并没有规定必须使用它或它支持的层。事实上,HTTP可以在任何互联网协议上,或其他网络上实现。HTTP假定其下层协议提供可靠的传输。因此,任何能够提供这种保证的协议都可以被其使用。因此也就是其在TCP/IP协议族使用TCP作为其传输层。



通常,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息。



HTTP工作原理



HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。



以下是 HTTP 请求/响应的步骤:



\1. 客户端连接到Web服务器

一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.luffycity.com



\2. 发送HTTP请求

通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。



\3. 服务器接受请求并返回HTTP响应

Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。



\4. 释放连接TCP连接

若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;



\5. 客户端浏览器解析HTML内容

客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。



例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:




  1. 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;

  2. 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;

  3. 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;

  4. 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;

  5. 释放 TCP连接;

  6. 浏览器将该 html 文本并显示内容;  



  



  img



  http协议是基于TCP/IP协议之上的应用层协议。



  基于 请求-响应 的模式



    HTTP协议规定,请求从客户端发出,最后服务器端响应该请求并 返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有 接收到请求之前不会发送响应



    img



  无状态保存



    HTTP是一种不保存状态,即无状态(stateless)协议。HTTP协议 自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个 级别,协议对于发送过的请求或响应都不做持久化处理。



    img



    使用HTTP协议,每当有新的请求发送时,就会有对应的新响应产 生。协议本身并不保留之前一切的请求或响应报文的信息。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把HTTP协议设计成 如此简单的。可是,随着Web的不断发展,因无状态而导致业务处理变得棘手 的情况增多了。比如,用户登录到一家购物网站,即使他跳转到该站的 其他页面后,也需要能继续保持登录状态。针对这个实例,网站为了能 够掌握是谁送出的请求,需要保存用户的状态。HTTP/1.1虽然是无状态协议,但为了实现期望的保持状态功能, 于是引入了Cookie技术。有了Cookie再用HTTP协议通信,就可以管 理状态了。有关Cookie的详细内容稍后讲解。



  无连接



    无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间,并且可以提高并发性能,不能和每个用户建立长久的连接,请求一次相应一次,服务端和客户端就中断了。但是无连接有两种方式,早期的http协议是一个请求一个响应之后,直接就断开了,但是现在的http协议1.1版本不是直接就断开了,而是等几秒钟,这几秒钟是等什么呢,等着用户有后续的操作,如果用户在这几秒钟之内有新的请求,那么还是通过之前的连接通道来收发消息,如果过了这几秒钟用户没有发送新的请求,那么就会断开连接,这样可以提高效率,减少短时间内建立连接的次数,因为建立连接也是耗时的,默认的好像是3秒中现在,但是这个时间是可以通过咱们后端的代码来调整的,自己网站根据自己网站用户的行为来分析统计出一个最优的等待时间。



HTTP请求方法



HTTP/1.1协议中共定义了八种方法(也叫“动作”)来以不同方式操作指定的资源:



GET



向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问。





与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。



POST



向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。



PUT



向指定资源位置上传其最新内容。



DELETE



请求服务器删除Request-URI所标识的资源。



TRACE



回显服务器收到的请求,主要用于测试或诊断。



OPTIONS



这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。



CONNECT



HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。



注意事项:




  1. 方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed),当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)。

  2. HTTP服务器至少应该实现GET和HEAD方法,其他方法都是可选的。当然,所有的方法支持的实现都应当匹配下述的方法各自的语义定义。此外,除了上述方法,特定的HTTP服务器还能够扩展自定义的方法。例如PATCH(由 RFC 5789 指定的方法)用于将局部修改应用到资源



请求方式: get与post请求(通过form表单我们自己写写看)





  • GET提交的数据会放在URL之后,也就是请求行里面,以?分割URL和传输数据,参数之间以&相连,如EditBook?name=test1&id=123456.(请求头里面那个content-type做的这种参数形式,后面讲) POST方法是把提交的数据放在HTTP包的请求体中.




  • GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.




  • GET与POST请求在服务端获取请求数据方式不同,就是我们自己在服务端取请求数据的时候的方式不同了,这句废话昂。





HTTP状态码



所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。



状态代码的第一个数字代表当前响应的类型:




  • 1xx消息——请求已被服务器接收,继续处理

  • 2xx成功——请求已成功被服务器接收、理解、并接受

  • 3xx重定向——需要后续操作才能完成这一请求

  • 4xx请求错误——请求含有词法错误或者无法被执行

  • 5xx服务器错误——服务器在处理某个正确请求时发生错误



虽然 RFC 2616 中已经推荐了描述状态的短语,例如"200 OK","404 Not Found",但是WEB开发者仍然能够自行决定采用何种短语,用以显示本地化的状态描述或者自定义信息。



  img



URL



超文本传输协议(HTTP)的统一资源定位符将从因特网获取信息的五个基本元素包括在一个简单的地址中:




  • 传送协议。

  • 层级URL标记符号(为[//],固定不变)

  • 访问资源需要的凭证信息(可省略)

  • 服务器。(通常为域名,有时为IP地址)

  • 端口号。(以数字方式表示,若为HTTP的默认值“:80”可省略)

  • 路径。(以“/”字符区别路径中的每一个目录名称)

  • 查询。(GET模式的窗体参数,以“?”字符为起点,每个参数以“&”隔开,再以“=”分开参数名称与数据,通常以UTF8的URL编码,避开字符冲突的问题)

  • 片段。以“#”字符为起点



以http://www.luffycity.com:80/news/index.html?id=250&page=1 为例, 其中:



http,是协议;

www.luffycity.com,是服务器;

80,是服务器上的默认网络端口号,默认不显示;

/news/index.html,是路径(URI:直接定位到对应的资源);

?id=250&page=1,是查询。

大多数网页浏览器不要求用户输入网页中“http://”的部分,因为绝大多数网页内容是超文本传输协议文件。同样,“80”是超文本传输协议文件的常用端口号,因此一般也不必写明。一般来说用户只要键入统一资源定位符的一部分(www.luffycity.com:80/news/index.html?id=250&page=1)就可以了。



由于超文本传输协议允许服务器将浏览器重定向到另一个网页地址,因此许多服务器允许用户省略网页地址中的部分,比如 www。从技术上来说这样省略后的网页地址实际上是一个不同的网页地址,浏览器本身无法决定这个新地址是否通,服务器必须完成重定向的任务。



HTTP请求格式(请求协议)



    img



     URL包含:/index/index2?a=1&b=2;路径和参数都在这里。



    img



      请求头里面的内容举个例子:这个length表示请求体里面的数据长度,其他的请求头里面的这些键值对,陆续我们会讲的,大概知道一下就可以了,其中有一个user-agent,算是需要你记住的吧,就是告诉你的服务端,我是用什么给你发送的请求。



      img



      



      以京东为例,看一下user-agent



      img



     img



      看一个爬虫的例子,爬京东的时候没问题,但是爬抽屉的时候必须带着user-agent,因为抽屉对user-agent做了判断,来判断你是不是一个正常的请求,算是反扒机制的一种。



      img



      打开我们保存的demo.html文件,然后通过浏览器打开看看就能看到页面效果。



      写上面这些内容的意思是让你知道有这么个请求头的存在,有些是有意义的,请求头我们还可以自己定义,就在requests模块里面那个headers={},这个字典里面加就行。



      



  



HTTP响应格式(响应协议)



  img



  img


Linux mount 命令

网络安全防护王豆瓜 发表了文章 • 0 个评论 • 4 次浏览 • 4 天前 • 来自相关话题

mount 命令用来挂载文件系统。其基本命令格式为: mount -t type [-o options] device dir device ...查看全部

mount 命令用来挂载文件系统。其基本命令格式为:

mount -t type [-o options] device dir

device:指定要挂载的设备,比如磁盘、光驱等。

dir:指定把文件系统挂载到哪个目录。

type:指定挂载的文件系统类型,一般不用指定,mount 命令能够自行判断。

options:指定挂载参数,比如 ro 表示以只读方式挂载文件系统。



Help



可以通过 man page 和 -h 选项来获得最直接的帮助文档:




$ man mount
$ mount -h


文件系统的类型



虽然多数情况下我们不用指定 -t 参数显式地说明文件系统的类型,但文件系统的类型对 mount 命令来说确实是非常重要的。原因是假如你要挂载一个当前系统不支持的文件系统,它是没办法工作的。当前系统支持的文件系统类型是由内核来决定的,比如 ext2、ext3、ext4、sysfs 和 proc 等常见的文件系统默认都是被支持的。我们可以通过查看 /proc/filesystems 文件来观察当前系统具体都支持哪些文件系统:




$ cat /proc/filesystems




第一列说明文件系统是否需要挂载在一个块设备上, nodev 表明后面的文件系统不需要挂接在块设备上。 第二列是内核支持的文件系统。



看懂输出的文件系统信息



通过 mount 命令查看已挂载的文件系统,会输出丰富的信息,如下图所示:





让我们先来解释一下输出信息的格式和含义。输出中的每行代表挂载的一个文件系统,其格式为:

fs_spec on fs_file type fs_vfstype (fs_mntopts)

fs_spec:挂载的块设备或远程文件系统

fs_file:文件系统的挂载点

fs_vfstype:文件系统的类型

fs_mntopts:与文件系统相关的更多选项,不同的文件系统其选项也不太一样

比如上图中的第一行含义为:挂载的设备为 sysfs,挂载点为 /sys,文件系统的类型为 sysfs。括号中的 rw 表示以可读写的方式挂载文件系统,noexec 表示不能在该文件系统上直接运行程序。



与 mount 命令相关的文件



/etc/fstab

/etc/mtab

/proc/mounts



mount -a 会将 /etc/fstab 中定义的所有挂载点都挂上(一般是在系统启动时的脚本中调用,自己最好别用!)。



mount 和 umount 命令会在 /etc/mtab 文件中维护当前挂载的文件系统的列表,这个文件在目前的系统中还是被支持的。但是更好的方式是用链接文件 /proc/mounts 代替 /etc/mtab 文件。这是因为在用户空间中维护的普通文件 /etc/mtab 很难稳定可靠的与 namespaces、containers 等 Linux 的高级功能协作。在 ubuntu 16.04 上, /etc/mtab 和  /proc/mounts 一样,都是指向 /proc/self/mounts 的链接文件。



下面我们介绍一些 mount 命令的常见用例。



查看挂载的文件系统



输出系统挂载的所有文件系统

如果执行 mount 命令时不加任何参数,就会输出系统挂载的所有文件系统:




$ mount


输出指定类型的文件系统

通过 -t 参数可以只输出指定类型的文件系统,比如下面的命令只会输出 tmpfs 类型的文件系统:




$ mount -t tmpfs


格式化并挂载磁盘



对于一个磁盘分区,我们可以使用 mkfs 命令把磁盘分区格式化为指定的文件系统,比如 ext4:




$ sudo mkfs -t ext4 /dev/sdb1


然后把该分区挂载到 /mnt 目录:




$ sudo mount /dev/sdb1 /mnt


挂载光驱



现在偶尔还还需要使用一下光驱,挂载光驱的命令如下:




$ sudo mount /dev/cdrom /mnt




该命令把设备 /dev/cdrom 挂载在 /mnt 目录中,然后我们就可以在 /mnt 目录下访问光驱中的内容了。



以只读的方式挂载



可以把文件系统挂载为只读模式,从而保护数据。比如将 /dev/sdb1 用只读模式挂在 /mnt 目录:




$ sudo mount -o ro /dev/sdb1 /mnt




这样 /mnt 目录下的文件都是只读的。



把只读的挂载重新挂载为读写模式



当系统出现故障进入单用户模式时,通常 / 根目录会以只读方式挂载,这时如果想要修改文件,会发现所有文件都是只读状态,无法修改。好在 Linux 下的 mount 命令支持一个remount 选项,只需要执行如下命令:




$ mount / -o rw,remount


就可以将根分区重新挂载为读写状态。



除了根目录,重新挂载其它挂载点也是一样的,比如我们把前面挂载的 sdb1 分区重新挂载为读写模式:




$ sudo mount /mnt -o rw,remount




挂载 windows 共享文件



局域网中一般都是 windows 系统和 Linux 系统共存的,如果能轻松的从 Linux 系统中访问 windows 的文件共享将是一件很开心的事情。其实这也很简单,在 windows 上共享文件时指定一个本机的用户,然后在 mount 命令中指定这个用户及其密码就可以了:




$ sudo mount -t cifs -o username=nick,password=Test123456 //10.32.2.30/doc /mnt




注意,-t cifs 是可以省略的,mount 命令能够自动识别。一定要使用 IP 代替 windows 主机的名称。



挂载虚拟文件系统



proc、tmpfs、sysfs、devpts 等都是 Linux 内核映射到用户空间的虚拟文件系统,它们不和具体的物理设备关联,但它们具有普通文件系统的特征,应用层程序可以像访问普通文件系统一样来访问他们。

比如内核的 proc 文件系统默认被挂载到了 /proc 目录,当然我们也可以再把它挂载到其它的目录,比如 /mnt 目录下:




$ sudo mount -t proc none /mnt


由于 proc 是内核虚拟的一个文件系统,并没有对应的设备,所以这里的 -t 参数不能省略。由于没有对应的源设备,这里的 none 可以是任意字符串,取个有意义的名字就可以了,因为用 mount 命令查看挂载点信息时第一列显示的就是这个字符串。



在 Linux 上我们还可以通过 tmpfs 文件系统轻松地构建出内存磁盘来。比如在内存中创建一个 512M 的 tmpfs 文件系统,并挂载到 /mnt 下,这样所有写到 /mnt 目录下的文件都存储在内存中,速度非常快,不过要注意,由于数据存储在内存中,所以断电后数据会丢失掉:




$ sudo mount -t tmpfs -o size=512m tmpfs /mnt


挂载 loop 设备



在 Linux中,硬盘、光盘、软盘等都是常见的块设备,他们在 Linux 下的目录一般是 /dev/sda1、/dev/cdrom、 /dev/fd0 这样的。而 loop device 是虚拟的块设备,主要目的是让用户可以像访问上述块设备那样访问一个文件。 loop device 设备的路径一般是 /dev/loop0、dev/loop1 等,具体的个数跟内核的配置有关。



挂载 ISO 文件

需要用到 loop device 的最常见的场景是挂载一个 ISO 文件。比如将 /tmp/test.iso 这个光盘镜像文件使用 loop 模式挂载到 /mnt 下,这样就不需要把 ISO 文件刻录到光盘上了,当然也不需要光驱了。

下面的命令把 projects 目录下的内容打包到 test.iso 文件中:




$ mkisofs -o test.iso projects/


然后把这个 ISO 文件挂载到 /mnt 目录下:




$ sudo mount test.iso /mnt




挂载 test.iso 文件使用了虚拟设备 /dev/loop0,并且是只读的模式。



虚拟硬盘

loop 设备另一种常见的用法是虚拟一个硬盘,比如我想玩儿一下 btrfs 这个文件系统,但系统中目前的所有分区都已经用了,里面都是有用的数据,不想格式化他们,这时虚拟硬盘就有用武之地了。



我们先通过 dd 命令创建一个 512M 的文件:




$ dd if=/dev/zero bs=1M count=512 of=./vdisk.img


然后在这个文件里面创建 btrfs 文件系统:




$ sudo apt install btrfs-progs
$ mkfs.btrfs vdisk.img


最后把它挂载到 /mnt :




$ sudo mount vdisk.img /mnt


把多个设备挂载到同一个目录



在 Linux 中可以把多个设备挂载到同一个目录。默认后面挂载的内容会让前面挂载的内容隐藏掉,只有 unmount 了后面挂载的内容,才会显示原来的内容。



挂载一个设备到多个目录



我们也可以把同一个设备挂载到不同的目录,这样在不同的目录中看到的是同样的内容。还可以在不同的目录中控制挂载的权限,比如以只读方式挂载:




$ sudo mount -o ro vdisk.img ./testdir


这样从不同的目录访问相同的文件系统时就具有了不同的访问权限。



总结



mount 是 Linux 系统中非常重要的一个命令,因为离开 mount 挂载的文件系统我们几乎什么也干不了。本文介绍了一些 mount 命令的基础用法 ,日常使用应该是够了。mount 命令还有一些相关的复杂概念和用法,比如 bind mount 和 shared subtree 等,笔者会在今后写专门的文章进行介绍。


为什么要用token,token的作用是什么

web前端开发王豆瓜 发表了文章 • 0 个评论 • 7 次浏览 • 4 天前 • 来自相关话题

为什么要用 Token?   而要回答这个问题很简单——因为它能解决问题! ...查看全部

为什么要用 Token?



 



而要回答这个问题很简单——因为它能解决问题!



 



可以解决哪些问题呢?



 





  1. Token 完全由应用管理,所以它可以避开同源策略




  2. Token 可以避免 CSRF 攻击(http://dwz.cn/7joLzx)




  3. Token 可以是无状态的,可以在多个服务间共享





 



Token 是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位。如果这个 Token 在服务端持久化(比如存入数据库),那它就是一个永久的身份令牌。



 



于是,又一个问题产生了:需要为 Token 设置有效期吗?



 



需要设置有效期吗?



 



对于这个问题,我们不妨先看两个例子。一个例子是登录密码,一般要求定期改变密码,以防止泄漏,所以密码是有有效期的;另一个例子是安全证书。SSL 安全证书都有有效期,目的是为了解决吊销的问题,对于这个问题的详细情况,来看看知乎的回答(http://dwz.cn/7joMhq)。所以无论是从安全的角度考虑,还是从吊销的角度考虑,Token 都需要设有效期。



 



那么有效期多长合适呢?



 



只能说,根据系统的安全需要,尽可能的短,但也不能短得离谱——想像一下手机的自动熄屏时间,如果设置为 10 秒钟无操作自动熄屏,再次点亮需要输入密码,会不会疯?如果你觉得不会,那就亲自试一试,设置成可以设置的最短时间,坚持一周就好(不排除有人适应这个时间,毕竟手机厂商也是有用户体验研究的)。



 



然后新问题产生了,如果用户在正常操作的过程中,Token 过期失效了,要求用户重新登录……用户体验岂不是很糟糕?



 



为了解决在操作过程不能让用户感到 Token 失效这个问题,有一种方案是在服务器端保存 Token 状态,用户每次操作都会自动刷新(推迟) Token 的过期时间——Session 就是采用这种策略来保持用户登录状态的。然而仍然存在这样一个问题,在前后端分离、单页 App 这些情况下,每秒种可能发起很多次请求,每次都去刷新过期时间会产生非常大的代价。如果 Token 的过期时间被持久化到数据库或文件,代价就更大了。所以通常为了提升效率,减少消耗,会把 Token 的过期时保存在缓存或者内存中。



 



还有另一种方案,使用 Refresh Token,它可以避免频繁的读写操作。这种方案中,服务端不需要刷新 Token 的过期时间,一旦 Token 过期,就反馈给前端,前端使用 Refresh Token 申请一个全新 Token 继续使用。这种方案中,服务端只需要在客户端请求更新 Token 的时候对 Refresh Token 的有效性进行一次检查,大大减少了更新有效期的操作,也就避免了频繁读写。当然 Refresh Token 也是有有效期的,但是这个有效期就可以长一点了,比如,以天为单位的时间。



 



时序图表示



 



使用 Token 和 Refresh Token 的时序图如下:



 



1)登录



 





 



2)业务请求



 





 



3)Token 过期,刷新 Token



 





 



 



上面的时序图中并未提到 Refresh Token 过期怎么办。不过很显然,Refresh Token 既然已经过期,就该要求用户重新登录了。



 



当然还可以把这个机制设计得更复杂一些,比如,Refresh Token 每次使用的时候,都更新它的过期时间,直到与它的创建时间相比,已经超过了非常长的一段时间(比如三个月),这等于是在相当长一段时间内允许 Refresh Token 自动续期。



 



到目前为止,Token 都是有状态的,即在服务端需要保存并记录相关属性。那说好的无状态呢,怎么实现?



 



无状态 Token



 



如果我们把所有状态信息都附加在 Token 上,服务器就可以不保存。但是服务端仍然需要认证 Token 有效。不过只要服务端能确认是自己签发的 Token,而且其信息未被改动过,那就可以认为 Token 有效——“签名”可以作此保证。平时常说的签名都存在一方签发,另一方验证的情况,所以要使用非对称加密算法。但是在这里,签发和验证都是同一方,所以对称加密算法就能达到要求,而对称算法比非对称算法要快得多(可达数十倍差距)。



 



更进一步思考,对称加密算法除了加密,还带有还原加密内容的功能,而这一功能在对 Token 签名时并无必要——既然不需要解密,摘要(散列)算法就会更快。可以指定密码的散列算法,自然是 HMAC。



 



上面说了这么多,还需要自己去实现吗?不用!JWT 已经定义了详细的规范,而且有各种语言的若干实现。



 



不过在使用无状态 Token 的时候在服务端会有一些变化,服务端虽然不保存有效的 Token 了,却需要保存未到期却已注销的 Token。如果一个 Token 未到期就被用户主动注销,那么服务器需要保存这个被注销的 Token,以便下次收到使用这个仍在有效期内的 Token 时判其无效。有没有感到一点沮丧?



 



在前端可控的情况下(比如前端和服务端在同一个项目组内),可以协商:前端一但注销成功,就丢掉本地保存(比如保存在内存、LocalStorage 等)的 Token 和 Refresh Token。基于这样的约定,服务器就可以假设收到的 Token 一定是没注销的(因为注销之后前端就不会再使用了)。



 



如果前端不可控的情况,仍然可以进行上面的假设,但是这种情况下,需要尽量缩短 Token 的有效期,而且必须在用户主动注销的情况下让 Refresh Token 无效。这个操作存在一定的安全漏洞,因为用户会认为已经注销了,实际上在较短的一段时间内并没有注销。如果应用设计中,这点漏洞并不会造成什么损失,那采用这种策略就是可行的。



 



在使用无状态 Token 的时候,有两点需要注意:



 





  1. Refresh Token 有效时间较长,所以它应该在服务器端有状态,以增强安全性,确保用户注销时可控




  2. 应该考虑使用二次认证来增强敏感操作的安全性





 



到此,关于 Token 的话题似乎差不多了——然而并没有,上面说的只是认证服务和业务服务集成在一起的情况,如果是分离的情况呢?



 



分离认证服务



 



当 Token 无状态之后,单点登录就变得容易了。前端拿到一个有效的 Token,它就可以在任何同一体系的服务上认证通过——只要它们使用同样的密钥和算法来认证 Token 的有效性。就样这样:



 





 



 



当然,如果 Token 过期了,前端仍然需要去认证服务更新 Token:



 





可见,虽然认证和业务分离了,实际即并没产生多大的差异。当然,这是建立在认证服务器信任业务服务器的前提下,因为认证服务器产生 Token 的密钥和业务服务器认证 Token 的密钥和算法相同。换句话说,业务服务器同样可以创建有效的 Token。



如果业务服务器不能被信任,该怎么办?



 



不受信的业务服务器



 



遇到不受信的业务服务器时,很容易想到的办法是使用不同的密钥。认证服务器使用密钥1签发,业务服务器使用密钥2验证——这是典型非对称加密签名的应用场景。认证服务器自己使用私钥对 Token 签名,公开公钥。信任这个认证服务器的业务服务器保存公钥,用于验证签名。幸好,JWT 不仅可以使用 HMAC 签名,也可以使用 RSA(一种非对称加密算法)签名。



 



不过,当业务服务器已经不受信任的时候,多个业务服务器之间使用相同的 Token 对用户来说是不安全的。因为任何一个服务器拿到 Token 都可以仿冒用户去另一个服务器处理业务……悲剧随时可能发生。



 



为了防止这种情况发生,就需要在认证服务器产生 Token 的时候,把使用该 Token 的业务服务器的信息记录在 Token 中,这样当另一个业务服务器拿到这个 Token 的时候,发现它并不是自己应该验证的 Token,就可以直接拒绝。



 



现在,认证服务器不信任业务服务器,业务服务器相互也不信任,但前端是信任这些服务器的——如果前端不信任,就不会拿 Token 去请求验证。那么为什么会信任?可能是因为这些是同一家公司或者同一个项目中提供的若干服务构成的服务体系。



 



但是,前端信任不代表用户信任。如果 Token 不没有携带用户隐私(比如姓名),那么用户不会关心信任问题。但如果 Token 含有用户隐私的时候,用户得关心信任问题了。这时候认证服务就不得不再啰嗦一些,当用户请求 Token 的时候,问上一句,你真的要授权给某某某业务服务吗?而这个“某某某”,用户怎么知道它是不是真的“某某某”呢?用户当然不知道,甚至认证服务也不知道,因为公钥已经公开了,任何一个业务都可以声明自己是“某某某”。



 



为了得到用户的信任,认证服务就不得不帮助用户来甄别业务服务。所以,认证服器决定不公开公钥,而是要求业务服务先申请注册并通过审核。只有通过审核的业务服务器才能得到认证服务为它创建的,仅供它使用的公钥。如果该业务服务泄漏公钥带来风险,由该业务服务自行承担。现在认证服务可以清楚的告诉用户,“某某某”服务是什么了。如果用户还是不够信任,认证服务甚至可以问,某某某业务服务需要请求  A、B、C 三项个人数据,其中 A 是必须的,不然它不工作,是否允许授权?如果你授权,我就把你授权的几项数据加密放在 Token 中……



 



废话了这么多,有没有似曾相识……对了,这类似开放式 API 的认证过程。开发式 API 多采用 OAuth 认证,而关于 OAuth 的探讨资源非常丰富,这里就不深究了。


vue中slot的插槽是什么

web前端开发王豆瓜 发表了文章 • 0 个评论 • 6 次浏览 • 4 天前 • 来自相关话题

vue中的插槽————slot 什么是插槽? ...查看全部

vue中的插槽————slot



什么是插槽?




  • 插槽(Slot)是Vue提出来的一个概念,正如名字一样,插槽用于决定将所携带的内容,插入到指定的某个位置,从而使模板分块,具有模块化的特质和更大的重用性。

  • 插槽显不显示、怎样显示是由父组件来控制的,而插槽在哪里显示就由子组件来进行控制



怎么用插槽?



默认插槽



父组件




<template>
<div>
我是父组件
<slotOne1>
<p style="color:red">我是父组件插槽内容</p>
</slotOne1>
</div>
</template>



在父组件引用的子组件中写入想要显示的内容(可以使用标签,也可以不用)




子组件(slotOne1)




<template>
<div class="slotOne1">
<div>我是slotOne1组件</div>
<slot></slot>
</div>
</template>



在子组件中写入slot,slot所在的位置就是父组件要显示的内容







  • 当然再父组件引用的子组件中也可以写入其他组件



父组件




<template>
<div>
我是父组件
<slotOne1>
<p style="color:red">我是父组件插槽内容</p>
<slot-one2></slot-one2>
</slotOne1>
</div>
</template>


子组件(slotOne2)




<template>
<div class="slotOne2">
我是slotOne2组件
</div>
</template>




具名插槽



子组件




<template>
<div class="slottwo">
<div>slottwo</div>
<slot name="header"></slot>
<slot></slot>
<slot name="footer"></slot>
</div>
</template>



在子组件中定义了三个slot标签,其中有两个分别添加了name属性header和footer




父组件




<template>
<div>
我是父组件
<slot-two>
<p>啦啦啦,啦啦啦,我是卖报的小行家</p>
<template slot="header">
<p>我是name为header的slot</p>
</template>
<p slot="footer">我是name为footer的slot</p>
</slot-two>
</div>
</template>



在父组件中使用template并写入对应的slot值来指定该内容在子组件中现实的位置(当然也不用必须写到template),没有对应值的其他内容会被放到子组件中没有添加name属性的slot中






插槽的默认内容



父组件




<template>
<div>
我是父组件
<slot-two></slot-two>
</div>
</template>


子组件




<template>
<div class="slottwo">
<slot>我不是卖报的小行家</slot>
</div>
</template>



可以在子组件的slot标签中写入内容,当父组件没有写入内容时会显示子组件的默认内容,当父组件写入内容时,会替换子组件的默认内容






编译作用域



父组件




<template>
<div>
我是父组件
<slot-two>
<p>{{name}}</p>
</slot-two>
</div>
</template>
<script>
export default {
data () {
return {
name: 'Jack'
}
}
}
</script>


子组件




<template>
<div class="slottwo">
<slot></slot>
</div>
</template>




作用域插槽



子组件




<template>
<div>
我是作用域插槽的子组件
<slot :data="user"></slot>
</div>
</template>

<script>
export default {
name: 'slotthree',
data () {
return {
user: [
{name: 'Jack', sex: 'boy'},
{name: 'Jone', sex: 'girl'},
{name: 'Tom', sex: 'boy'}
]
}
}
}
</script>



在子组件的slot标签上绑定需要的值




父组件




<template>
<div>
我是作用域插槽
<slot-three>
<template slot-scope="user">
<div v-for="(item, index) in user.data" :key="index">
{{item}}
</div>
</template>
</slot-three>
</div>
</template>



在父组件上使用slot-scope属性,user.data就是子组件传过来的值



mysql怎么安装,mysql安装教程

web前端开发王豆瓜 发表了文章 • 0 个评论 • 7 次浏览 • 4 天前 • 来自相关话题

一、MYSQL的安装 首先登入官网下载mysql的安装包,官网地址:https://dev.mysql.com/downloads/mysql/ ...查看全部

一、MYSQL的安装



首先登入官网下载mysql的安装包,官网地址:https://dev.mysql.com/downloads/mysql/





 



 一般下载这个就好,现在的最新版本是5.8,但是据说已经收费了,5.7以前的版本不收费,可以下载5.7以前的版本,这里面以我现在使用的mysql-5.5.49为例。



 



但是这里面存在一个问题:我说的下面的步骤是对于安装板的安装方式,上面这个是解压版的压缩包,可能会存在一些问题。(十分感谢5楼给我的留言,找到了错误)



安装版本的网址: https://dev.mysql.com/downloads/mysql/



下载这两个即可:





 



 



 



1、打开下载的mysql安装文件mysql-5.5.27-win32.zip,双击解压缩,运行“setup.exe”。



          



 



 



 



2、选择安装类型,有“Typical(默认)”、“Complete(完全)”、“Custom(用户自定义)”三个选项,选择“Custom”,按“next”键继续。





 



 



 



3、点选“Browse”,手动指定安装目录。





 



 



4、填上安装目录,我的是“F:\Server\MySQL\MySQL Server 5.0”,也建议不要放在与操作系统同一分区,这样可以防止系统备份还原的时候,数据被清空。按“OK”继续。





 



 在确认完这个路径之后,继续点击Server data files,也需要修改这个路径,这个文件保存的是在mysql里面编写的数据库代码



确认一下先前的设置,如果有误,按“Back”返回重做。按“Install”开始安装。



 



 



 



 



 



 



 



5、正在安装中,请稍候,直到出现下面的界面, 则完成MYSQL的安装





 



关注我的微信公众号:念流声,可以免费领取各种计算机视频资源!



 



 



二、MYSQL的配置



1、安装完成了,出现如下界面将进入mysql配置向导。





 



 



 



 



2、选择配置方式,“Detailed Configuration(手动精确配置)”、“Standard Configuration(标准配置)”,我们选择“Detailed Configuration”,方便熟悉配置过程。





 



 



3、选择服务器类型,“Developer Machine(开发测试类,mysql占用很少资源)”、“Server Machine(服务器类型,mysql占用较多资源)”、“Dedicated MySQL Server Machine(专门的数据库服务器,mysql占用所有可用资源)” 





 



 



4、选择mysql数据库的大致用途,“Multifunctional Database(通用多功能型,好)”、“Transactional Database Only(服务器类型,专注于事务处理,一般)”、“Non-Transactional Database Only(非事务处理型,较简单,主要做一些监控、记数用,对MyISAM数据类型的支持仅限于non-transactional),按“Next”继续。





 



 



5、选择网站并发连接数,同时连接的数目,“Decision Support(DSS)/OLAP(20个左右)”、“Online Transaction Processing(OLTP)(500个左右)”、“Manual Setting(手动设置,自己输一个数)”。 





 



 



 



 



6、是否启用TCP/IP连接,设定端口,如果不启用,就只能在自己的机器上访问mysql数据库了,在这个页面上,您还可以选择“启用标准模式”(Enable Strict Mode),这样MySQL就不会允许细小的语法错误。如果是新手,建议您取消标准模式以减少麻烦。但熟悉MySQL以后,尽量使用标准模式,因为它可以降低有害数据进入数据库的可能性。按“Next”继续 。





 



 



7、就是对mysql默认数据库语言编码进行设置(重要),一般选UTF-8,按 “Next”继续。





 



 



8、选择是否将mysql安装为windows服务,还可以指定Service Name(服务标识名称),是否将mysql的bin目录加入到Windows PATH(加入后,就可以直接使用bin下的文件,而不用指出目录名,比如连接,“mysql.exe -uusername -ppassword;”就可以了,不用指出mysql.exe的完整地址,很方便),我这里全部打上了勾,Service Name不变。按“Next”继续。





 



 



9、询问是否要修改默认root用户(超级管理)的密码。“Enable root access from remote machines(是否允许root用户在其它的机器上登陆,如果要安全,就不要勾上,如果要方便,就勾上它)”。最后“Create An Anonymous Account(新建一个匿名用户,匿名用户可以连接数据库,不能操作数据,包括查询)”,一般就不用勾了,设置完毕,按“Next”继续。





 



 



10、确认设置无误,按“Execute”使设置生效,即完成MYSQL的安装和配置。





 



 



 



 



注意:设置完,按“Finish”有一个比错误,就是不能“Start service”,一般出在以前有安装mysql的服器上,解决的法,先保以前安装的mysql服底卸掉了;不行的检查是否按上面一,之前的密是否有修改,照上面的操作;如果依然不行,将mysql安装目下的data文件夹备份,然后除,在安装完成后,将安装生成的 data文件夹删除,份的data文件移回来,再重启mysql服就可以了,这种情况下,可能需要将数据库检查一下,然后修一次,防止数据出错。





 



 



解决方法:



1, 卸载MySQL



2, Windows Xp系统删除目录 C:\Documents and Settings\All Users\Application Data\



windows 7\8\10操作系统删除目录C:\ProgramData\MySQL



3、重新安装就可以了


switch case用法是什么

回复

web前端开发王豆瓜 发起了问题 • 1 人关注 • 0 个回复 • 10 次浏览 • 4 天前 • 来自相关话题

javascript用什么软件

回复

编程入门教程王豆瓜 发起了问题 • 1 人关注 • 0 个回复 • 14 次浏览 • 2020-02-05 10:42 • 来自相关话题

对路径的访问被拒绝怎么解决

回复

网络安全防护王豆瓜 发起了问题 • 1 人关注 • 0 个回复 • 25 次浏览 • 2020-01-09 04:38 • 来自相关话题

怎么做到远程关机

回复

网络安全防护王豆瓜 回复了问题 • 1 人关注 • 1 个回复 • 23 次浏览 • 2020-01-09 04:19 • 来自相关话题

web前端设计学习

回复

web前端开发王豆瓜 发起了问题 • 1 人关注 • 0 个回复 • 30 次浏览 • 2020-01-07 19:02 • 来自相关话题

营销神器论坛

回复

编程入门教程王豆瓜 回复了问题 • 1 人关注 • 1 个回复 • 46 次浏览 • 2019-12-29 22:17 • 来自相关话题

网站不收录怎么办

回复

网站运营数据分析王豆瓜 回复了问题 • 1 人关注 • 1 个回复 • 32 次浏览 • 2019-12-29 22:12 • 来自相关话题

Shell下制作自解压安装包,实现脚本的简单加密

回复

web前端开发王豆瓜 发起了问题 • 1 人关注 • 0 个回复 • 19 次浏览 • 2019-12-29 12:40 • 来自相关话题

params 有什么用?

回复

网络安全防护王豆瓜 发起了问题 • 1 人关注 • 0 个回复 • 26 次浏览 • 2019-12-28 17:18 • 来自相关话题

什么是反射?

回复

网络安全防护王豆瓜 发起了问题 • 1 人关注 • 0 个回复 • 26 次浏览 • 2019-12-28 17:17 • 来自相关话题

家电营销活动策划方案

回复

编程入门教程王豆瓜 发起了问题 • 1 人关注 • 0 个回复 • 37 次浏览 • 2019-12-28 13:12 • 来自相关话题