Laravel 数据库实例教程 —— 使用DB门面操作数据库

Laravel支持多种数据库,包括MySQL、Postgres、SQLite和SQL Server,在Laravel中连接数据库和查询数据库都非常简单,我们可以使用多种方式与数据库进行交互,包括原生SQL语句、查询构建器以及Eloquent ORM。本节我们先演示如何使用原生SQL在Laravel应用中对数据库进行增删改查。 1、连接数据库 Laravel中数据库配置文件为config/database.php,打开该文件,默认内容如下:

如果要修改数据库配置信息,去修改.env对应值即可。我们实例教程使用的Homestead开发环境默认配置,不做修改。如果你没有使用Homestead,则需要根据本地配置修改相应配置值。 我们在讲Windows上安装Homestead的时候,已经演示过数据库连接测试,以及如何在本地使用Navicat连接Homestead的数据库,这里不再赘述,下面直接进入如何使用数据库进行增删改查。 2、数据库初始化 我们在项目根目录使用Artisan命令运行Laravel自带的迁移生成users表和password_reset表: 对应在数据库中生成三张表: 3、使用DB门面进行增删改查 3.1 插入数据 我们使用DB门面执行原生SQL语句,插入操作使用DB门面的insert方法,代码如下:

在浏览器中输入http://laravel.app:8000/test,执行成功后在数据库中插入两条记录: 3.2 查询语句 查询操作使用DB门面的select方法,代码如下:

在浏览器地址栏输入http://laravel.app:8000/test,输出内容如下: 可以看到select查询返回的结果是数组。而数组中的每一个元素都是PHP对象。 我们还 可以看到在执行查询的时候使用了参数绑定,以避免SQL注入。除此之外还可以使用命名绑定:

效果一样。 3.3 更新语句 更新表记录可以使用DB门面的update方法,该方法返回受影响的行数:

打印结果为1,如果没有更新任何记录则返回0。 3.4 删除语句 删除表记录使用DB门面的delete方法,和update类似,该方法返回被删除的行数:

打印结果为2,表数据都被我们删除了。 3.5 通用语句 除了上述这些DML(insert/update/delete)和DQL(select)语句,SQL语句还包括DCL(create/drop等)和DDL(grant等),要运行后者,我们可以调用DB门面的statement方法:

执行完该语句后,数据表users会被删除。 4、监听查询事件 除此之外,我们还可以通过DB门面的listen方法监听查询事件,比如我们在记录日志和调试的时候这会给我们确定问题提供便利,可以在服务提供者的boot方法中注册该监听器,例如我们在AppServiceProvider的boot方法中定义监听器如下:

这样我们运行如下SQL语句:

则浏览器会输出如下内容:

5、数据库事务 很多时候,我们需要执行一连串操作,而其中任何一个操作出错则整个流程失败,需要回退重来,这个时候我们就要用到数据库事务。 DB门面提供两种方式支持数据库事务,一种是调用transaction方法然后传入闭包作为参数,我们将需要进行事务操作的逻辑放到闭包函数内:

另一种是 beginTransaction、 rollBack和 commit三个方法一起使用从而构建一个完整的事务操作:

此外,使用DB门面提供的事务还支持查询构建器和Eloquent ORM数据库操作。   from:https://laravelacademy.org/post/854.html

龙生   18 Aug 2017
View Details

Laravel 视图实例教程 —— 在视图间共享数据及视图Composer

视图的基本使用很简单,可查看视图文档了解详情,这里我们演示两个使用示例:在视图间共享数据和视图Composer。 1、在视图间共享数据 除了在单个视图中传递指定数据之外,有时候需要在所有视图中传入同一数据,即我们需要在不同视图中共享数据。要实现这一目的,需要使用视图工厂的share方法。 全局帮助函数view和前面一节提到的response类似,如果传入参数,则返回Illuminate\View\View实例,不传入参数则返回Illuminate\View\Factory实例。所以我们可以通过在服务提供者的boot方法中使用如下方式实现视图间共享数据:

我们在routes.php中定义两个路由:

然后在resources/views目录下创建一个home.blade.php视图文件,内容如下:

再创建一个hello.blade.php视图文件:

在浏览器中分别访问http://laravel.app:8000/testViewHello和http://laravel.app:8000/testViewHome,则都能解析出$sitename的值。 2、视图Composer 有时候我们想要在每次视图渲染时绑定一些特定数据到视图中,比如登录用户信息,这时候我们就要用到视图Composer,视图Composer通过视图工厂的composer方法实现。该方法的第二个回调参数支持基于控制器动作和闭包函数两种方式。 简单起见,我们还是基于AppServiceProvider,不去单独创建服务提供者,这里我们传递闭包参数(控制器动作参考视图文档):

修改hello.blade.php视图文件:

在浏览器中访问http://laravel.app:8000/testViewHello,输出内容如下:

你也可以传递数据到多个视图:

甚至所有视图(使用通配符*):

注:更多视图方法请参考Laravel核心源码:Illuminate\View\View.php及Illuminate\View\Factory.php。 from:http://laravelacademy.org/post/697.html

龙生   18 Aug 2017
View Details

HTTP响应实例教程 —— 基本使用、生成Cookie、返回视图、JSON/JSONP、文件下载及重定向

1、Response篇 1.1 基本响应 最基本的HTTP响应只需在路由闭包或控制器动作中返回一个简单字符串即可,但是具体业务逻辑中大部分响应都是在控制器动作中返回Response实例或者视图。Response是继承自 Symfony\Component\HttpFoundation\Response的 Illuminate\Http\Response类的一个实例,我们可以使用该实例上的一系列方法来创建HTTP响应:

在浏览器中访问,F12查看响应头信息(Chrome浏览器): 如果我们尝试修改$status=500,则头信息如下: 为方便使用,我们还可以使用全局帮助函数response来替代生成Response对象实例:

效果一样。以后我们将默认使用这种方式,不再生成Response对象实例。 此外,需要注意的是,Illuminate\Http\Response 类中还使用了ResponseTrait,header方法正是该trait提供的,除了header之外,该trait还提供了withCookie、content和status方法。header方法用于设置响应头信息,withCookie方法用于添加cookie,这两个方法都会返回调用它的Response自身对象,所以这两个方法都支持方法链(即多次调用header或withCookie方法);而content和status方法则用于返回当前响应的响应实体内容和响应状态码。 1.2 添加Cookie 正如上面提到的,我们使用withCookie方法为响应添加cookie,由于header和withCookie支持方法链,所以我们可以这样使用:

在浏览器中访问,F12查看Cookie信息: 我们还可以使用该cookie的有效期、作用域等信息:

注:withCookie方法实际上是调用了全局帮助函数cookie生成cookie,然后将cookie放到响应头中。 再次在浏览器中访问,F12查看cookie信息如下: 里面多出了有效期及作用域名等相关信息。 此外,我们还关注到该cookie是经过加密的,这一点我们在前面已经提到过,这是为了安全性考虑,如果要取消加密,在app/Http/Middleware/EncryptCookies.php文件中将对应的cookie名添加到EncryptCookies类属性$except中即可:

再次在浏览器中访问http://laravel.app:8000/testResponseCookie,F12查看Cookie信息如下: 当然,为了安全起见,我们不建议这么做。 2、ResponseFactory篇 response函数如果不传入参数会返回 Illuminate\Contracts\Routing\ResponseFactory契约的实现——Illuminate\Routing\ResponseFactory,该类中提供了多个方法用来生成更加丰富的响应类型,比如视图响应、JSON响应、文件下载等等。 2.1 视图响应 使用view方法即可返回一个视图作为响应内容:

与之对应的,我们需要在resources/views下新建一个视图文件hello.blade.php,其内容如下:

接下来我们在浏览器中访问http://laravel.app:8000/testResponseView,页面输出:

还可以再简化,如果我们不需要自定义HTTP响应头,还可以直接使用全局帮助函数view:

效果和上面一样。 2.2 返回JSON/JSONP 还可以使用json方法返回json格式数据:

在浏览器中访问,F12查看响应头信息: 根据输出信息可见,json方法会自动设置Content-Type为application/json,并调用PHP内置函数json_encode讲数组转化为json格式字符串。 如果返回的是JSONP响应,也很简单,只需要在json后面再调用setCallback即可:

2.3 文件下载 使用download方法可生成用于下载给定路径文件的响应,这里我们下载上一节上传的文件:

在浏览器中访问http://laravel.app:8000/testResponseDownload,页面将会下载laravel-5-1.jpg文件并保存为Laravel学院.jpg。 3、 RedirectResponse篇 重定向响应是 Illuminate\Http\RedirectResponse类的实例,我们通常使用全局帮助函数redirect来生成 RedirectResponse实例。和response类似,redirect函数如果接收参数则调用的是Illuminate\Routing\Redirector类的to方法,如果无参调用则返回的是Redirector对象实例。 3.1 基本重定向

如果要重定向到上一个位置,则使用back方法:

3.2 重定向到命名路由 使用route方法重定向到命名路由:

在浏览器中访问http://laravel.app:8000/testResponseRedirect,页面会跳转到http://laravel.app:8000/hello/laravelacademy并输出:

如果命名路由中有参数,那么我们可以在route中传入参数:

在浏览器中访问http://laravel.app:8000/testResponseRedirect,页面会跳转到http://laravel.app:8000/hello/laravelacademy/100并输出:

3.3 重定向到控制器动作 使用action方法重定向到控制器动作:

在浏览器中访问http://laravel.app:8000/testResponseRedirect,则页面会跳转到http://laravel.app:8000/post并输出对应内容。 当然也可以传递参数到action方法:

3.4 带一次性Session数据的重定向 使用with方法可以携带一次性session数据到重定向请求页面(一次性session数据即使用后立即销毁的session数据项):

这种特性通常在提交表单验证失败返回错误信息时很有用。 from:http://laravelacademy.org/post/623.html

龙生   18 Aug 2017
View Details

HTTP 请求实例教程 —— 获取请求数据、Cookie及文件上传处理

1、获取Request请求实例 Laravel中一般通过控制器方法依赖注入来获取当前请求的Request实例。 我们通过定义一个隐式控制器来进行本章节的测试。首先我们在routes.php定义路由如下:

然后我们在app/Http/Controllers下创建一个控制器RequestController.php:

要访问getBasetest方法,我们只需在浏览器中访问http://laravel.app:8000/request/basetest?test=laravelacademy,这样页面会输出:

2、获取请求URL及请求方法 2.1 获取请求URL路径 要获取当前请求的URL,我们可以通过Request实例上的path方法,需要注意的是该方法返回相对请求路径,如果要获取绝对请求路径,可以通过Request实例上的另一个方法——url:

我们在浏览器中访问http://laravel.app:8000/request/url,页面输入如下内容:

2.2 获取请求方法 我们还可以通过调用Request实例上的getMethod方法获取当前请求的方法:

3、获取请求数据 3.1 当前请求输入 使用Request实例上的input方法即可获取请求输入数据。该方法可以接收两个参数,第一个参数是传递参数名称,第二个参数是如果参数名为空返回的默认值,此外该方法还支持获取数组参数对应值,我们定义测试方法如下:

在浏览器中输入http://laravel.app:8000/request/input-data?name=Laravel&test[][name]=Academy,则页面输出:

如果我们想要在获取输入值之前判断输入参数名是否存在,可以使用has方法,比如我们想要判断输入参数是否包含hello,可使用如下方法:

想要获取所有输入参数值,可以使用Request实例上的all方法;想要获取部分输入值,可使用only方法;想要排除部分输入参数值,可使用except方法:

在浏览器中访问http://laravel.app:8000/request/input-data?name=Laravel&test[][name]=Academy&hello=World,页面输出如下:

3.2 上一次请求输入 上面的方法都是用于获取当前请求的输入,如果想要获取上一次请求的输入,需要在处理上一次请求时使用Request实例上的flash方法将请求数据暂时保存到session中,然后在当前请求中使用Request实例上的old方法获取session中保存的数据,获取到数据后就会将session中保存的请求数据销毁:

如果我们想要在上次请求保存数据后重定向到当前请求URL,则可以使用如下方式定义getLastRequest方法:

这样我们在浏览器中访问http://laravel.app:8000/request/last-request?name=test&passwd=123456, 页面会重定向到http://laravel.app:8000/request/current-request并输出如下内容:

再次刷新页面,输出为空:

则表明取出数据后session中的请求数据被清空。更多方法使用参考HTTP请求官方文档。 4、获取Cookie数据 我们可以使用Request实例上的cookie方法获取cookie数据,该方法可以接收一个参数名返回对应的cookie值,如果不传入参数,默认返回所有cookie值:

我们在浏览器中访问http://laravel.app:8000/request/cookie,页面输出:

我们可以调用Response实例上的withCookie方法新增cookie:

我们重新定义getCookie方法如下:

接下来我们在浏览器中访问http://laravel.app:8000/request/add-cookie,再访问http://laravel.app:8000/request/cookie,页面输出如下:

5、上传文件 我们定义文件上传页面及上传处理如下:

通过以上代码可以看到我们可以使用Request实例上的file方法获取上传文件实例,该方法接收的参数是上传文件input标签的name属性,该文件上传实例是 Symfony\Component\HttpFoundation\File\UploadedFile类的实例,更多有关该实例的可用方法,可参考UploadedFile的API文档。   from:http://laravelacademy.org/post/606.html

龙生   17 Aug 2017
View Details

HTTP控制器实例教程 —— 创建RESTFul风格控制器实现文章增删改查

基本控制器及控制器路由、控制器中间件都比较简单,这里不再赘述,相关文档参考HTTP 控制器文档一节。 1、创建RESTFul风格控制器 注:关于什么是RESTFul风格及其规范可参考这篇文章:理解RESTful架构。 本文我们主要讨论创建一个RESTFul风格的控制器用于对博客文章进行增删改查,创建这样的控制器很简单,在应用根目录运行如下Artisan命令即可:

该命令会在app/Http/Controllers目录下生成一个PostController.php文件,该控制器内容如下:

2、为RESTFul风格控制器注册路由 接下来我们在routes.php文件中为该控制器注册路由:

该路由包含了指向多个动作的子路由: 方法 路径 动作 路由名称 GET /post index post.index GET /post/create create post.create POST /post store post.store GET /post/{post} show post.show GET /post/{post}/edit edit post.edit PUT/PATCH /post/{post} update post.update DELETE /post/{post} destroy post.destroy 比如我们在浏览器中以GET方式访问http://laravel.app:8000/post,则访问的是PostController的index方法,我们可以通过route('post.index')生成对应路由URL。类似的,如果我们以POST方式访问http://laravel.app:8000/post,则访问的是PostController的store方法,对应的POST表单action属性值则可以通过route('post.store')来生成。 3、实例教程——文章增删改查 接下来我们演示基本的增删改查操作,关于数据库的操作我们后面再讲,这里我们使用缓存作为存储器(Laravel默认使用文件缓存)。 注意:我们这里用到了Cache门面,使用前不要忘了在PostController顶部使用use Cache;引入。关于Cache的用法,可参考缓存文档。 3.1 新增文章 首先我们新增一篇文章,定义PostController控制器的create方法和store方法如下(视图部门我们放到后面讲,这里就将HTML放到PHP变量里):

3.2 查看文章 访问http://laravel.app:8000/post/create页面,填写表单,点击“提交”,保存成功后,页面跳转到详情页:

3.3 编辑文章 同理我们定义编辑文章对应的edit方法和update方法如下:

3.4 删除文章 我们还可以使用destroy方法删除文章:

要删除文章,需要参考编辑表单伪造删除表单方法为DELETE(一般使用AJAX删除),这里不再演示。 3.5 文章列表 最后我们再来定义一个用于显示所有文章列表的index方法:

龙生   15 Aug 2017
View Details

RESTful

一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。 REST(英文:Representational State Transfer,简称REST)描述了一个架构样式的网络系统,比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一。在目前主流的三种Web服务交互方案中,REST相比于SOAP(Simple Object Access protocol,简单对象访问协议)以及XML-RPC更加简单明了,无论是对URL的处理还是对Payload的编码,REST都倾向于用更加简单轻量的方法设计和实现。值得注意的是REST并没有一个明确的标准,而更像是一种设计的风格。

龙生   15 Aug 2017
View Details

中间件

中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。是连接两个独立应用程序或独立系统的软件。相连接的系统,即使它们具有不同的接口,但通过中间件相互之间仍能交换信息。执行中间件的一个关键途径是信息传递。通过中间件,应用程序可以工作于多平台或OS环境。

龙生   15 Aug 2017
View Details

中间件实例教程 —— 中间件的创建使用及中间件参数定义

1、中间件简介 Laravel中可以把HTTP中间件看做“装饰器”,在请求到达最终动作之前对请求进行过滤和处理。 中间件在Laravel中有着广泛的应用,比如用户认证、日志、维护模式、开启Session、从Session中获取错误信息,以及上一篇教程中提到的CSRF验证,等等。 中间件类默认存放在app/Http/Middleware目录下。 2、中间件创建及其使用 我们在《HTTP路由实例教程(二)—— 路由命名和路由分组》一文已经演示了如何创建中间件以及中间件的基本使用。 自定义中间件类只需要定义一个handle方法即可,然后我们将主要业务逻辑定义在该方法中,如果我们想在请求处理前执行业务逻辑,则在$next闭包执行前执行业务逻辑操作:

如果想要在请求处理后执行中间件业务逻辑,则在$next闭包执行后执行操作:

我们处理的大部分操作都是第一种场景,即在请求处理前执行操作,比如用户认证、CSRF验证、维护模式等都是这样,但也有用到第二种场景的时候,比如StartSession中间件,该中间件在请求处理前后都有操作,其handle方法如下:

此外,定义好中间件后,需要在app/Http/Kernel.php文件中注册该中间件,如果我们定义的中间件想要在全局有效,即每次请求都会调用,则将该中间件追加到$middleware属性数组;否则如果中间件只是在某些特定的路由中使用,则将其追加到$routeMiddleware属性数组,并在路由定义时使用middleware选项指定。关于这一点我们已经在路由分组中有所陈述,这里不再赘述。 3、中间件参数 除了请求实例$request和闭包$next之外,中间件还可以接收额外参数,我们还是以TestMiddleware为例,现在要求年龄在18岁以上的男性才能访问指定页面,handle方法定义如下:

对应的路由配置如下:

4、定义可终止的中间件 可终止的中间件是指定义了terminate方法的中间件,terminate方法会在一次请求生命周期的末尾执行一些操作。比如StartSession中间件定义了该方法,在响应数据发送到浏览器之后将session数据保存起来。 可终止的中间件需要追加到app/Http/Kernel.php类的全局中间件列表即$middleware属性数组中。 调用中间件的terminate方法时,Laravel会从服务容器中取出新的中间件实例,所以如果想要调用handle方法和terminate方法时使用的是同一个中间件实例,需要使用singleton方法将该中间件注册到服务容器。 from:http://laravelacademy.org/post/537.html

龙生   15 Aug 2017
View Details

浅谈CSRF攻击方式

一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。   二.CSRF可以做什么? 你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账……造成的问题包括:个人隐私泄露以及财产安全。   三.CSRF漏洞现状 CSRF这种攻击方式在2000年已经被国外的安全人员提出,但在国内,直到06年才开始被关注,08年,国内外的多个大型社区和交互网站分别爆出CSRF漏洞,如:NYTimes.com(纽约时报)、Metafilter(一个大型的BLOG网站),YouTube和百度HI……而现在,互联网上的许多站点仍对此毫无防备,以至于安全业界称CSRF为“沉睡的巨人”。   四.CSRF的原理 下图简单阐述了CSRF攻击的思想: 从上图可以看出,要完成一次CSRF攻击,受害者必须依次完成两个步骤: 1.登录受信任网站A,并在本地生成Cookie。 2.在不登出A的情况下,访问危险网站B。 看到这里,你也许会说:“如果我不满足以上两个条件中的一个,我就不会受到CSRF的攻击”。是的,确实如此,但你不能保证以下情况不会发生: 1.你不能保证你登录了一个网站后,不再打开一个tab页面并访问另外的网站。 2.你不能保证你关闭浏览器了后,你本地的Cookie立刻过期,你上次的会话已经结束。(事实上,关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于退出登录/结束会话了……) 3.上图中所谓的攻击网站,可能是一个存在其他漏洞的可信任的经常被人访问的网站。   上面大概地讲了一下CSRF攻击的思想,下面我将用几个例子详细说说具体的CSRF攻击,这里我以一个银行转账的操作作为例子(仅仅是例子,真实的银行网站没这么傻:>)   示例1: 银行网站A,它以GET请求来完成银行转账的操作,如:http://www.mybank.com/Transfer.php?toBankId=11&money=1000 危险网站B,它里面有一段HTML的代码如下:   <img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000> 首先,你登录了银行网站A,然后访问危险网站B,噢,这时你会发现你的银行账户少了1000块…… 为什么会这样呢?原因是银行网站A违反了HTTP规范,使用GET请求更新资源。在访问危险网站B的之前,你已经登录了银行网站A,而B中的<img>以GET的方式请求第三方资源(这里的第三方就是指银行网站了,原本这是一个合法的请求,但这里被不法分子利用了),所以你的浏览器会带上你的银行网站A的Cookie发出Get请求,去获取资源“http://www.mybank.com/Transfer.php?toBankId=11&money=1000”,结果银行网站服务器收到请求后,认为这是一个更新资源操作(转账操作),所以就立刻进行转账操作…… 示例2: 为了杜绝上面的问题,银行决定改用POST请求完成转账操作。 银行网站A的WEB表单如下:   <form action="Transfer.php" method="POST"> <p>ToBankId: <input type="text" name="toBankId" /></p> <p>Money: <input type="text" name="money" /></p> <p><input type="submit" value="Transfer" /></p> </form> 后台处理页面Transfer.php如下: <?php session_start(); if (isset($_REQUEST['toBankId'] && isset($_REQUEST['money'])) { buy_stocks($_REQUEST['toBankId'], $_REQUEST['money']); } ?> 危险网站B,仍然只是包含那句HTML代码:   <img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000> 和示例1中的操作一样,你首先登录了银行网站A,然后访问危险网站B,结果…..和示例1一样,你再次没了1000块~T_T,这次事故的原因是:银行后台使用了$_REQUEST去获取请求的数据,而$_REQUEST既可以获取GET请求的数据,也可以获取POST请求的数据,这就造成了在后台处理程序无法区分这到底是GET请求的数据还是POST请求的数据。在PHP中,可以使用$_GET和$_POST分别获取GET请求和POST请求的数据。在JAVA中,用于获取请求数据request一样存在不能区分GET请求数据和POST数据的问题。 示例3: 经过前面2个惨痛的教训,银行决定把获取请求数据的方法也改了,改用$_POST,只获取POST请求的数据,后台处理页面Transfer.php代码如下: <?php session_start(); if (isset($_POST['toBankId'] && isset($_POST['money'])) { buy_stocks($_POST['toBankId'], $_POST['money']); } ?> 然而,危险网站B与时俱进,它改了一下代码: <html> <head> <script type="text/javascript"> function steal() { iframe = document.frames["steal"]; iframe.document.Submit("transfer"); } </script> </head> <body onload="steal()"> <iframe name="steal" display="none"> <form method="POST" name="transfer" action="http://www.myBank.com/Transfer.php"> <input type="hidden" name="toBankId" value="11"> <input type="hidden" name="money" value="1000"> </form> </iframe> </body> </html> 如果用户仍是继续上面的操作,很不幸,结果将会是再次不见1000块……因为这里危险网站B暗地里发送了POST请求到银行! 总结一下上面3个例子,CSRF主要的攻击模式基本上是以上的3种,其中以第1,2种最为严重,因为触发条件很简单,一个<img>就可以了,而第3种比较麻烦,需要使用JavaScript,所以使用的机会会比前面的少很多,但无论是哪种情况,只要触发了CSRF攻击,后果都有可能很严重。 理解上面的3种攻击模式,其实可以看出,CSRF攻击是源于WEB的隐式身份验证机制!WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的! 五.CSRF的防御 我总结了一下看到的资料,CSRF的防御可以从服务端和客户端两方面着手,防御效果是从服务端着手效果比较好,现在一般的CSRF防御也都在服务端进行。 1.服务端进行CSRF防御 服务端的CSRF方式方法很多样,但总的思想都是一致的,就是在客户端页面增加伪随机数。 (1).Cookie Hashing(所有表单都包含同一个伪随机值): […]

龙生   15 Aug 2017
View Details
1 230 231 232 432