[分享] 網頁/PHP 之 Programming/Debug
一個網頁從後端程式邏輯到前端顯示互動
經過很多層的處理
一個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
推
03/24 05:32, , 1F
03/24 05:32, 1F
推
03/24 18:24, , 2F
03/24 18:24, 2F
推
03/25 14:36, , 3F
03/25 14:36, 3F
※ 編輯: buganini 來自: 220.135.231.23 (03/26 17:30)
PHP 近期熱門文章
PTT數位生活區 即時熱門文章