XSS 공격에 대한 Middleware 구축
app\Http\Middleware에 파일을 생성한다.
php artisan을 사용해도 되고 그냥 만들어도 된다..
추가한 Middleware에 다음과 같은 내용을 추가합니다.
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\HtmlString;
class XssSanitizer {
public function handle(Request $request, Closure $next) {
$input = $request->all();
array_walk_recursive($input, function(&$input) {
$input = new HtmlString($input);
$input = strip_tags($input->toHtml());
});
$request->merge($input);
return $next($request);
}
}
이후, Kernel 안쪽에 $middleware 배열에 해당 클래스를 추가해 줍니다.
protected $middleware = [
...
XssSanitizer::class,
...
];
이러면 모든 Request에 대하여 HtmlTag를 지워주는데...
CKeditor 같은 에디터를 사용하면 HTMl이 넘어와야 하기 때문에, 해당 경우에는 예외로 빼고
정규식을 이용해서 어느정도 막고.. 클라이언트 쪽에서도 허용되는 태그들을 지정하는 등, 여러 고안이 필요하다.
CSRF는?
CSRF는 두가지 방식으로 거진 완벽하게 막을 수 있을 것 같다.
1. 도메인 차단 방식
하나는 middleware에서 허용된 도메인만 요청이 가능하도록 하는 방법.
로컬에서는 테스트를 해야하니, .env와 middleware에서 env 변수값이 로컬인 경우에는 도메인 체크를 풀어주는 방식으로 해결 하면 될 것 같다.
2. 토큰을 이용한 방식
다음으로는, CSRF 토큰을 이용한 방식인데, 사실 laravel blade를 사용하면 이 부분은 이미 처리가 되어 있다. (거진 굳이 신경 쓸 필요가 없다..)
API 방식으로 사용하게 된다면, 로그인등의 작업을 유저가 하였을 때, 따로 csrf 토큰값을 발급하여
한쪽은 서버에 저장하고 한쪽은 쿠키로 심어준 뒤, 미들웨어를 추가해서 해당 토큰값들을 비교하면 될 것이다.
토큰값 갱신은 주기적으로 처리하고, 특정 Action이 일어나면 갱신하는 등 개발하려는 어플리케이션에 맞게끔 갱신처리 해주자.
추가적으로 Sql Injection은 Raw를 이용해서 직접 쿼리를 만드는게 아니라 ORM방식으로 개발했으면 저절로 막히기 때문에 되도록이면 이쪽으로 개발하면 되겠다.
'PHP > PHP' 카테고리의 다른 글
[Laravel] Schedule + job(queue) (0) | 2023.05.12 |
---|---|
[Laravel] Task Scheduling (1) | 2023.05.11 |
Laravel Sanctum과 Passport 차이, Passport의 인증방식들 정리 (0) | 2023.04.05 |
Laravel, Laravel Octane 그냥 공부 메모.. (0) | 2023.04.04 |
Laravel - passport를 이용한 로그인 구현 (Oauth) (2) | 2022.05.03 |