if (!defined('_GNUBOARD_')) exit;에 관해 질문드립니다. 채택완료
if (!defined('_GNUBOARD_')) exit;
이게 어떤 파일 위에는 적혀있더라고요.
이게 include_once용으로 불러오는 php파일 위에 적는 용도인지, 아니면 ajax 파일마다 보안을 위해 적는 용도인지 궁금했습니다 ("개별 페이지 접근 불가" 이렇게 적혀있더군요)
그래서 챗지피티한테 물어보니,
? ./_common.php가 포함되지 않은 파일
? if (!defined('_GNUBOARD_')) exit; 이 필수, 직접 접근하면 차단됨.
? ./_common.php가 포함된 파일
? _GNUBOARD_가 이미 정의되어 있으니까 if (!defined('_GNUBOARD_')) exit; 없어도 상관없음.
? 그냥 관습적으로 넣는 경우도 있음. (common.php가 빠진 경우를 대비하는 차원에서)
즉, common.php가 있으면 직접 접근해도 문제없이 실행되고, 없으면 차단됨!
라고 하는데, 이 내용이 맞을까요?
지금까지 저거 적으면 뭐가 좋은지, 어디다 적어야 하는지 몰랐었거든요.
저는 어차피 include_once용도의 파일에서도, ajax용의 파일에서도 _common.php를 대부분 상단에 적고 시작했기 때문에 (각종 테이블이나 상수, 변수 등 참조하기 위함).. 저걸 _common.php 아래에 적으면 의미 없던 거군요.
만약 저게 맞다면 _common.php 아래에 if(!defined... 를 넣을 필요가 없어서 그냥 있어도 그만 없어도 그만인 코드인 게 맞을까요.
아, 가끔 저걸 넣으면 에러가 나는 경우가 있었는데, _common.php를 두 번 타고 올라가다 보니 그 상단 _common.php에서 그 전의 _common.php를 참조하는 위치가 잘못된 경우였습니다. (생각해보니 저걸 넣든 안넣든 _common.php가 있으면 직접 접근이 가능했습니다)
아직까지도 ajax는 아무나 접근할 수 있는데 입력값이나 그런 부분을 어떻게 해야 각종 공격을 막을 수 있는지 잘 모르는데.. 일단 저거랑은 큰 관계가 없나 보네요.
답변 5개
common.php를 포함시킬 수밖에 없는 파일에서는 if (!defined..를 넣을 필요가 없지만,
해당 파일이 직접 실행될 가능성이 있다면 보안 차원에서 추가하는 것이 좋습니다.
그러나 이 코드가 포함되었다고 해서 무조건 안전한 것은 아니며,
AJAX 파일처럼 직접 실행되는 파일에서는 추가적인 보안 조치가 반드시 필요합니다.
*입력값 필터링 → XSS 공격 및 SQL 인젝션 방지
*세션 인증 ($_SESSION['ss_mb_id'] 체크) → 로그인한 사용자만 접근 가능하도록 제한
*CSRF 방어 (csrf_token 검증) → 요청 위조 방지
*Rate Limiting → 짧은 시간 내 과도한 요청 차단
답변에 대한 댓글 2개
댓글을 작성하려면 로그인이 필요합니다.
누구나 접근 가능한 페이지다
없어도 됩니다.
특수한 액션을 담당한 페이지 및 접근해서는 안된다..?
그럼 저 코드 넣어주심 되세요
a라는 파일에
b라는 파일을 include 하고 싶은데 b를 직접 접근을 허용 하나?안하냐?
ajax.data.php 파일에 데이터를 전송하고 싶은데 해당 파일을 직접 접근을 허용 하나? 안하냐? 의 차이입니다
여기서 직접 접근은
홈페이지주소/b.php 파일을 했을 때 되냐?안되냐? 입니다.
홈페이지주소/ajax.data.php 파일을 했을 때 되냐?안되냐?입니다
답변에 대한 댓글 1개
ajax랑은 상관이 없군요!
(죄송합니다 바빠서 확인이 늦었습니다)
댓글을 작성하려면 로그인이 필요합니다.
게시판 리스트를 불러오는 경우로 예를들어보겠습니다
board.php?bo_table=abc 이렇게 호출하면 board.php에서 list.php를 include 합니다
board.php는 주소창으로 호출하는 화일이므로 상단에 common.php가 들어가고
이때는 if (!defined('~~~<==이건 있으나 없으나 마찬가지이니 넣을 필요가 없습니다
그런데 list.php는 주소창에서 직접호출해서 사용하는 화일이 아니므로
if (!defined('~~ 이게 없으면 직접 호출했을 때 에러가 출력 됩니다
if (!defined('~~을 넣어서 에러코드도 나오지않으면서 실행되지않게 막아둡니다
즉 주소창에서나 링크로 호출해서 사용하는 것이 아닌 include로 사용하는 화일 상단에 넣어둡니다
ajax호출과 관계없습니다
답변에 대한 댓글 1개
(죄송합니다 바빠서 확인이 늦었습니다)
댓글을 작성하려면 로그인이 필요합니다.
- _GNUBOARD_ 상수는 /config.php 파일에 정의되어 있음.
- /config.php 파일은 /common.php 파일에 인클루드 됨.
- 따라서, 각 웹페이지엔 /common.php 파일만 인클루드해서 사용.
- 간혹, 해당 웹페이지에 별도의 파일을 인클루드 하는 경우 있음.
- 그 인클루드 되는 파일의 직접 주소로 접근하는 걸 막고자 해당 파일 상단에 말씀하신 코드 넣어 사용.
답변에 대한 댓글 2개
(죄송합니다 바빠서 확인이 늦었습니다)
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인
말씀하신 것처럼 mb_id(세션)인증과 기본적인 SQL인젝션, XSS공격 방지(sql_real_escape_string 사용이나 htmlspecialchars와 같은 xss 관련 함수 등), csrf_token 검증, 특정시간내 호출 제한수(Rate Limiting) 등 알려주신 방법 모두 알아보도록 하겠습니다.
보안이란 게 참 어려운 것 같습니다. 제가 가장 궁금했던 점을 알려주셔서 너무 감사드립니다.
(죄송합니다 바빠서 확인이 늦었습니다)