PHP 검증 십자가로 줄리(CSRF) 로그인

개시하다


조금 이해하기 어려운 취약성'크라우스 셀트리크레스 포레스 증후군'(앞으로는'CSRF')을 PHP로 검증하고 싶다.
CSRF는 세션 확인만으로 로그인 검사를 하는 웹사이트 시스템에서 발생하는 취약성이다.공격자는 웹사이트 시스템을 분석해야 하기 때문에'한정 대상이 한정된 공격'이 있지만, 공격 대상이 바늘로 겨누기 때문에 제대로 된 대책이 없으면 피해가 커진다.
CSRF가 사이트 시스템에 있는 경우 로그인 후 주문 양식에 대한 주문 처리가 많이 이루어지거나 의도치 않은 암호 변경으로 인해 불법 로그인이 허용됩니다.

CSRF란 무엇입니까?


로그인 확인이 필요하면 대화를 자주 사용할 것 같습니다.
일반 로그인 확인
1. 로그인 시 세션에 로그인 정보 저장
2. 로그인 정보가 올바른지 확인
이러한 검사 자체는 정상적인 처리이지만, 폼의 제출처의 처리는 로그인 검사만 있으면 CSRF를 포함한다.
로그인 검사 코드 예
action.php
<?php
// セッションスタート
session_start();
// ログイン確認
if ( isset($_SESSION['login_id']) ) {
    $login_id = $_SESSION['login_id'];
    // ログインIDが正しいかチェックする処理...
} else {
    // ログインセッションが無かった場合の処理...
}
// ログイン後の処理に続く...
일반적인 페이지라면 괜찮을 것 같지만 형식적인 제출처 처리에서 같은 검사만 하면 CSRF가 생겨납니다.

로그인 암호 업데이트 를 예로 들 수 있습니다.


만약 폼에서 받은 값으로 비밀번호를 업데이트하는 절차가 있다면.

1. 폼(form.php)에서 새 비밀번호를 받고 업데이트 처리(action.php)를 실행합니다.
2. 업데이트 처리는 로그인 후의 페이지이기 때문에 "로그인 검사를 진행합니다."

CSRF 공격 모드 처리


1. 공격자는 업데이트 처리(action.php)에서 외부 WEB 서버에 부당한 값을 제출할 준비를 한다.
2. 피해자가 된 사용자는 로그인 상태의 브라우저에서 공격 페이지를 밟는다.
3. 공격 페이지에서 업데이트 처리(action.php)에 제출한 후 업데이트 처리를 실행한다.

피해자가 된 사용자의 세션 $SESSION['login id']은 이미 정확한 값으로 존재하며 외부에서 제출을 받더라도'로그인 상태'로 판단됩니다.결과적으로 비밀번호 변경 처리가 진행됩니다.

CSRF 대책


1. 검사 토큰을 장착
2. 기계 참조 확인
이런 대책이 필요하다.나는 실제로 코드로 확인하고 싶다.

1. 검사 토큰을 장착


영패를 창에 삽입합니다.
form.php
<?php
$_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(24));
?>
...
<input type="hidden" name="token" value="<?php echo htmlspecialchars($_SESSION['token']) ?>"></input>
...
입력 형식에서 영패를 함께 제출하고 확인함으로써 외부로부터의 제출을 받지 않습니다.
action.php
if ( $_SESSION['token'] !== $_REQUEST['token'] ) {
    echo "トークン不一致エラー";
    die();
}
※ 랜덤 문자열 생성에는'bin2hex(openssl rando puseudo bytes(24)'가 사용됩니다.

2. 기계 참조 확인


인용 확인 프로그램을 통해 외부에서 직접 전환하는 것을 거부합니다.
action.php
if ( preg_match('/^https?:\/\/example.jp\//', $_SERVER['HTTP_REFERER']) !== 1){
    echo "画面遷移が不正です";
    die();
}
그러나 주의해야 할 것은 브라우저의 설정과 환경이 다르기 때문에 참고서를 얻을 수 없을 수도 있다는 것이다.
예시 중'비밀번호 변경'이라면 이메일 등을 통해'변경된 알림이 있었다'는 점을 대안으로 추천할 수 있어 보완한다.

총결산


CSRF는'피해자가 로그인한 상태(로그인 세션이 있는 상태)'와'제출 목표에 제출한 처리에 제출할 값이 명확히 정해져 있다'등 성립 조건이 제한돼 있어 상상하기 어려운 공격 수법으로도 복잡하다.또 내부망 시스템이나 IP 규제로 이용자가 한정된 서비스 등으로 대책이 소외됐다.
공격자는 이렇게 개발자가 해이해진 곳을 공격할 수도 있다.취약성을 모르면 해결이 안 되기 때문에'제대로 이해하고 대책'을 강구할 필요가 있다고 본다.
요약하면 우리는 CSRF(Clous Sett questji·CSRF)를 PHP로 검증했다.어때?취약성을 정확히 이해하고 대책을 강구하고 싶다.

좋은 웹페이지 즐겨찾기