PHP 出現 canary mismatch on efree() - heap overflow detected

近來在使用新的php framework來開發,因此…遇到什麼問題,都會花點時間來確認問題發生的原因為何…

最近,遇到一個非常詭異的問題,當程式去ms sqlserver 2005上某個table撈取資料時,在某種情況下,居然會讓網頁出現白頁。詭異的是,居然也沒有任何錯誤訊息的出現…不過,之前用php4時,也曾撈過同樣的table,卻從沒發生過這樣的狀況。在沒有錯誤的提示下,浪費不少時間在找問題。

不經在想會不會是新採用的framework有問題?或是其他地方的問題?如php5或是 freetds?最後,只好分開測試…所幸,也確認了問題不在於framework上。

雖然最後找到了『閃避』問題的方式。採用convert去轉換原本是smalldatetime的欄位資料。但總覺得問題沒解決。忽然想到,這樣的狀況下,應該會在apache的log下留有紀錄吧?

查了一下,果然在apache的log中找到如下的錯誤訊息
[error] [client 192.168.1.1] ALERT - canary mismatch on efree() - heap overflow detected (attacker '192.168.1.1', file '/my_test.php')

有了錯誤資訊後,就好查問題了。google之後,果然也找到正確的解決之法。
  1. 修改 php.ini
  2. 設定mssql.datetimeconvert = Off (這一行,原本是被mark的)
  3. 重新啟動 apache

以下則是節錄自php.ini中對於mssql.datetimeconvert的說明
; Specify how datetime and datetim4 columns are returned
; On => Returns data converted to SQL server settings
; Off => Returns values as YYYY-MM-DD hh:mm:ss

留言