2011-02-22 105 views
0

我有一個JavaScript豐富的頁面,傳遞一個大的JSON格式化爲PHP將放入MySQL數據庫。 JSON中的數據包括用戶提交的字符串,並將包含包含基本html的字符串(<a><strong>等)。如何在MySQL中對數據庫存儲的json數據進行編碼?

我遇到的問題是,當含有'引號的字符串被轉義,我不能剝奪斜線,導致複合逃逸像

<a href=\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'example.com\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'></a> 

每當用戶節省這加劇,嚴重腹脹數據庫字段。

我的字符串轉換將數據插入到MySQL是:

$correspondenceArray = base64_encode(json_encode($_POST['saveArray']['correspondenceObject'])); 

而要找回數據爲:

function stripslashes_deep($value) 
{ 
    $value = is_array($value) ? 
       array_map('stripslashes_deep', $value) : 
       stripslashes($value); 

    return $value; 
} 

$correspondenceJSON = stripslashes_deep(json_decode(base64_decode($resultArray['correspondence_array']), true)); 

從我已經做了我的意圖是要剝離上的數據斜槓來自數據庫,所以javascript有非轉義數據

編輯

我意識到json_encode($a,JSON_HEX_QUOT)將可能有所幫助,但我運行的服務器有PHP 5.2.16使功能不可用)

+1

你有'magic_quotes_gpc()'打開了嗎?那些垃圾會將你所有的數據全部刪除,並且該選項應該被關閉。 – 2011-02-22 22:31:13

+0

啊,沒有打開。嗯,如果我把它關掉,我可能會在其他地方產生影響? – 2011-02-22 22:36:22

+0

你可能想在你的查詢中使用mysql_real_escape_string(),當你關閉它以避免惡意注入時,但是@Marc B是正確的,你應該關閉它(它在PHP 5.3中不贊成使用)。 – Capsule 2011-02-22 22:41:22

回答

3

不要使用字符串代的SQL。

如果使用佔位符會有沒有問題(帶存儲)和沒有神奇的轉義需要。只需將其存儲爲VARCHAR類型即可。完成並完成。

消毒用於輸出(和輸入期間)同樣應該使用適當的庫來完成 - 有兩種不同的操作;然而,這是一個單獨的問題比存儲。

編輯

PDO爲一個準備好的聲明(讀:佔位符)實現。其他可能存在(我不使用PHP,但覺得有義務糾正有關手動內置基於字符串的SQL查詢設計錯誤的延續。)

到預處理語句的參數不需要是引;驅動程序自動處理這個。 如果應用程序獨佔使用預準備語句,開發人員可以確保不會發生SQL注入(但是,如果正在使用未轉義的輸入構建查詢的其他部分,則仍然可以執行SQL注入)。

聽起來太好了,是真的。現在使用字符串生成的語句退出。請。

快樂編碼。

+0

問題是我編碼的對象是一個非常深的多維數組(目前深達5層)並且完全動態。 – 2011-02-22 23:05:41

+0

@Zak Henry這不會改變我的答案。 JSON是文本。 **如果在SQL語句中使用*佔位符*(又名「準備語句」),則文本可以安全地存儲在數據庫中,而不會「轉義」。請參閱:http://php.net/manual/en/pdo.prepared-statements.php或類似的 - 不好的設計必須死亡。使用準備好的語句也可以 - 理論上(取決於許多因素,包括後端,適配器和使用模式) - 顯着提高性能。 – 2011-02-22 23:49:31

+1

不幸的是,PDO看起來像它使用了一些愚蠢的實現並引用了變量 - 但無論如何,它都是從一個糟糕的方法到一個可接受的方法。 – 2011-02-22 23:55:30

相關問題