보안 관련 내용
Public 디렉토리 노출 최소화 및 설정 파일 숨김
기존의 PHP 웹 애플리케이션들은 구동에 필요한 설정 파일을 웹 서버에 위치 시키거나 절대 경로로 읽어들이는 경우가 많았습니다.
라라벨의 경우 구동에 필요한 설정 파일을 DocumentRoot와 격리하였고, php 직접 호출이 아닌 애플리케이션 라우팅을 통해 서비스를 제공하도록 설계되었으며, public 디렉토리에 단 하나의 PHP 파일만 존재함으로써 public 디렉토리와 설정 파일의 노출 및 .php 파일 직접 호출을 통한 공격 발생 가능성을 최소화 하였습니다.
public 디렉토리 (Laravel Korea 설명)
public 디렉토리는 애플리케이션에 진입하는 모든 request-요청들에 대한 진입점 역할과 오토로딩을 설정하는 index.php 파일을 가지고 있습니다. 이 디렉토리는 이미지나 자바스크립트, CSS와 같은 asset파일들도 포함되어 있습니다.
SQL Injection
라라벨의 경우 모든 파라미터를 문자열로 처리하지 않고 PDO(PHP Data Object)의 Prepare Statements와 Parameter Binding을 사용합니다. PDO는 미리 SQL 코드를 정의하고 나중에 Parameter를 Binding 하는 등 SQL 코드와 데이터를 명확히 함으로써 SQL Injection을 방지할 수 있습니다.
$s = $dbh->prepare('SELECT name FROM students WHERE sex = :sex');
$s->bindParam(':sex', $sex);
$s->execute();
CSRF
라라벨의 경우 CSRF 토큰 기능을 제공하여 CSRF 공격 발생 가능성을 최소화하고 있습니다.
HTML 폼을 정의할 때, CSRF 토큰을 hidden 필드로 포함시켜서, CSRF 보호 미들웨어가 request-요청을 검증(validate)할 수 있도록 해야합니다. 토큰 필드를 생성하기 위해 @csrf 블레이드 지시어를 사용할 수 있습니다.
<form method="POST" action="/profile">
@csrf
...
</form>
web 미들웨어 그룹에 속한 VerifyCsrfToken 미들웨어는 자동으로 request-요청에 포함된 토큰이 세션에 저장된 토큰과 일치하는지 확인할 것입니다.
POST 파라미터로 넘어오는 CSRF 토큰을 체크하는 것에 더하여, VerifyCsrfToken 미들웨어는 X-CSRF-TOKEN request-요청 헤더 또한 확인합니다. 예를들자면, HTML meta 태그에 토큰을 저장할 수 있습니다.
<meta name="csrf-token" content="{{ csrf_token() }}">
그리고, meta 태그를 만들고나서, jQeury와 같은 라이브러리를 사용하여 자동적으로 모든 헤더에 토큰을 추가할 수 있습니다. 이러한 방식은 AJAX 기반 애플리케이션을 위한 간단하고 편리한 CSRF 보호 방법을 제공해줍니다.
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
Reference
https://laravel.kr/docs/6.x/structure
http://magic.wickedmiso.com/16
'Hack > Web' 카테고리의 다른 글
XS Search Attack (Cross Site Search) (0) | 2020.09.22 |
---|---|
Laravel SQL Injection ( Version < 5.8.11) (0) | 2020.09.22 |
Reflected File Download (0) | 2020.09.22 |
Phar 파일을 이용한 PHP Unserialization (0) | 2020.09.22 |
commons-fileupload Module WAF Filtering Bypass (0) | 2020.09.21 |
댓글