- 6
- 260578
- 조회 수 134
정규표현식 사이트(regex101)에서 테스트 해본 결과로는 문제 없이 작동하고
PHP Sandbox(http://sandbox.onlinephpfunctions.com/) 에서 내용을 입력하고 테스트 해봐도 문제 없이 잘 되는데
처리 코드에서 오류가 있는 것인지, 이 글에서는 4개만 처리되고 나머지는 처리되지 않고 있습니다.
제 나름대로 살펴보고 있으나, 여섯시간동안 살펴봤지만 해결책을 찾지 못했거니와 시험 기간인 터라 시간이 부족하여 더 이상 붙잡고 있을 수가 없습니다.
알고 계신것이 있다면 부디 무엇이 문제인지 알려주세요. 외면하지 마시고 힌트라도 주시길 간곡히 부탁드립니다.
글 |
---|
== 개요 == == 행정구역 == |
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('하이퍼링크가 너무 많습니다!'); } } }
글 속에서 대괄호 두개("[[", "]]")로 둘러싸인 부분을 링크로 바꿔주기 위해 작성하였습니다.
작성자
댓글 6
![title : 황금 서버 (30일) title: 황금 서버 (30일)](https://sfuhost.com/./files/iconshop/33055af84f02ddedb19db038cdae0d2f.gif)
![profile image](/files/member_extra_info/profile_image/569/001/1569.png?t=1527385219)
![comment menu](/modules/board/skins/comely_board/images/icn_more.png)
![profile image](/files/member_extra_info/profile_image/078/265/265078.jpg?t=1546218593)
![comment menu](/modules/board/skins/comely_board/images/icn_more.png)
![title : 황금 서버 (30일) title: 황금 서버 (30일)](https://sfuhost.com/./files/iconshop/33055af84f02ddedb19db038cdae0d2f.gif)
![profile image](/files/member_extra_info/profile_image/569/001/1569.png?t=1527385219)
![comment menu](/modules/board/skins/comely_board/images/icn_more.png)
![profile image](/files/member_extra_info/profile_image/078/265/265078.jpg?t=1546218593)
![comment menu](/modules/board/skins/comely_board/images/icn_more.png)
![title : 황금 서버 (30일) title: 황금 서버 (30일)](https://sfuhost.com/./files/iconshop/33055af84f02ddedb19db038cdae0d2f.gif)
![profile image](/files/member_extra_info/profile_image/569/001/1569.png?t=1527385219)
예를 들어 $doc = '[[link" onmouseover="alert(String.fromCharCode(0x58,0x53,0x53))]]' 인 경우를 생각해보면 해당 $doc 부분에는 html 코드가 전혀 존재하지 않으므로 HTMLPurifier가 필터링하지 않습니다.
하지만 해당 내용을 링크로 변환하는 과정에서 취약점이 발생합니다.
![comment menu](/modules/board/skins/comely_board/images/icn_more.png)
![profile image](/files/member_extra_info/profile_image/078/265/265078.jpg?t=1546218593)
![comment menu](/modules/board/skins/comely_board/images/icn_more.png)
Sandbox에서 어떻게 테스트를 하신지 모르겠지만 4개만 바뀌는 것이 정상입니다.
아래 링크는 질문자분의 소스코드에서 sql 부분만 제거한 내용입니다.
해당 실행 결과를 보시면 4개가 나오는 것이 맞습니다.
https://ideone.com/o7b93u
이유는 저 정규식에서 매칭으로 찾는 그룹이 총 3개이므로 $link의 크기가 4이기 때문에 for문이 4번 돌아서 발생하는 문제입니다.
아래 링크는 해당 현상을 해결한 코드입니다.
https://ideone.com/QgPm39