如果 PHP 的 magic_quotes_gpc 打開時, LifeType 會在 qstr() 對 SQL 指令的字串用 stripslashes() 移除 \ 字元. 所以會影響文章內有 \ 字元時, 存入資料庫前會被移除. (且不管 magic_quotes_gpc 是否打開, 在 EditPost 動作去 update 資料時, 一定都會用 stripslashes() 處理)
就算 magic_quotes_gpc 關閉時, 上述 update 指令同樣會用 stripslashes() 處理過而造成 \ 消失. 而 AddPost 的動作, 雖然沒有做 stripslashes() 的動作, 但是 \ 字元在 PHP 字串中有特別的用意, 沒有改成 \\ 來表示一個 \ 字元時, 實際存入資料庫後, \ 字元也會與後頭的字元被當成跳脫字元給處理掉而不見.
magic_quotes_gpc 應該只會對 ', ", \ 及 NUL 字元加上 \ 字元.
stripslashes() 並非是只針對上述四個字元來移除 \ 字元, 這個函式是用來還原 addslashes() 所產生的字串而設計的, 直接用在轉換 magic_quotes_gpc 應該是不適用的.
這個 patch, 會把 update post 的 stripslashes() 移除. 然後在 qstr() 中, 用 str_replace() 針對 ', ", \ 字元在 magic_quotes_gpc 開啟時特別處理. 最後在傳回字串前, 再把 \ 改成 \\.
目前在我的網站上頭看起來是可以正常運作的.
詳細說明可參考
http://blog.teatime.com.tw/post/1/30這個 patch 也 submit 到
http://bugs.lifetype.net diff -Nur class.orig/action/admin/adminupdatepostaction.class.php class/action/admin/adminupdatepostaction.class.php
--- class.orig/action/admin/adminupdatepostaction.class.php 2006-03-04 22:21:01.434358824 +0800
+++ class/action/admin/adminupdatepostaction.class.php 2006-03-05 14:13:59.971805184 +0800
@@ -88,9 +88,9 @@
}
// if we got it, update some fields
- $post->setTopic( stripslashes($this->_postTopic));
$postText = $this->_postText.POST_EXTENDED_TEXT_MODIFIER.$this->_postExtendedText;
- $post->setText( stripslashes($postText));
+ $post->setTopic( $this->_postTopic );
+ $post->setText( $postText );
$post->setCategoryIds( $this->_postCategories );
$post->setStatus( $this->_postStatus );
$post->setDateObject( $this->_postTimestamp );
diff -Nur class.orig/database/db.class.php class/database/db.class.php
--- class.orig/database/db.class.php 2006-03-04 22:19:56.205520124 +0800
+++ class/database/db.class.php 2006-03-05 14:13:05.191183578 +0800
@@ -93,9 +93,13 @@
function qstr($string) {
if (get_magic_quotes_gpc()) {
- $string = stripslashes($string);
+ //$string = stripslashes($string);
+ $string = str_replace('\\\\', '\\', $string);
+ $string = str_replace("\\'", "'", $string);
+ $string = str_replace('\\"', '"', $string);
}
+ $string = str_replace("\\", "\\\\", $string);
$string = str_replace("'", "''", $string);
return $string;