구글에 $_SERVER['DOCUMENT_ROOT'] 검색하면 검색결과 잘 보여주잖아요.
근데, 그누보드에 $_SERVER['DOCUMENT_ROOT'] 검색하면 대괄호 등 필터링 시켜서 검색이 안 되죠.
※ 필터링 되어 보이는 검색어: _SERVERDOCUMENT_ROOT
DB에 저장시킬 때 안전한 코드로 변형해서 저장시킨 후,
값 조회할 때도 안전한 코드로 변형해 검색시키면 될텐데...
왜 검색조차 안 되게 다 필터링을 시키는 걸까요? ㅡㅡ;;
보안 상 안전하게 하면서도 구글처럼 검색 잘 되게 하는 건 도처히 안 되는 걸까요?
답변 3개 / 댓글 14개
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);
답변에 대한 댓글 7개
전체 검색이 시도된 결과 같습니다.
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 에 적용시키면 원하는 결과가 나옵니다.
[code]
$stx = strip_tags($stx);
//$stx = preg_replace('/[[:punct:]]/u', '', $stx); // 특수문자 제거
// $stx = get_search_string($stx); // 특수문자 제거
$stx = trim(stripslashes($stx));
[/code]
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. 질게 답변 보고 항상 느끼는 건데, 배르만 님은 인공지능 같아요. ㅎ
토트넘 경기 기분좋게 관람할 수 있겠네요. ㅎㅎㅎ
답변에 대한 댓글 1개
$_SERVER['DOCUMENT_ROOT']와 같은 서버 변수를 필터링하는 것은 웹 애플리케이션 보안과 관련이 있습니다
특수기호 검색 사용할려면 풀면됩니다.
원치 않는 사람이 더많으니 사용하고자한다면 풀면됩니다.
그리고, 검색순위 부분은 기호에 대한 순위는 제외시키면 되지않을까요?
또한,
구글 검색 엔진이 $_SERVER['DOCUMENT_ROOT']와 같은 정보를 표시하는 경우도 있지만
일반적으로는 서버 변수나 민감한 정보를 웹 페이지에서 검색 가능하게 표시하는 것은 보안 측면에서 큰 위험을 초래할 수 있습니다.
답변에 대한 댓글 6개
변수를 활용해 디비에 저장하고 또한 값을 검색하고자한다면 다음과 같이 정의 해볼수 있습니다.
// 저장하고
$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);
배르만 님 답변이 그누보드 문제 해결에 좀 더 직접적이라... ^^;;
답변을 작성하려면 로그인이 필요합니다.