2010-08-10 5 views
1

나는 최근 BB 코드를 사용하여 링크를 입력하는 사람들이이를 조작 할 수있는 문제를 발견했습니다. 이 변환 코드가BB 코드 조작을 중지하는 방법 (2 부)?

[LINK=http://www.domain.com 'span style="color:red;"']example text[/LINK] 

:

가 빨간색 링크 색을 만들기 위해이 같은 뭔가를 입력 할 수 있습니다 그러나

[LINK=http://www.domain.com]example text[/LINK] 

:

그들은 뭔가를 입력하기위한 것입니다

$text = preg_replace("/\[LINK\=(.*?)\](.*?)\[\/LINK\]/is", "<a href='$1' target='_blank'>$2</a>", $text); 

다른 사람이 친절하게도 비슷한 문제에 대한 해결책을 제공했지만 나는 이것을 새로운 질문으로 시작하길 원한다. 그들의 해결책은 적응이 필요합니다. 나는 나 자신을 시험해 보았지만 실제로 작동시키지 못한다. How to stop BB Code manipulation?

답변

2
preg_replace_callback("/\\[LINK\=(.*?)\\\](.*?)\\[\/LINK\\]/is", 
    function (array $matches) { 
     if (filter_var($matches[1], FILTER_VALIDATE_URL)) 
      return '<a href="'. 
       htmlspecialchars($matches[1], ENT_QUOTES). 
       '" target="_blank">'. 
       htmlspecialchars($matches[2])."</a>"; 
     else 
      return "INVALID MARKUP"; 
    }, $text); 

콜백을 사용하여 URL 유효성을 검사하고 htmlspecialchars을 잊지 마세요.

+0

멋진데. 그래도 preg_replace_callback 함수는 기억이 안납니다. 그것은 상당히 새로운 PHP 버전이어야합니다. 필자는 버전 3 또는 4 이후로 PHP를 계속 작성했으며 필자는 이미 알고있는 함수를 확인하기 위해 php.net으로 자주 돌아 가지 않기 때문에 이것을 놓쳤습니다. –

+0

@ Zan 10 년 전에 출시 된 PHP 4.0.5 이후에 존재합니다. – Artefacto

+0

나는 오랫동안 PHP를 해왔다. 내가 단단히 알고 있다고 생각하는 기능을 놓치기 쉽다. :) –

1

나는 가장 단순하고 최상의 해결책은 이상한 문자를 벗어나는 htmlspecialchars()을 통해 URL을 실행하는 것일 수 있다고 생각합니다. 그렇게하면 소스에 직접 입력되지는 않지만 먼저 이스케이프 처리되므로 href="..."을 해킹 할 수 없습니다.

1

regex replace를 사용하는 대신 정규식 일치를 사용하여 원하는 정보 (이 경우 링크 및 링크 텍스트)를 추출하십시오.

그런 다음 해당 정보를 올바른 형식으로 작성하십시오. 이상한 데이터를 출력으로 가져올 기회가 없어야합니다.

변수를 사용하기 전에 변수를 두 번 확인하여 HTML이 포함되지 않도록 할 수도 있습니다.