- 6
- 260578
- 조회 수 653
정규표현식 사이트(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
예를 들어 $doc = '[[link" onmouseover="alert(String.fromCharCode(0x58,0x53,0x53))]]' 인 경우를 생각해보면 해당 $doc 부분에는 html 코드가 전혀 존재하지 않으므로 HTMLPurifier가 필터링하지 않습니다.
하지만 해당 내용을 링크로 변환하는 과정에서 취약점이 발생합니다.
Sandbox에서 어떻게 테스트를 하신지 모르겠지만 4개만 바뀌는 것이 정상입니다.
아래 링크는 질문자분의 소스코드에서 sql 부분만 제거한 내용입니다.
해당 실행 결과를 보시면 4개가 나오는 것이 맞습니다.
https://ideone.com/o7b93u
이유는 저 정규식에서 매칭으로 찾는 그룹이 총 3개이므로 $link의 크기가 4이기 때문에 for문이 4번 돌아서 발생하는 문제입니다.
아래 링크는 해당 현상을 해결한 코드입니다.
https://ideone.com/QgPm39