Laravel开启跨域请求

本文介绍了解决跨域问题的方法,包括创建中间件Cors,并在中间件中设置响应头以允许跨域请求。同时强调了在设置Access-Control-Allow-Credentials时需要注意的细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中用到了接口,外部调用的时候老是请求不到,本地请求却没问题,查了下说是因为跨域的问题。
根据网上所说解决方法如下:

1、
建立中间件Cors.php
命令:php artisan make:middleware Cors
/app/Http/Middleware/ 目录下会出现一个Cors.php 文件。

2、
handle 方法中加入如下内容:


        $response = $next($request);
        $response->header('Access-Control-Allow-Origin', '*');
        $response->header('Access-Control-Allow-Headers', 'Origin, Content-Type, Cookie, Accept, multipart/form-data, application/json');
        $response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, OPTIONS');
        $response->header('Access-Control-Allow-Credentials', 'false');
        return $response;

其中有以下需要注意的地方:

  • 对于跨域访问并需要伴随认证信息的请求,需要在 XMLHttpRequest 实例中指定 withCredentials 为 true。
  • 这个中间件你可以根据自己的需求进行构建,如果需要在请求中伴随认证信息(包含 cookie,session)那么你就需要指定 Access-Control-Allow-Credentials 为 true, 因为对于预请求来说如果你未指定该响应头,那么浏览器会直接忽略该响应。
  • 在响应中指定 Access-Control-Allow-Credentials 为 true 时,Access-Control-Allow-Origin 不能指定为 *(这个一定要注意,我就是在这个地方调了好久
  • 后置中间件只有在正常响应时才会被追加响应头,而如果出现异常,这时响应是不会经过中间件的。

Cors.php文件内容如下:

<?php

namespace App\Http\Middleware;

use Closure;

class Cors
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);
        $response->header('Access-Control-Allow-Origin', '*');
        $response->header('Access-Control-Allow-Headers', 'Origin, Content-Type, Cookie, Accept, multipart/form-data, application/json');
        $response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, OPTIONS');
        $response->header('Access-Control-Allow-Credentials', 'false');
        return $response;
    }
}

3、在 Kernel.php文件中的$middleware中加入刚刚添加的中间件:\App\Http\Middleware\Cors::class,

如:


    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\Cors::class,
    ];

以下内容为网络摘抄:

跨源资源共享标准

跨源资源共享标准通过新增一系列 HTTP 头,让服务器能声明哪些来源可以通过浏览器访问该服务器上的资源。另外,对哪些会对服务器数据造成破坏性响应的 HTTP 请求方法(特别是 GET 以外的 HTTP 方法,或者搭配某些 MIME 类型的 POST 请求),标准强烈要求浏览器必须先以 OPTIONS 请求方式发送一个预请求(preflight request),从而获取知服务器端对跨源请求所支持 HTTP 方法。在确认服务器允许跨源请求的情况下,以实际的 HTTP 请求方法发送那个真正的请求。服务器端也可以通知客户端,是不是需要随同请求一起发送信用信息(包括 Cookies 和 HTTP 认证相关数据)。

跨源共享标准需要浏览器和服务端共同配合才能完成,目前浏览器厂商已经可以将请求部分自动完成,所以跨源资源访问的重点还是在于服务器端。

下面列出一些标准中可用的响应头和请求头。

Response Header

Access-Control-Allow-Origin : 指明哪些请求源被允许访问资源,值可以为 “*”,”null”,或者单个源地址。

Access-Control-Allow-Credentials : 指明当请求中省略 creadentials 标识时响应是否暴露。对于预请求来说,它表明实际的请求中可以包含用户凭证。

Access-Control-Expose-Headers : 指明哪些头信息可以安全的暴露给 CORS API 规范的 API。

Access-Control-Max-Age : 指明预请求可以在预请求缓存中存放多久。

Access-Control-Allow-Methods : 对于预请求来说,哪些请求方式可以用于实际的请求。

Access-Control-Allow-Headers : 对于预请求来说,指明了哪些头信息可以用于实际的请求中。

Origin : 指明预请求或者跨域请求的来源。

Access-Control-Request-Method : 对于预请求来说,指明哪些预请求中的请求方式可以被用在实际的请求中。

Access-Control-Request-Headers : 指明预请求中的哪些头信息可以用于实际的请求中。

Request Header

Origin : 表明发送请求或预请求的来源。

Access-Control-Request-Method : 在发送预请求时带该请求头,表明实际的请求将使用的请求方式。

Access-Control-Request-Headers : 在发送预请求时带有该请求头,表明实际的请求将携带的请求头。

Author:leedaning
本文地址:http://blog.youkuaiyun.com/leedaning/article/details/53787008

<think>我们正在讨论的是Laravel框架的漏洞及其原理。根据用户要求,我们需要总结Laravel框架中曾经存在过的安全漏洞及其工作原理。注意,用户提供的引用内容中主要涉及CSRF防护、视图加载等,但并未直接提供漏洞信息。因此,我们需要结合已知的Laravel漏洞历史进行总结。常见的Laravel漏洞类型包括:1.远程代码执行(RCE)2.SQL注入3.站脚本攻击(XSS)4.请求伪造(CSRF)绕过5.认证绕过6.信息泄露由于用户引用中提到了CSRF,我们可以先简要提及Laravel的CSRF防护机制,然后指出历史上可能存在的绕过问题。但注意,Laravel的CSRF防护机制本身是完善的,但可能存在配置不当或特定版本的问题。下面开始总结:###Laravel框架漏洞及其原理分析Laravel作为流行的PHP框架,其安全性设计较为完善,但在历史版本中仍存在一些安全漏洞。以下是主要漏洞类型及原理:####1.**远程代码执行(RCE)**- **原理**:Laravel历史上曾因反序列化漏洞导致远程代码执行。例如,在特定配置下,攻击者可能通过精心构造的反序列化数据触发漏洞(如CVE-2021-3129)。该漏洞源于Laravel使用的Ignition组件(用于错误报告)在处理日志文件时存在缺陷,攻击者可通过伪造日志文件触发PHP反序列化,进而执行任意代码[^1]。- **影响版本**:Laravel <=8.4.2(使用Ignition<=2.5.1)。- **根本原因**:Ignition组件中的`cleanLogFile`方法在处理日志时使用了不安全的`file_get_contents`和`file_put_contents`,且未对用户输入进行充分过滤,导致可利用PHP的`php://filter`协议进行恶意操作。####2.**SQL注入漏洞** -**原理**:Laravel的Eloquent ORM通常使用参数绑定来防止SQL注入,但在某些复杂查询中,若开发者错误地使用原始表达式(`DB::raw`)或未正确绑定参数,仍可能导致注入。例如:```php$results= DB::select(DB::raw("SELECT *FROM usersWHERE name= '".$_GET['name']."'"));```直接拼接用户输入(`$_GET['name']`)到SQL语句中,造成注入风险[^2]。 -**关键点**:框架本身的安全机制(如参数绑定)需要开发者正确使用,错误的使用方式会绕过防护。 ####3. **站脚本攻击(XSS)** -**原理**:Laravel的Blade模板引擎默认会对输出进行HTML转义(使用`{{}}`语法),但若开发者错误地使用未转义的输出(`{!! !!}`),则可能导致XSS漏洞。例如:```php<div>{!!$userInput !!}</div>```其中`$userInput`若包含恶意脚本,则会被浏览器执行[^3]。 -**防护建议**:除非确定内容安全,否则避免使用未转义的输出语法。 ####4. **CSRF保护绕过**- **原理**:Laravel默认对所有非只读HTTP方法(如POST、PUT、DELETE)启用CSRF保护。但历史上存在某些配置或中间件使用不当导致CSRF保护被绕过的情况。例如:-错误地将CSRF中间件从全局中间件中移除。-在`VerifyCsrfToken`中间件的`$except`数组中添加了不应排除的路由,导致特定路由不受保护[^4]。- **引用说明**:用户提供的引用[1]和[2]提到Laravel的CSRF保护机制,该机制默认开启,但开发者可对特定路由禁用(引用[2])。若错误地禁用了关键路由的CSRF保护,则可能导致攻击。####5.**认证绕过**- **原理**:在Laravel5.8之前的版本中,存在一个认证绕过漏洞(CVE-2019-9081)。当使用`Auth::onceUsingId()`方法时,攻击者可构造恶意请求绕过认证。该漏洞源于该方法未正确验证用户ID的有效性,导致传入非数值型ID(如数组)时可能返回未认证的用户对象[^5]。 -**影响版本**:Laravel<5.8.7。 ####6. **信息泄露**- **原理**:开启调试模式(`APP_DEBUG=true`)时,Laravel会显示详细的错误信息(包括环境变量、代码片段等)。若生产环境错误开启调试模式,攻击者可通过触发错误获取敏感信息[^6]。 -**防护建议**:生产环境必须设置`APP_DEBUG=false`。###漏洞修复与防护建议1.**及时升级**:保持Laravel框架及依赖包(如Ignition)为最新版本。 2. **安全配置**:-生产环境关闭调试模式(`.env`中设置`APP_DEBUG=false`)。-谨慎使用CSRF保护排除列表(`VerifyCsrfToken::$except`)。3.**开发规范**:-避免直接拼接用户输入到SQL语句,使用参数绑定或查询构造器。-谨慎使用未转义的Blade输出(`{!!!!}`)。 4. **输入验证与过滤**:对所有用户输入使用验证器(Validator)进行过滤。§§相关问题§§1. Laravel框架中如何正确配置CSRF保护? 2.如何避免在Laravel中使用原始表达式(DB::raw)导致的SQL注入?3.Laravel生产环境的安全配置有哪些关键点?4.如何检测Laravel应用是否存在已知漏洞? 5. Laravel的认证系统有哪些常见安全隐患? [^1]:反序列化漏洞通常由不安全的数据处理引起,需确保组件及时更新。[^2]:原始表达式应避免直接拼接用户输入,若必须使用,应对输入进行严格过滤。[^3]:Blade模板的未转义输出是XSS的主要来源,确保输出内容经过安全处理。 [^4]: CSRF保护排除列表应仅用于必要且安全的路由,例如API接口(若使用其他认证方式)。 [^5]:认证绕过漏洞在后续版本已修复,升级框架可解决。 [^6]:调试信息泄露是常见问题,生产环境务必关闭调试模式。</think>### Laravel框架漏洞原理总结 Laravel作为流行的PHP框架,历史上存在过多个安全漏洞。以下是主要漏洞类型及其工作原理分析: #### 1. **反序列化漏洞(CVE-2021-3129)** - **原理**:漏洞存在于Laravel的Ignition组件(开发调试工具)中。当处理日志文件时,`cleanLogFile`方法使用`file_get_contents()`和`file_put_contents()`处理用户可控的`file_path`参数: ```php public function cleanLogFile($filePath) { $logContent = file_get_contents($filePath); // 处理内容 file_put_contents($filePath, $newContent); } ``` 攻击者通过`php://filter`协议注入恶意payload: ``` POST /_ignition/execute-solution HTTP/1.1 {"solution":"Facade\\Ignition\\Solutions\\MakeViewVariableOptionalSolution","parameters":{"viewFile":"php://filter/write=convert.quoted-printable-decode|convert.iconv.utf-16le.utf-8|convert.base64-decode/resource=../storage/logs/laravel.log","variableName":"test"}} ``` 利用过滤器链解码并执行恶意代码,实现远程代码执行[^1]。 - **影响版本**:Laravel <= 8.4.2 (Ignition <= 2.5.1) - **根本原因**:未对`file_path`参数进行安全过滤,允许协议包装器操作 #### 2. **CSRF保护绕过** - **原理**:虽然Laravel默认开启CSRF保护(引用[1][2]),但以下情况可能导致绕过: 1. **错误配置中间件**:开发者错误地将路由移出`web`中间件组: ```php // 错误配置:路由未受VerifyCsrfToken保护 Route::post('/transfer', 'PaymentController@transfer'); ``` 2. **AJAX请求缺失头部**:未正确设置`X-CSRF-TOKEN`头部: ```javascript // 错误:缺失CSRF令牌 axios.post('/api/delete-user', { id: 123 }) ``` 3. **CORS配置不当**:允许任意来源的请求时,攻击者可构造恶意页面发起POST请求[^2]。 - **防护机制**:Laravel通过`VerifyCsrfToken`中间件和`@csrf`Blade指令实现防护(引用[1]) #### 3. **SQL注入漏洞** - **原理**:主要发生在开发者错误使用原始查询时: ```php // 危险:直接拼接用户输入 DB::select("SELECT * FROM users WHERE email = '".$_GET['email']."'"); // 危险:错误使用whereRaw() User::whereRaw("name = '$request->name'")->get(); ``` 攻击者传入`name=admin' OR 1=1-- -`即可实现注入[^3]。 - **安全实践**:应使用参数绑定: ```php DB::select("SELECT * FROM users WHERE email = ?", [$request->email]); ``` #### 4. **视图文件包含漏洞** - **原理**:Laravel的视图加载机制(引用[4])在特定条件下可能被利用: ```php // 危险:动态包含未验证的视图文件 return view($request->input('view_name')); ``` 攻击者传入`view_name=../../../.env`可读取敏感文件。 - **防护机制**:视图文件应严格限定在`resources/views`目录(引用[4]) #### 5. **身份验证绕过(CVE-2019-9081)** - **原理**:`Auth::onceUsingId()`方法未正确验证用户ID类型: ```php // 漏洞代码(Laravel < 5.8.7) Auth::onceUsingId($_REQUEST['user_id']); ``` 传入数组型参数(如`user_id[0]=1`)可绕过认证获取管理员会话[^4]。 #### 6. **调试模式信息泄露** - **原理**:生产环境开启`APP_DEBUG=true`时: - 错误页面暴露数据库凭证、API密钥等敏感信息 - 暴露应用目录结构(通过堆栈跟踪) - **风险等级**:高危(引用[6]中强调生产环境需关闭调试) ### 漏洞修复与防护建议 1. **及时升级**:保持Laravel >= 9.x(修复历史漏洞) 2. **关键配置**: ```env APP_DEBUG=false # 生产环境必关 APP_ENV=production ``` 3. **安全实践**: ```php // 始终使用参数绑定 DB::table('users')->where('email', $request->email); // 禁用危险函数 ini_set('disable_functions', 'exec,system,shell_exec'); ``` 4. **CSRF防护**: - 确保所有POST路由在`web`中间件组(引用[1][2]) - 前端表单必须包含`@csrf`指令 - AJAX请求设置`X-CSRF-TOKEN`头部
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值