LifeType 中文開發論壇

開發 => 核心補強 => 主題作者是: twu2 於 三月 05, 2006, 01:41:06 下午



主題: [patch] 對 \ 字元的處理
作者: twu2三月 05, 2006, 01:41:06 下午
如果 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;


主題: Re: [patch] 對 \ 字元的處理
作者: markwu三月 05, 2006, 11:45:49 下午
Hi twu2:

已經 commit 進 SVN rev 3051 了!謝謝!

Mark


主題: Re: [patch] 對 \ 字元的處理
作者: lss三月 06, 2006, 07:31:07 上午
崇拜~~~

以後,貼程式碼就不會有 \ 消失的問題了。

lss


主題: Re: [patch] 對 \ 字元的處理
作者: twu2三月 06, 2006, 09:42:45 上午
另外, 這個不知道算不算 bug.
如果把 xhtml 的轉換功能打開時, 會把 & 這個字串轉換成 & 字元.
所以 \ 這個字串, 會被轉換成 \ 後存入資料庫, 後頭再顯示時就變成 \ 字元, 而非 \ 了.

我目前是把 xhtml 轉換的功能 disable 就不會發生這個問題了.

再舉個例子, 如果我要顯示 & 這個字串, 在編輯器輸入後, 會被轉成 & 這個 html code, 但是在 xhtml filter 運作後, 會被改成 & 這個字串. 所以實際存入資料庫的是 & 而不是 &.
結果就是, 當顯示這個文章時, 這個 & 字串就被顯示成 & 而已. 而不是我要的 & 字串了.

以結果來說, 這個轉換是不正常的. 在 xhtml filter 應該要避免轉換 & 到 &. 或者應該檢查 & 後頭的字串是否會在轉換成 & 之後, 又變成一個特殊意義的字. 如果是, 就不應該轉換.

我有 submit 這個問題到 http://bugs.lifetype.net/view.php?id=853