2010-08-10 70 views
1

我最近發現了一個問題,人們使用BB代碼來輸入鏈接可以操縱它們。如何停止BB代碼操作(第二部分)?

這意味着它們是輸入類似:

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

不過,他們可以進入這樣的事情,使鏈接紅色:

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

這是其轉換的代碼:

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

其他人提供了一個非常類似的問題的解決方案,但th我想讓我爲此開始一個新的問題。他們的解決方案只需要適應。我已經嘗試過自己,但我真的無法實現它的工作。 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); 

使用回調驗證網址,不要忘記htmlspecialchars

+0

這很酷。但我不記得preg_replace_callback函數。那必須是相當新的PHP版本?自從版本3或4以來,我一直在寫PHP,並且我不經常回到php.net來檢查我已經知道的函數,所以我錯過了這個。 – 2010-08-10 19:40:29

+0

@Zan它自PHP 4.0.5起,至今已有10多年的歷史。 – Artefacto 2010-08-10 20:01:01

+0

我一直在做PHP這麼久。容易錯過我認爲自己認識的功能。 :) – 2010-08-10 20:25:38

1

我認爲最簡單和最好的解決方案可能是運行通過htmlspecialchars() URL來逃避奇怪的字符。這樣它就不會直接進入源代碼,但會先被轉義,所以它無法破解掉href="..."

1

而不是使用正則表達式替換,使用正則表達式匹配來提取所需的信息,在這種情況下,鏈接和鏈接文本。

然後用正確的格式寫出這些信息。這應該消除將怪異數據輸入輸出的機會。

您甚至可以在使用它們以確保它們不包含任何HTML之前仔細檢查這些變量。