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

정규표현식 사이트(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. (60%) 274780/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님의 댓글"

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

권한이 없습니다.
번호 제목 글쓴이 날짜 조회 수
공지 [1차 해결 및 추가] 서버 접속 불가 문제 안내 12 마스터 24.06.20.15:22 474
공지 [작업 완료] 설 명절 맞이 서버 업데이트 안내 3 마스터 24.02.11.17:21 2506
공지 [중요] 호스팅 만료와 관련하여 일부 수칙이 변경됩니다. 4 마스터 23.01.14.02:23 6195
공지 [필독] 질문하는 방법 17 마스터 18.02.23.03:09 4628
886 구서버 패널 로그인이 안됩니다. 3 image ryuko 17.01.12.20:50 404
885 포인트 복권 게시글처럼 출력하는 방법 아시는 분 있나요?? 4 시루떡 17.01.16.01:16 275
884 집에서 시놀로지 NAS로 워드프레스나 미디어위키 돌리면 느릴까요? 10 이니스프리 17.01.16.20:56 3005
883 IIS에서 한 사이트 내에서 폴더에 각각 도메인 지정 못하나요? 17 title: 황금 서버 (30일)하루살이 17.01.19.13:57 1305
882 호스팅 세팅 도움주실분 급하게 찾아요 ㅠ.ㅠ 1 HOya 17.01.23.07:30 358
881 MySQL 실행이 안됩니다. title: 황금 서버 (30일)하루살이 17.01.28.11:55 435
880 몇년된 넷북으로 워드프레스 돌릴 수 있을까요? 7 title: 금메달 (30일)동방개념지국 17.01.29.17:43 403
879 호스팅 계정 연장 질문입니다. 또한 셋팅에 대한 질문도 있습니다. 2 Seia 17.02.04.21:40 305
878 호스팅 만료 후 연장에 관해 문의드립니다. 3 50knots 17.02.05.18:13 330
877 ICANN 인증 도메인 등록기관과 리셀러 간에 차이가 큰 가요? 5 이니스프리 17.02.05.21:52 371
876 Plus Hosting 1Gbytes 기본 제공 도메인 이름 알려주세요 1 Seia 17.02.06.01:21 314
875 개인 웹사이트를 만들어 보고 싶습니다. 3 JLee0715 17.02.06.01:49 369
874 참 아이러니한 일이 발생햇습니당 2 image title: 도밥위키!Dobob 17.02.07.23:20 400
873 robots.txt를 활성화 시키려면 어떻게 해야할까요? 4 title: 도밥위키!Dobob 17.02.09.14:18 394
872 신서버는 연장시켜도 바로 반영이 안되는가요? 2 image title: 금메달 (30일)동방개념지국 17.02.13.14:09 325
871 애드센스에 관한 질문 6 title: 황금 서버 (30일)humit 17.02.17.18:38 294
870 안드로이드 앱 개발 Ciel 17.02.18.16:07 478
869 서브도메인은 어떻게 연결시켜야되나요? 2 image 50knots 17.02.21.18:11 485
868 Apache AllowEncodedSlashes에 대해 질문합니다(미디어위키) 2 Kongjak 17.02.24.14:20 455
867 혹시 호스트 차원에서 IP차단도 지원이 되나요? 2 Nodeulnaru 17.02.27.23:29 361