그누보드는 왜 필터링을 시키는 걸까요? ㅡㅡ;

그누보드는 왜 필터링을 시키는 걸까요? ㅡㅡ;

QA

그누보드는 왜 필터링을 시키는 걸까요? ㅡㅡ;

본문

구글에 $_SERVER['DOCUMENT_ROOT'] 검색하면 검색결과 잘 보여주잖아요.

근데, 그누보드에 $_SERVER['DOCUMENT_ROOT'] 검색하면 대괄호 등 필터링 시켜서 검색이 안 되죠.

※ 필터링 되어 보이는 검색어: _SERVERDOCUMENT_ROOT

 

DB에 저장시킬 때 안전한 코드로 변형해서 저장시킨 후,

값 조회할 때도 안전한 코드로 변형해 검색시키면 될텐데...

왜 검색조차 안 되게 다 필터링을 시키는 걸까요? ㅡㅡ;;

보안 상 안전하게 하면서도 구글처럼 검색 잘 되게 하는 건 도처히 안 되는 걸까요?

이 질문에 댓글 쓰기 :

답변 3

https://github.com/gnuboard/gnuboard5/blob/master/lib/common.lib.php#L3248

를 다음처럼 수정해볼수 있습니다.


function get_search_string($stx)
{
    // $stx_pattern = array();
    // $stx_pattern[] = '#\.*/+#';
    // $stx_pattern[] = '#\\\*#';
    // $stx_pattern[] = '#\.{2,}#';
    // $stx_pattern[] = '#[/\'\"%=*\#\(\)\|\+\&\!\$~\{\}\[\]`;:\?\^\,]+#';
 
    // $stx_replace = array();
    // $stx_replace[] = '';
    // $stx_replace[] = '';
    // $stx_replace[] = '.';
    // $stx_replace[] = '';
 
    // $stx = preg_replace($stx_pattern, $stx_replace, $stx);
 
    // return $stx;

    return sql_real_escape_string($stx);
 

그렇긴 하지만 주석을 풀어야합니다. 악의적인 SQL 코드를 주입하여 데이터베이스를 공격하는 공격 방법 중 하나이며, 보안상 매우위험한 상태라고 볼수있습니다.

$_SERVER[\\'DOCUMENT_ROOT\\'] 형태로 검색이 되지 않는 현상은
전체 검색이 시도된 결과 같습니다.

stx 검색어가 들어오면 common.php 에서 기본적으로 get_search_string 를 수행하는데
> https://github.com/gnuboard/gnuboard5/blob/master/common.php#L433

bbs/search.php 에서 다시한번 get_search_string 가 수행되어 발생되는 현상입니다.
> https://github.com/gnuboard/gnuboard5/blob/master/bbs/search.php#L15

게시판 내 단일검색 쪽에서는 발생하지 않는데
get_sql_search 함수 안에서의 stripslashes 사용으로 다시 정상화 되기 때문이며
> https://github.com/gnuboard/gnuboard5/blob/master/bbs/list.php#L41
> https://github.com/gnuboard/gnuboard5/blob/master/lib/common.lib.php#L686

이부분을 bbs/search.php 에 적용시키면 원하는 결과가 나옵니다.


$stx = strip_tags($stx);
//$stx = preg_replace('/[[:punct:]]/u', '', $stx); // 특수문자 제거
// $stx = get_search_string($stx); // 특수문자 제거
$stx = trim(stripslashes($stx));

SQL Injection 은 그것을 위해 제공되는 함수를 사용하는게 적절합니다.
https://www.php.net/manual/en/mysqli-stmt.bind-param
https://www.php.net/manual/en/pdostatement.bindcolumn.php
https://www.php.net/manual/en/pdostatement.bindparam.php
https://www.php.net/manual/en/pdostatement.bindvalue.php

보안상 위험하다고 하여 프로그램이 제 기능을 못하는건 별개의 문제이고
프로그램 혹은 솔루션 그 자체에 문제점이 있다고 볼수 있습니다.

기대도 안 했는데, 자세한 추가 설명 곁들인 답변 정말 감사합니다.
곧 토트넘 경기가 있어서 경기 보고 난 후, 테스트해보도록 할게요. ^^;

ps. 질게 답변 보고 항상 느끼는 건데, 배르만 님은 인공지능 같아요. ㅎ

$_SERVER['DOCUMENT_ROOT']와 같은 서버 변수를  필터링하는 것은  웹 애플리케이션 보안과 관련이 있습니다

특수기호 검색 사용할려면 풀면됩니다.

원치 않는 사람이 더많으니 사용하고자한다면 풀면됩니다. 

그리고, 검색순위 부분은 기호에 대한 순위는 제외시키면 되지않을까요?

또한,

구글 검색 엔진이 $_SERVER['DOCUMENT_ROOT']와 같은 정보를 표시하는 경우도 있지만

일반적으로는 서버 변수나 민감한 정보를 웹 페이지에서 검색 가능하게 표시하는 것은 보안 측면에서 큰 위험을 초래할 수 있습니다.

실체값으로 DB에 저장시키고, 검색할 때도 실체값으로 풀어서 일치여부 조회하면 될 듯 한데...너무 막아놓은 것 같아서요.  코딩 관련 커뮤니티 홈페이지 만들기엔 너무 부적합한 형태라.....

네 그리고 디비에 실체값으로 저장 방법도 보안중 좋은방법이리고 생각합니다.
변수를 활용해 디비에 저장하고 또한 값을 검색하고자한다면 다음과 같이 정의 해볼수 있습니다.
// 저장하고
$documentRoot = $_SERVER['DOCUMENT_ROOT'];
$escapedDocumentRoot = mysqli_real_escape_string($conn, $documentRoot);
$sql = "INSERT INTO table name (document_root) VALUES ('$escapedDocumentRoot')";
mysqli_query($conn, $sql);

//검색하고
$searchDocumentRoot = $_POST['search_document_root'];
$escapedSearchDocumentRoot = mysqli_real_escape_string($conn, $searchDocumentRoot);
$sql = "SELECT * FROM table name WHERE document_root = '$escapedSearchDocumentRoot'";
$result = mysqli_query($conn, $sql);

https://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php

앞으로는 이걸 써야겠죠

답변을 작성하시기 전에 로그인 해주세요.
전체 131
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT