我試圖讓一個bb代碼選項從數據庫文本字段運行php代碼。 像[?php]code[/?]
從文本框的形式運行一個PHP命令
我知道這是不安全的,但沒有人可以編輯的頁面,我主要是想用它來讓它計算的東西或包括一個文件。
這是我SOFAR:
$txt = preg_replace("#\[?php\](.+?)\[/?\]#is", eval("\\1"), $txt);
我試圖讓一個bb代碼選項從數據庫文本字段運行php代碼。 像[?php]code[/?]
從文本框的形式運行一個PHP命令
我知道這是不安全的,但沒有人可以編輯的頁面,我主要是想用它來讓它計算的東西或包括一個文件。
這是我SOFAR:
$txt = preg_replace("#\[?php\](.+?)\[/?\]#is", eval("\\1"), $txt);
您提供爲eval()
不起作用的例子preg_replace()
前評估,其結果實際上是作爲替代品。 \\1
不是一個有效的PHP表達式,所以我期望給定的代碼將返回一個分析錯誤。
您應該首先使用preg_match()
來提取一個PHP表達式,然後eval()
它,然後只用bb標籤之間的文本替換eval()
的結果。
這就是說,正如上面評論的那樣,我個人會強烈建議不要這樣做。這基本上提供了對服務器的任意訪問權限,並且以任何方式是一個非常糟糕的設計理念。我想你真的只需要一定數量的操作,比如包含來自特定目錄的頁面。您可以專門爲有限數量的操作實施專門的bb標籤,並採取一切預防措施。
然後你會如何製作包含標籤?由於我找不到比eval更好的運行php – Coolcrab
你可以開始緩衝,eval
整串,首先關閉PHP的標籤,並獲得緩衝區爲變量:
$txt = "Result of 2+2 = [?php] echo 4; [/?].";
$txt = str_replace(array('[?php]', '[/?]'), array('<?php','?>'), $txt);
ob_start();
eval('?>'.$txt);
$txt = ob_get_contents();
ob_end_clean();
echo $txt;
然後真的 - 你應該想辦法做,沒有運行任意代碼。想要做一個計算,爲BB標籤內的內容使用一個解析器,想要包含一個文件,使用特定的語法。如果您的數據庫受到威脅,假設沒有人可以編輯它,但假定它是基於虛假的,並且會打開您的服務器以容易受到攻擊。 – Jon
那麼我會如何以這種方式包含文件呢? – Coolcrab