• 목록
  • 아래로
  • 위로
  • 6
  • 260578
  • 조회 수 125

정규표현식 사이트(regex101)에서 테스트 해본 결과로는 문제 없이 작동하고

PHP Sandbox(http://sandbox.onlinephpfunctions.com/) 에서 내용을 입력하고 테스트 해봐도 문제 없이 잘 되는데

처리 코드에서 오류가 있는 것인지, 이 글에서는 4개만 처리되고 나머지는 처리되지 않고 있습니다.

 

제 나름대로 살펴보고 있으나, 여섯시간동안 살펴봤지만 해결책을 찾지 못했거니와 시험 기간인 터라 시간이 부족하여 더 이상 붙잡고 있을 수가 없습니다.

알고 계신것이 있다면 부디 무엇이 문제인지 알려주세요. 외면하지 마시고 힌트라도 주시길 간곡히 부탁드립니다.

 

== 개요 ==
동아시아에 위치한 국가. 수도는 서울이고 언어는 한국어와 한국 수어. 자유민주주의 체제의 국가이고 인구수는 약 5천만명.
강한 군사력과 안정적인 경제를 갖춘 국가로 선진국이자 강대국이다. 믹타(MIKTA)와 G20에 가입해 있는 국가이다.

== 행정구역 ==
 광역자치단체는 1특별시 6광역시 1특별자치시 8도 1특별자치도로 이뤄져 있다. [[서울특별시]], [[부산광역시]], [[인천광역시]], [[대구광역시]], [[대전광역시]], [[광주광역시]], [[울산광역시]], [[세종특별자치시]], [[경기도]], [[경상남도]], [[경상북도]], [[전라남도]], [[전라북도]], [[충청남도]], [[충청북도]], [[강원도]]이다. 싱세 사항은 각 문서를 참고하자.

 

 

            if(preg_match_all('/\[\[([^\|\[]+)(\|*)([^\|\[]*?)\]\]/mu', $doc, $link)) {
                $i = 0;
                foreach ($link as $incArr) {
                    $linkA = $link[0][$i];
                    $linkT = $link[1][$i];
                    $linkS = $link[3][$i];
                    if(strpos($linkT, '#')){
                        $link_arr = explode('#', $linkT);
                        $linkT = $link_arr[0];
                        $isAnchor = TRUE;
                    }

                    $sql = "SELECT `content` FROM `_article` WHERE `title` = '$linkT'";
                    $result = mysqli_query($conn, $sql);
                    if(mysqli_num_rows($result) < 1){
                        $linkC = 'class="link-red" ';
                    }else{
                        unset($linkC);
                    }

                    if($isAnchor){
                        $linkT .= '#'.$link_arr[1];
                    }

                    if($linkS == ''){
                        $doc = str_ireplace($linkA, '<a '.$linkC.'href="/w/'.$linkT.'">'.$linkT.'</a>', $doc);
                    }else{
                        $doc = str_ireplace($linkA, '<a '.$linkC.'href="/w/'.$linkT.'">'.$linkS.'</a>', $doc);
                    }
                    $i++;
                    if ($i > 2000) {
                        die('하이퍼링크가 너무 많습니다!');
                    }
                }
            }

 

글 속에서 대괄호 두개("[[", "]]")로 둘러싸인 부분을 링크로 바꿔주기 위해 작성하였습니다.

작성자
260578 58 Lv. (58%) 274630/278480EXP

반가워요!

댓글 6

title: 황금 서버 (30일)humit
profile image
+1

Sandbox에서 어떻게 테스트를 하신지 모르겠지만 4개만 바뀌는 것이 정상입니다.

아래 링크는 질문자분의 소스코드에서 sql 부분만 제거한 내용입니다.

해당 실행 결과를 보시면 4개가 나오는 것이 맞습니다.

 

https://ideone.com/o7b93u

Ideone is something more than a pastebin; it´s an online compiler and debugging tool which allows to ...

 

이유는 저 정규식에서 매칭으로 찾는 그룹이 총 3개이므로 $link의 크기가 4이기 때문에 for문이 4번 돌아서 발생하는 문제입니다.

 

아래 링크는 해당 현상을 해결한 코드입니다.

 

https://ideone.com/QgPm39

 

comment menu
2020.05.28. 17:45

신고

"humit님의 댓글"

이 댓글을 신고 하시겠습니까?

260578 작성자 → humit
profile image
감사합니다!
comment menu
2020.05.28. 18:39

신고

"260578님의 댓글"

이 댓글을 신고 하시겠습니까?

title: 황금 서버 (30일)humit
profile image
추가로 코드를 저렇게 작성하게 되면 XSS 공격에 취약하기 때문에 해당 부분도 고려해보시기 바랍니다.
comment menu
2020.05.29. 23:49

신고

"humit님의 댓글"

이 댓글을 신고 하시겠습니까?

260578 작성자 → humit
profile image
윗줄에서 HTMLPurifier를 사용하는데, 더 해야하나요?
comment menu
2020.05.29. 23:53

신고

"260578님의 댓글"

이 댓글을 신고 하시겠습니까?

title: 황금 서버 (30일)humit → 260578
profile image
아마 HTMLPurifier를 사용하는 것이 $doc 부분에서 사용하시는 거 같은데 거기서만 하는 걸로는 부족합니다.

예를 들어 $doc = '[[link" onmouseover="alert(String.fromCharCode(0x58,0x53,0x53))]]' 인 경우를 생각해보면 해당 $doc 부분에는 html 코드가 전혀 존재하지 않으므로 HTMLPurifier가 필터링하지 않습니다.

하지만 해당 내용을 링크로 변환하는 과정에서 취약점이 발생합니다.
comment menu
2020.05.30. 00:12

신고

"humit님의 댓글"

이 댓글을 신고 하시겠습니까?

260578 작성자 → humit
profile image
아, 그렇군요
comment menu
2020.05.30. 22:30

신고

"260578님의 댓글"

이 댓글을 신고 하시겠습니까?

권한이 없습니다.
번호 제목 글쓴이 날짜 조회 수
공지 [작업 완료] 설 명절 맞이 서버 업데이트 안내 3 마스터 24.02.11.17:21 836
공지 [중요] 호스팅 만료와 관련하여 일부 수칙이 변경됩니다. 4 마스터 23.01.14.02:23 4510
공지 [필독] 질문하는 방법 17 마스터 18.02.23.03:09 4478
925 계속 사용중이던 네트워크 공유 폴더가 갑자기 액세스 불가라고 뜹니다. 6 image 장윤서 18.06.07.16:55 34344
924 팀뷰어 대체할 원격 제어 프로그램 추천 부탁드립니다 16 이니스프리 17.11.30.15:38 32326
923 엑셀 그래프의 축 간격 조절 문제입니다. 2 image 국내산라이츄 17.08.10.11:06 12498
922 아이폰/아이패드 충전기 발열 관련 질문 드립니다 9 image 이니스프리 19.05.02.22:52 11116
921 PyQt 실행시 프리징 현상 관련하여 질문 드립니다! ㅠㅠ 3 이니스프리 19.07.06.03:37 6714
920 에러 523 해결법 4 입체그림 20.02.21.16:48 6709
919 프린터가 지 맘대로 프린트를 하네요. 3 곰도리푸 18.04.04.18:20 6069
918 윈도우용 메일 클라이언트가 필요합니다. 9 네모 18.01.11.20:15 5867
917 크롬에서 특정 사이트 접속 문제 관련하여 질문 드립니다 9 이니스프리 17.03.27.18:03 5326
916 오라클 클라우드 프리티어 가입이 안 되네요 ㅠㅠ 20 이니스프리 20.06.26.21:31 4845
915 파이썬 에디터로 어떤 것이 좋나요? 14 NoYeah 20.01.08.21:08 4534
914 라떼판다와 라즈베리 파이 중 어느 쪽을 사는 게 나을까요? 9 제르엘 18.10.14.19:25 3837
913 나무 위키의 수익구조는 무엇일까요? 2 NoYeah 18.03.18.15:56 3837
912 파티션 복구 프로그램 TestDisk 잘 아시는 분 계시나요? 29 이니스프리 17.11.10.14:53 3749
911 IE11에서 이미지가 깨지는 현상을 해결할 수 있을까요? 2 이니스프리 19.08.02.00:01 3705
910 파일질라로 연결하니까 보안되지 않은 서버입니다. TLS를 통한 FTP를 지원하지 않습니다. 이렇게떠요 해결방안좀 1 마카오 16.09.11.00:57 3658
909 자바스크립트 FormData와 관련된 메서드의 IE 호환성과 관련하여 질문 드립니다 ^^ 6 image 이니스프리 19.08.05.14:22 3433
908 선택약정 안 되는 중고폰의 경우에는 어떤 단점이 있는 것인가요?? 6 이니스프리 20.01.21.14:30 3103
907 [Requests] multipart/form-data의 전송에 대해 질문 드립니다 ^^ 4 이니스프리 19.12.18.22:00 3014
906 집에서 시놀로지 NAS로 워드프레스나 미디어위키 돌리면 느릴까요? 10 이니스프리 17.01.16.20:56 2985