作者buganini (霸格尼尼)
看板PHP
標題網頁/PHP 之 Programming/Debug
時間Tue Mar 24 03:24:47 2009
一個網頁從後端程式邏輯到前端顯示互動
經過很多層的處理
一個PHP網頁 可能會經過
PHP
PHP裡面的PCRE
Shell
SQL
HTML
Javascript
Javascript的RE
CSS
這麼多層(順序不一定)
各個都有自己的parser
遇到問題的時候務必要搞清楚自己面對的哪一個parser
注意引號和\和你用的語法 是要給哪個parser看的
以幾個案例來說
版名 AID The Point
Web_Design
#19lvUAyo 混淆HTML/Javascript
PHP
#19iKZdp_ 混淆PHP/PCRE
PHP
#16WYEVxu PHP+PCRE Escape
PHP
#19ix2T8Z PHP+SQL Quote
SQL Injection也可以視為PHP/SQL之間不當的quote造成的問題
XSS則是PHP/Javascript之間欠缺escape
平常除錯的時候也要盡可能縮小bug經過的層次
以PHP版的
#19nv8N5m #19oHP55Z來說
問題出在HTML層 原po應該一層一層檢查
PHP看不出什麼錯 就改看HTML source
而不是從PHP<-->HTML Rendering跨這麼大層面來看
debug要分層來 同理於unit test
#19oY9PJp這篇更慘 原po自己看不到問題之後
還把問題簡化了 結果變成另一個問題
#19omHE9p
有些好東西/好方法可以幫助你在不同層面之間不會頭昏
1.json常用於把PHP的資料結構轉換成Javascript的語法
就不用自己quote/escape半天了
2.prepare statement或meta function
通常用來打造SQL 可以簡單用sprintf
或像
http://security-hole.info/~buganini/dev/PHP/mysql.php
mksql()就是個prepare statement的範例
sql_inset() sql_update()是meta function的範例
3.適當選擇Quote
在PHP裡面寫SQL的時候 很多人會用 "SELECT ... $var ..."
這樣在裡面放變數可以少用幾個quote
在PHP裡面寫HTML的時候我通常這樣寫echo '<a href="xxxx">xxxx</a>';
比較方便讓HTML tag attribute用" (比較符合標準)
如果裡面要裝變數的話就可以考慮用雙引號
作網頁能接觸到的語言大多都能支援單雙引號
只要注意像PHP的單雙引號的意義不同 要自己評估適用哪一種
其他語言大都可以隨意混用
當外面用了一種的時候 裡面就用用另外一種
像echo '<a href="xx" onclick="alert(\'lala\')">xx</a>';
這樣一行就有PHP/HTML/Javascript三層quote了
而MySQL還有一種quote `是用來包資料庫/欄位名稱的 文字單雙引號都可以用
如果是用MSSQL 規則又不一樣了 字串要用單引號 欄位用雙引號
樓上那篇
#19nzQJXT就是quote錯誤的範例
4.程式裡用到system() shell_exec()之類的函式的話 就會牽涉到Shell
PHP有escapeshellcmd() escapeshellarg()可以用
但是就我的經驗 Windows底下escapeshellcmd()好像沒有用?
路徑裡面有空白的時候 雖然quote了還是會被切開的樣字
--
想到再補
--
國愛‧主民‧學科‧康健‧道人
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.231.23
推 crazybad :推一個~ 03/24 05:32
推 sdcomputer :推好文~XD 03/24 18:24
推 bigair :推! 03/25 14:36
※ 編輯: buganini 來自: 220.135.231.23 (03/26 17:30)