Laravel防御机制浅析
写在前面
在某次安全测试中碰到此框架,测了半天也没发现XSS之类的漏洞,查了一下Laravel有默认配置的安全机制,总结记录一下。本文以Laravel5.5为例分析部分安全机制以及涉及到的获取请求写法还有网上公开的Laravel框架漏洞
laravel5.5中文手册
laravel5.5源码
安全机制
XSS防御–Blade模板引擎从输入到输出
定义路由获取变量->把变量传给视图做渲染->渲染结果作为响应内容返回用户
定义一个路由,在resources/views
下有welcome.blade.php
将$data
变量传入其中渲染,返回视图view()
web.php
Route::get('/', function () {return view('welcome', [‘name’=>$name]);
});
welcome.blade.php
Hello, {{ $name }}
Blade模板 的 {{}}
语法会自动调用 PHP htmlentites
函数来防御 XSS 攻击
用以下写法可显示未转义数据,一般用来显示图片、链接
{!!note!!}
sql注入防御
Laravel内置Eloquent ORM(对象关系映射),用于数据库操作
Eloquent查询形式
<?phpnamespace App\Scopes;use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;class AgeScope implements Scope
{/*** 将范围应用于给定的 Eloquent 查询生成器** @param \Illuminate\Database\Eloquent\Builder $builder* @param \Illuminate\Database\Eloquent\Model $model* @return void*/public function apply(Builder $builder, Model $model){return $builder->where('age', '>', 200);}
}
AgeScope类实现了Scope接口,Laravel内置的Eloquent 内部使用的是 PDO 参数绑定,避免了sql注入
另外有原生参数查询,whereRaw
,selectRaw
可能会存在sql注入
User::whereRaw("name = '$input_name'")->first();
如果是必须使用原生语句的情况,语句里又包含用户提交内容的话,可以利用其提供的,类似于 PDO 参数绑定进行传参,(使用占位符,实现查询条件预处理)以避免 SQL 注入的风险
User::whereRaw("name = ?", [$input_name])->first();
占位符防sql注入原理
占位符的方式将语句与用户数据分开
不使用占位符写法
$stmt = $mysqli->prepare("SELECT * FROM user WHERE id = $s");
$stmt->execute();
若是查询
s=1 or 1=1
拼接sql,查询出所有数据
SELECT * FROM user WHERE id = 1 or 1=1
使用占位符写法
$stmt = $mysqli->prepare("SELECT * FROM planet WHERE name = ?", $s);
$stmt->execute();
拼接
SELECT * FROM user WHERE id = '1 or 1=1'
CSRF
Laravel 会对所有的 POST 数据默认开启 CSRF 防护,实现的机制是检测 POST 数据里的 _token
信息
token不是一次一变,有过期时间,会在每一次 Session 创建时重新生成,也就是说,跟会话的时间一致,Laravel 默认为 120 分钟
若使用jwt认证,token放在请求头中,也能达到防止CSRF的效果。
获取请求写法
使用了路由机制统一处理请求,对应的方法里使用依赖注入来获取请求参数
api.php
Route::group(['middleware' => 'auth:api'], function (){Route::get('/user', function (){ });Route::get('/user/all', 'UserController@getAllUser');Route::post('/user/profile/{id}', 'UserController@getUserId');Route::group(['middleware' => 'admin'], function (){......});
});
UserController.php
public function getUserId(Request $request,$id){$name = $request -> input('name');echo "name:$name "." id:$id";}
请求形式为:
http://xxx.com/api/user/profile/1?name=hhh
Laravel SQL注入漏洞
Laravel < 5.8.7版本存在SQL注入,涉及函数为Laravel/Validation/Rules/Unique.php
中的ignore()
函数,该方法没有对传入的参数做任何过滤,直接赋值到了对象属性。
在使用中未调用ignore函数就不存在sql注入漏洞
https://www.freebuf.com/column/199156.html
CVE-2019-9081
Laravel Framework 5.7.x版本中的Illuminate组件存在反序列化漏洞,远程攻击者可利用该漏洞执行代码
https://xz.aliyun.com/t/5510
CVE-2018-15133
APP_KEY 泄露情况下的 Laravel RCE 漏洞。漏洞影响版本:5.5.x<=5.5.40、5.6.x<=5.6.29。
https://xz.aliyun.com/t/6533
https://www.exploit-db.com/exploits/47129
https://github.com/kozmic/laravel-poc-CVE-2018-15133
Laravel防御机制浅析相关推荐
- php laravel框架开发实例,Laravel框架集合用法实例浅析
本文实例讲述了Laravel框架集合用法.分享给大家供大家参考,具体如下: 前言 集合通过 Illuminate\Support\Collection进行实例,Laravel的内核大部分的参数传递都用 ...
- 浅析 Laravel 底层原理:契约(Contracts)
简介 Laravel 中的契约是指框架提供的一系列定义核心服务的接口(interface). 例如,Illuminate\Contracts\Queue\Queue 契约定义了队列任务所需的方法,而 ...
- 浅析laravel门面原理与实现
Facade模式 描述:Facade模式要求一个子系统的外部与其内部的通信必须通过一个统一的Facade对象进行.Facade模式提供一个高层次的接口,使得子系统更易于使用. 意义:将一个系统划分成为 ...
- laravel mysql 悲观锁_浅析乐观锁与悲观锁
悲观锁 当我们要对数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发.这种借助数据库锁机制在修改数据之前锁定,再修改的方式被称为悲观并发控制(PC ...
- 由laravel 5.5无法获取url中的参数引发的apache的.htaccess文件问题
一.前言 我这边碰到的问题就是,无法获取url中的get参数.本地使用的是laravel 5.5版本.明明url里面清清楚楚的写着参数,但是你却获取不到,这感觉实在是很气很气.刚开始以为是larave ...
- 2016 版 Laravel 系列入门教程(三)【最适合中国人的 Laravel 教程】
本教程示例代码见: https://github.com/johnlui/Learn-Laravel-5 在任何地方卡住,最快的办法就是去看示例代码. 在本篇文章中,我们将尝试构建一个带后台的简单博客 ...
- 2016 版 Laravel 系列入门教程(二)【最适合中国人的 Laravel 教程】
本教程示例代码见: https://github.com/johnlui/Learn-Laravel-5 在任何地方卡住,最快的办法就是去看示例代码. 本篇文章中,我将跟宝宝们一起学习 Laravel ...
- Laravel/Lumen 使用 Redis队列
一.概述 在Web开发中,我们经常会遇到需要批量处理任务的场景,比如群发邮件.秒杀资格获取等,我们将这些耗时或者高并发的操作放到队列中异步执行可以有效缓解系统压力.提高系统响应速度和负载能力. 二.配 ...
- php – Laravel 7 Session Lifetime
根据Laravel config / session.php /* |----------------------------------------------------------------- ...
最新文章
- 百炼智百炼智能获5000万元Pre-A轮融资,深耕智能获客赛道
- 姜宁谈红帽绩效考核:不关心员工具体做什么
- python制作二级菜单_python实现二级登陆菜单及安装过程
- CDataBaseEngineSink::OnRequestPlatformParameter 数据库异常:查询超时已过期 [ 0x80040e31 ]...
- 反射就是获取该类的.class文件里面的方法,属性
- c# 中对于每次修改的程序 都必须重新手动生成 才能编译的问题
- react封装函数_React 模式-将函数作为 children 传入和 render prop - 极客教程
- 华为已在国内建成20万5G基站 预计年底可达到80万
- ViewPage2+TabLayout小记
- Ubuntu下搜狗輸入法不能输入汉字
- axios的并发请求和 排队请求
- unity鼠标键盘交互
- 天轰川 推荐的Javscript大收集 大集锦
- 达梦数据库之备份还原
- 石墨烯之父”、诺贝尔物理学奖得主:造访江西理工大学
- Django 使用技巧之 settings 拆分 + 通过指令选择不同的配置文件。
- 国产开源数据库:腾讯云TBase在分布式HTAP领域的探索与实践
- Android开发-基本概念小整理(二)为了面试的小伙伴们所准备~~
- Centos | 一招解决所有 ImportError: xxx: cannot open shared object file
- IT女孩又来总结了-2015年终总结
热门文章
- tpm php,电脑tpm是什么
- CSS 霓虹灯效果 (一)
- SuperMap大赛——命题开发组
- linux监控cpu内存磁盘网络使用率,linux服务器性能——CPU、内存、流量、磁盘使用率的监控...
- 遇见未知的自己---给自己一个机会翻身
- 读万卷书,不如行万里路 后三句
- edonkey和emule电驴和电骡的区别
- 基于Android的家庭财务管理系统
- 关于固定定位position: fixed;和横向滚动overflow-x: scroll;无法同时使用的问题
- 周志华组最新论文提出“溯因学习”,受玛雅文字启发的神经逻辑机