'Tip/PHP'에 해당하는 글 8건

문제

브라우저의 Back, Forward 버튼을 누를 때 로그인, 글 작성등을 처리하는 중간 페이지에 걸려서
  1. 만료된 페이지라는 메시지가 출력되는 경우
  2. 처리 결과에 따라 오류 페이지로 계속 되돌아 오는 경우
를 경험해보셨을거라 생각됩니다.

예를들어, 
A(로그인 페이지) -> B(로그인 처리 페이지) -> C(정상처리 후 이동 URL), D(오류 처리 후 이동 URL)
방식으로 처리한다면 B는 둘 중 하나입니다.
  1. 정상이면 (메시지 출력 후) C로 이동 오류이면 (오류메시지 출력 후)  D로 이동 방식
  2. 정상이면 C로 이동 오류이면 D로 이동 (D = 오류메시지를 포함한 A와 동일/유사 페이지) 방식
메시지를 출력하기 위해 JavaScript의 alert를 사용했다면 C나 D 페이지에서는 브로우저의 Back버튼을 누르면 B로 이동했다가 C나 D로 되돌아가는 문제가 반복됩니다.

혹은 Location header로 C나 D로 보낸다면 alert('로그인 실패'); 등의 메시지를 출력할 수 없게 됩니다.


해결

먼저 페이지 이동 시키는 방법은
  1. HTTP Header > header("Location: url"); < PHP Function
  2. HTTP Header > header("Refresh: 0; URL=url"); < PHP Function
  3. JavaScript > window.location.href = url;
  4. JavaScript > window.location.replace(url);
  5. Meta Tag > <meta http-equiv="Refresh" content="0; URL=url">
등입니다.

위에서 말씀 드렸듯이
1번 방법은 처리 결과 메시지를 출력하지 못합니다. (Back 버튼 문제는 없음)
3,4,5번 방법은 Back 버튼을 누르면 다시 C나 D로 되돌아 오는 문제가 반복됩니다.

2번 방법으로 처리하면 Location Header와 메시지 출력을 동시에 할 수 있습니다.
(먼저 메시지가 출력되고 확인을 누르면 페이지로 이동)


※ 자료출처 : http://www.phpschool.com

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

CSRF 공격

Tip/PHP 2007. 6. 28. 15:36
CSRF (Cross-Site Request Forgery: 크로스 사이트 리퀘스트 위조)

공격자가 다른 사용자로부터 HTTP 요청을 위조하는 종류의 공격을 통틀어서 CSRF라고 한다.
폼에 토큰을 추가시키면 CSRF 공격의 위험을 효과적으로 제거할 수 있다.

HTML 폼에 토큰 삽입:
<?php

session_start();
$token = md5( uniqid( rand(), true ) );
$_SESSION['token'] = $token;
$_SESSION['token_time'] = time();

?>

<form action="buy.php" method="post">
...
</form>

토큰 유효성 검사:
<?php

if ( isset( $_SESSION['token'] ) && $_POST['token'] == $_SESSION['token'] ) {
   /* 유효한 토큰 */
}

?>

토큰 유효시간:
<?php

$token_age = time() - $_SESSION['token_time'];

if ( $token_age <= 300 ) {
   /* 5분이 지나지 않은 경우에만 수행 */
}

?>

토큰은 사용자의 세션에 저장되기 때문에 공격자는 희생자에게 유일한 토큰을 사용해야만 한다.
이런 방법은 공격을 사용자 한 명에게만 유효하도록 제한시키며 공격자는 다른 사용자의 유효한 토큰을 얻어야만 한다.
다른 사람의 요청을 위조하는데 자신의 토큰을 사용할 수 없다.

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

파일 업로드 공격

Tip/PHP 2007. 6. 28. 14:46
<input type="hidden" name="MAX_FILE_SIZE" value="1024" />

위와 같이 숨겨진 폼 변수 MAX_FILE_SIZE 는 브라우저가 허용할 수 있는 파일의 최대 크기를 바이트 단위로 표시한 것이다. 이는 클라이언트에만 있는 제한이기 때문에 공격자는 쉽게 제한을 제거할 수 있다. 공격에 대응하기 위해 신뢰도를 높여주려면 PHP 지시문 post_max_sizeupload_max_filesize를 변경하여 파일 업로드 크기를 제한할 수 있도록 한다.

phpinfo() 명령어로 지시문을 출력하여 확인할 수 있다.

서버 호스팅을 받아서 직접 수정할 수 없을 때에는 ini_set 함수를 이용하여 변경한다.

ini_set( 'post_max_size', '8M' );
POST 데이터가 허용하는 최대 사이즈를 8M로 설정한다. 이 설정은 파일 업로드에도 관여하고, 큰 파일을 업로드하기 위해서는 이 값이 upload_max_filesize보다 커야만 한다.

ini_set( 'upload_max_filesize', '2M' );
업로드 파일의 최대 크기를 2M로 지정한다.

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,