2011-10-08 169 views
0

安全的字符串輸出

$id = (int) $_POST['id'] 
$content = filter_input(INPUT_POST, 'post_content', FILTER_SANITIZE_STRING); 

上述內容,使我的$內容串保護,當我把它上傳到數據庫:

$conn->new->query("UPDATE `posts` SET `content` = " . $conn->escape_string($content) . " where `id` = {$id};"); 

但同時,是不會刪除一些特殊字符如標籤,例如我不能在我的帖子中使用<,因爲它會被刪除。

我該如何修改它,以獲得足夠的安全性並防止我的代碼被黑客攻擊?

+0

'FILTER_SANITIZE_STRING'是'strip_tags'和'htmlspecialchars'的組合。你必須決定你想要什麼/保持什麼。如果標籤被允許,那麼使用一個像HTMLPurifier這樣的真正的過濾器。 – mario

回答

1

逸出允許,可以在目標系統上的不利影響某些字符的過程。例如,MySQL使用引號和括號等字符。 mysql_real_escape_string轉義這樣的字符,所以他們不會污染查詢’噸。

你不需要’在將數據存儲到數據庫之前,必須從數據中清理HTML,但是您必須轉義有害字符。正如@Damien在評論中指出的,您可以在輸出之前轉義HTML(,這可能會對您的HTML產生不利影響)。

+0

那麼我怎麼才能在查詢之前轉義那些'有害'的字符呢? 當我從數據庫中讀取數據時,使用'htmlspecialchars()'顯示該數據。 – Rym

+0

[mysql_real_escape_string](http://php.net/manual/en/function.mysql-real-escape-string.php)或[mysqli :: real_escape_string](http://php.net/manual/en/mysqli .real-escape-string.php) – Herbert

+0

更好的是,使用PDO與您的數據庫進行交互。 PDO很好地解釋[這裏](http://stackoverflow.com/questions/1742066/why-is-pdo-better-for-escaping-mysql-queries-querystrings-than-mysql-real-escape/1742638#1742638) 。 – Herbert

0

只需使用real_escape_string()和已經必須良好,安全的^ _^

+0

我正在使用:'$ conn-> escape_string'與'real_escape_string'相同,所以你說這足以安全嗎?不需要轉義特殊字符? – Rym

+1

@Rym「轉義」很大程度上取決於目標媒體。如果你想在INSERTING INTO DATABASE之前轉義,使用m_r_e_s作爲建議,或者你的db funcion使用相同的方法。如果您想要轉義HTML,您需要在輸出到頁面之前執行此操作。使用htmlentities()作爲 –

+0

什麼是m_r_e_s ?! :P – Rym