테스트 사이트 - 개발 중인 베타 버전입니다

if (!defined('_GNUBOARD_')) exit;에 관해 질문드립니다. 채택완료

강릉커피 7개월 전 조회 2,296

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개

채택된 답변
+20 포인트
glitter0gim
7개월 전

common.php를 포함시킬 수밖에 없는 파일에서는 if (!defined..를 넣을 필요가 없지만,

해당 파일이 직접 실행될 가능성이 있다면 보안 차원에서 추가하는 것이 좋습니다.

그러나 이 코드가 포함되었다고 해서 무조건 안전한 것은 아니며,

AJAX 파일처럼 직접 실행되는 파일에서는 추가적인 보안 조치가 반드시 필요합니다.

*입력값 필터링 → XSS 공격 및 SQL 인젝션 방지

*세션 인증 ($_SESSION['ss_mb_id'] 체크) → 로그인한 사용자만 접근 가능하도록 제한

*CSRF 방어 (csrf_token 검증) → 요청 위조 방지

*Rate Limiting → 짧은 시간 내 과도한 요청 차단

로그인 후 평가할 수 있습니다

답변에 대한 댓글 2개

강릉커피
7개월 전
AJAX 보안에 대한 상세한 설명까지 해주셔서 정말 감사합니다!!!
말씀하신 것처럼 mb_id(세션)인증과 기본적인 SQL인젝션, XSS공격 방지(sql_real_escape_string 사용이나 htmlspecialchars와 같은 xss 관련 함수 등), csrf_token 검증, 특정시간내 호출 제한수(Rate Limiting) 등 알려주신 방법 모두 알아보도록 하겠습니다.
보안이란 게 참 어려운 것 같습니다. 제가 가장 궁금했던 점을 알려주셔서 너무 감사드립니다.

(죄송합니다 바빠서 확인이 늦었습니다)
g
glitter0gim
7개월 전
저도 한 수 배워갑니다. (●'◡'●)

댓글을 작성하려면 로그인이 필요합니다.

a
7개월 전

답변 주신 모든 분들 감사드립니다! 

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

7개월 전

누구나 접근 가능한 페이지다 

없어도 됩니다.

 

특수한 액션을 담당한 페이지 및 접근해서는 안된다..?

그럼 저 코드 넣어주심 되세요

 

a라는 파일에

b라는 파일을 include 하고 싶은데 b를 직접 접근을 허용 하나?안하냐?

ajax.data.php 파일에 데이터를 전송하고 싶은데 해당 파일을 직접 접근을 허용 하나? 안하냐? 의 차이입니다

 

여기서 직접 접근은

홈페이지주소/b.php 파일을 했을 때 되냐?안되냐? 입니다.

홈페이지주소/ajax.data.php 파일을 했을 때 되냐?안되냐?입니다

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

강릉커피
7개월 전
감사합니다 이해가 되었습니다!!
ajax랑은 상관이 없군요!
(죄송합니다 바빠서 확인이 늦었습니다)

댓글을 작성하려면 로그인이 필요합니다.

7개월 전

게시판 리스트를 불러오는 경우로 예를들어보겠습니다

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개

강릉커피
7개월 전
감사합니다 이해가 되었습니다!!
(죄송합니다 바빠서 확인이 늦었습니다)

댓글을 작성하려면 로그인이 필요합니다.

s
sinbi Expert
7개월 전
  1. _GNUBOARD_ 상수는 /config.php 파일에 정의되어 있음.
  2. /config.php 파일은 /common.php 파일에 인클루드 됨.
  3. 따라서, 각 웹페이지엔 /common.php 파일만 인클루드해서 사용.
  4. 간혹, 해당 웹페이지에 별도의 파일을 인클루드 하는 경우 있음.
  5. 그 인클루드 되는 파일의 직접 주소로 접근하는 걸 막고자 해당 파일 상단에 말씀하신 코드 넣어 사용.
로그인 후 평가할 수 있습니다

답변에 대한 댓글 2개

강릉커피
7개월 전
감사합니다 이해가 되었습니다!!
강릉커피
7개월 전
감사합니다 이해가 되었습니다!!
(죄송합니다 바빠서 확인이 늦었습니다)

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인