php

[php] htmlspecialchars 쓴 후 정규표현식을 이용한 자동링크

개발만파볼까 2018. 10. 31. 23:29
728x90
반응형
SMALL

기본적으로 php을 이용한 정규표현식에 대한 자동링크는 구글링을 하면 쉽게 찾아볼 수 있다. 


XSS 공격을 막기 위해 php에서는 htmlspeicalchars이라는 메소드를 제공하게 된다. 이것을 쓰게 되면 XSS 공격을 쉽게 막을 수 있는 이점이 있다.


하지만 이 메소드는 스크립트 태그 뿐만이 아니라 모든 태그를 막아버리기 때문에 게시판 내용에서 URL 같은 것들을 링크를 달거나 색깔을 입힐 수 없게 


된다. 혹시라도 htmlspecialchars을 썼다면 구글에 존재하는 어떠한 정규표현식도 제대로 안 먹힌거나 URL이 깔끔하게 링크가 되지 않는다.(결국엔 링크나 


색깔도 태그를 써야하기 떄문이다.)


그렇다면 스크립트를 제외하고 몇몇 태그를 써야 한다는 상황이 올 때가 있다. strip_tags 라는 메소드를 가지고 일부 태그를 살리는 경우가 있지만 텍스트


로 이루어진 태그가 지워진다는 단점이 있게 된다. 간단하게 htmlspeicalchars 원리를 살펴보면 기존태그를 " &와 같은 걸로 replace 가 되는 원


리이다. html에서 겉으로는 정상적으로 보여도 저런 식으로 바껴지기 때문에 태그가 안 먹히게 된다.


이 htmlspeicalchars의 원리를 가지고 텍스트로 된 태그는 살리되 URL 링크를 다는 방법을 쓰고자 한다. 



function autoLink($str) {

     $pattern = '/(http|https|ftp|mms):\/\/[0-9a-z-]+(\.[_0-9a-z-]+)+(:[0-9]{2,4})?\/?';
     $pattern .= '([\.~_0-9a-z-]+\/?)*';
     $pattern .= '(\S+\.[_0-9a-z]+)?';
     $pattern .= '(\?[_0-9a-z#%&=\-\+]+)*/i';
     $replacement = '<a href="\\0" target="_blank">\\0</a>';

     $str = str_replace('&amp;','&', $str);
     $str = str_replace('&quot;','"', $str);

     return preg_replace($pattern, $replacement, $str, -1);
}


참고 : http://rustyvirus.tistory.com/entry/%ED%85%8D%EC%8A%A4%ED%8A%B8%EB%B3%B8%EB%AC%B8%EC%97%90%EC%84%9C-%EB%A7%81%ED%81%AC-%EC%B6%94%EC%B6%9C%ED%95%B4%EC%84%9C-URL-%EC%94%8C%EC%9A%B0%EA%B8%B0


저 연속된 2개의 str_replace만 추가시키면 된다. 특수 문자 모두 변환을 하게 되면 html에서 스크립트가 먹어버리기 때문에 일부만 원형으로 변환한 상태에서 정규표현식을 사용하면 깔끔하게 URL이 링크 걸 수 있게 된다.


하지만 2가지 정도 유의사항이 있다. 


첫번째로는 한글 URL이 들어가면 제대로 안된다는 것(추가를 시키면 "이 URL는 https://naver.com/한글입니다." 라는 문장에서 '~입니다' 까지 링크가 걸리게 된다.)


두번째로는 태그 문법이 틀려서도 안된다. 예를들면


<script src="http://www.google.com"></script> --> 이것은 되지만


<script src="http://www.google.com></script> --> 이 경우에는 깔끔하게 되지 않는다.


다시 말해서 정상적인 범주 안에서는 왠만큼 링크가 깔끔하게 들어가게 될 것이다.



728x90
반응형
LIST