728x90

PHP 보안은 PHP 버전에 따른 보안과 Web Application 보안으로 나눌 수 있다.

PHP 5.4 에서는 HTTP header injection 취약점을 개선시켰다.

높은 버전의 PHP 를 사용하는 것이 바람직하지만, 이전버전과의 호환성에 문제가 있을 수 있으므로 Web application 코드를 충분히 테스트하는 것이 좋다.

 

PHP는 사용자의 입력 실수(문자형, 숫자형)를 자동으로 형변환해주는 기능이 있다. 이 기능을 잘못 사용하면 보안에 취약해질 수 있다. 문자열을 비교하고 싶으면 일치 연산자(===)로 비교하거나, 반드시 strcmp()함수를 사용해야 한다.

 

 

PHP 환경설정 파일 중에서 간단하게 정리해둔다.

 

disable_functions = phpinfo()
; phpinfo() 함수는 시스템내의 php,http,mysql 과 관련한 모든 정보를 보여주므로 운용시 막는 것이 좋다.

 

error_reporting  =  E_ALL

; 해킹의 먹이감이 되므로 평소에는 Off 로 해둔다. 에러가 있을 경우 디버깅 가능하도록 에러 메세지를 출력해준다.
display_errors = Off
; 평소에는 해제(Off)한다. 개발환경에서는 디버깅 가능하도록 On하면 에러 메세지를 출력해준다.
display_startup_errors = Off

 

;default 8M 로 되어 있음, upload_max_filesize 보다 크게 설정해야 함

post_max_size = 20M

memory_limit = 128M
upload_max_filesize = 18M

 

allow_url_fopen = Off

; On 인 경우 외부의 URL 을 로컬 파일과 똑같이 취급할 수 있다.

;해당 옵션을 On으로 설정하면 파일 액세스 시 외부 사이트의 파일을 호출할 수 있다.
;특히 include(), require()계열의 함수 사용 시 심각한 보안상의 문제를 유발하게 되므로 반드시 Off로 사용한다.
; PHP injection 공격 방지 목적으로 off 로 설정

; PHP 5.2 이후부터는 allow_url_include = off 로 설정이 분리되었다.

 

date.timezone ="Asia/Seoul"

session.save_path = "/path/to your folder"

; 세션파일을 저장할 폴더를 지정한다.

; UNIX OS에서 기본값은 /tmp 이므로 공유 서버의 경우 다른 사용자가 세션 정보를 읽거나

; 세션 하이젝을 할 수 있으므로 Application 별로 다른 사용자가 액세스할 수 없는 비공개 폴더를 지정하는 것이 좋다.

;session.save_path = /tmp/session 디렉토리를
;chown nobody.nobody /tmp/session
;chmod 750 /tmp/session 이렇게 해주면 된다.

expose_php = Off
;웹서버 헤더에서 PHP 버전 정보 숨기기

session.use_only_cookies = 1
;세션에 대해 쿠키를 사용하고, GET 파라미터로서 세션 ID가 패싱되는 걸 허용하지 않는다.

 

;session.cookie_secure = 1
;SSL 인증서를 설치하고 https 만 사용하는 것이 평문으로 세션 ID가 전송되는 걸 막을 수 있으며, 세션 공격을 더욱 어렵게 만든다.

 

session.cookie_httponly = 1
; 1로 설정하면, 자바스크립트 같은 클라이언트 사이드 스크립트에 노출되지 않게 된다.

session.use_trans_sid = 0
; 세션이 URL이나 Form 의 INPUT으로 의도하지 않게 PHPSESSIONID 가 전송될 경우 방지.  1 설정은 전송됨

기본 설정값

session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440 // 움직임이 없을 경우 세션 유지 시간, default 24분

세션을 10분 동안 유지하기
session.gc_probability = 1
session.gc_divisor = 1
;이값이 100이면 1/100 즉 1%의 확률로 가비지콜렉션이 실행된다.

session.gc_maxlifetime = 600

;사용자가 아무짓 안할 경우 600초 즉 10분 후에 가비지로 보이는 것을 삭제한다.

;지정된 session.save_path 폴더 아래로 가서 변경이 없는 파일을 찾아 지운다.

 

; 보안상 0 으로 놓은 것이 좋다고는 하는데, 세션은 생성되는데 다른 파일에서는 인식이 안된다.
session.auto_start = 1

PHP 설정에서 에러 표시가 Disable 되어 표시 되지 않을때 특정 페이지에서만 에러를 볼 수 있는 방법이다.
ini_set('display_errors', 1);
ini_set('error_reporting', E_ALL);

 

=========================================================

session_start();
if($_SESSION['authID']!=1){
    echo "<script>window.top.location.replace('/index.php');</script>";
    exit;
}
를 해주는데 세션이 먹지 않는다.

삽질을 열심히 하면서 알아낸 것은 PHP 파일 인코딩 모드가 UTF8 이면 정상인데 UTF8+BOM 으로 하면 에러가 발생한다.

세션의 경우에도 characterset 을 맞춰줘야 정상동작한다.

 

echo 로 찍어보면 해당 파일에서 분명히 세션이 생성된다.

echo (isset($_SESSION['userID']) ? $_SESSION['userID'] : "Visitor");

그런데 다른 파일에서 세션 정보 유지가 안된다.

환경설정에 가서
session.auto_start = 1

로 변경하고 나서야 세션 정보가 유지되었다.

 

 

참고 : 세션관련 참조하면 도움될 게시글

http://www.serverguide.co.kr/82

 

세션과 보안 : https://link2me.tistory.com/647 참조

블로그 이미지

Link2Me

,