[PHP相關]
基礎知識補漏
<php類型轉換機制>
php是一種弱類型語言,它支持的類型有:
boolean,integer,float,string,array,object,callable,resource,NULL
類型之間轉換可能會發生一些有趣的事情,總結如下:
轉化成boolean
""(空字符串),"0"(字符串零),0(整型零),0.0(浮點零),array()(空數組),NULL,$a(尚未被賦值的變量)都會被認為是false。
任何資源,NAN,-1,都被認為是true。
字符串轉化成數值
如果該字符串沒有包含 '.','e' 或 'E' 並且其數字值在整型的范圍之內(由 PHP_INT_MAX 所定義),該字符串將被當成 integer 來取值,其它所有情況下都被作為 float 來取值。
該字符串的開始部分決定了它的值。如果該字符串以合法的數值開始,則使用該數值。否則其值為 0(零)。合法數值由可選的正負號,后面跟着一個或多個數字(可能有小數點),再跟着可選的指數部分。指數部分由 'e' 或 'E' 后面跟着一個或多個數字構成。
<php比較機制>
"="和"!"即strict比較符,只有在類型相同時才相等。
"=="和"!="即non-strict比較符。如果比較的兩者類型不同,會在類型轉換后進行比較:字符串在與數字比較前會自動轉換為數字;兩個字符串比較,如果兩個都是數字形式,則同時轉換為數字進行比較。
<?php
var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
var_dump("10" == "1e1"); // 10 == 10 -> true
var_dump(100 == "1e2"); // 100 == 100 -> true
var_dump("0e123456789012345678901234567890"==="0"); //false
var_dump("0e123456789012345678901234567890"=="0"); //true
?>
<php偽協議>這里還需要進一步學習
有的協議只在php中得到支持,故稱偽協議。
php.ini中兩個與之相關的設置:allow_url_fopen和allow_url_include
- allow_url_fopen:默認值是ON,允許url里的封裝協議訪問文件
- allow_url_include:默認值是OFF,不允許包含url里的封裝協議包含文件
php://filter
常用,任意文件讀取,雙OFF時可以使用。
命令格式:php://filter/[read/write]=string.[rot13/strip_tags/…..]/resource=xxx
php://input
strcmp()
在兩個字符串相等的時候返回0,該函數不能處理數組,如果傳入了數組參數會返回NULL。
根據之前的類型比較,如果比較時使用了strcmp(a,b) == 0
,那么(NULL == 0)是true,所以傳入數組可以繞過該函數。
防御方法是使用 === 進行嚴格比較。
%00截斷
php版本小於等於5.2.9和magic_quotes_gpc關閉,兩個條件都必須滿足才能截斷。
影響的函數
- include,include_once,require,require_once
- file_exists
- ereg,eregi(正則表達式匹配)
- file_get_contents
不處理截斷的函數
- strlen
md5()
前置知識:php變量類型
- 不能處理數組,md5(數組)會返回 null
<?php
$a[]=1;
echo md5($a);
?>
Warning: md5() expects parameter 1 to be string, array given in /tmp/45044302eb92d3bb0c8d1bed302358f3989559700dc1a118facbc80ef7f155a1/main.php on line 7
- 0e開頭碰撞:根據比較機制的缺陷,使md5值都是0e開頭即可繞過md5($a) == md5($b)這樣的條件判斷
0eeeb26bc5f6ba1cae0c5885c8f82dc9 aaaab6
0e08a88f2f1bad773e9baf987510c4c1 baaacU
0ef2db375cda51db88635099373077f6 caaaff
0e72bf9b806143116a4fda738b4fe6ef daaaeL
0e253b99812c188ec8358a29f601277e eaaagQ
0ebd40c0cd91aabcc7b321cd6b7e8c4d faaaaf
0ea081906fea694a27c77d902b0930bc gaaaaG
0e662ef3889bd06088261009539d0b98 haaatL
0e3ad9d5bfcf96fbf68d32f8d8020791 iaaadW
0e3121f7efc12a4c8a0b19419c08183c jaaagn
0e33d9ed1175b71a0c36c8092207aa2e kaaaiX
0e5b513ff48c0c38e9c80614e40e583f laaaaR
0eb4ff471d1daaad0abf3d0f25890f6a maaafG
0e8615bd2dad98219fe995f3f34fef20 naaagy
0ee7e45c8b49a711cfbf711a2ab8f362 oaaakE
0e45f47006f1ae77af97a2a66e63ca8b paaafB
0ed564aef50820bd0d19aeb0c54dafea qaaagb
0eb09dfaf39ac27929e40d7d040fad06 raaabY
0eaa701a96dd3c7eaf8db8b5dd14d871 saaadK
0ef8bbd0fd3a354d0c58968ba7a88347 taaac4
0e7f13153ac56df8cd77e2af28d62fe2 uaaaax
0e5d6c8a222b1b19657ed52e6463c0fc vaaaiK
0e2b644762da6a8c5ed726316ccfc8b5 waaacI
0e44238a7664e6316501f2d589dc8631 xaaadE
0ee4bf6dcf69bced96b0af0ffc8fc542 yaaabl
0e4ab7c28649f4690011ce5fd14e8eb6 zaaatC
0ee1abcce5648ea8b4a8d265f09b24e6 Aaaact
0ec8c912ef997ac3e8ceb23d24c9e8f9 Baaaa9
0e421d02abfd0c8eae7e18451b8a6a08 CaaadI
0e3d90d73011c2551feba94e2cc8a3cc Daaack
0e4d796e0c13cc03edbb16a5a41fe04a EaaalV
0e34068055d34f3415ae5062c3363c32 FaaaoA
0e74a38eda13d433c42f125fe8d5ab83 GaaabG
0ecca6beb91b292fe3f80903f3686ab1 HaaaaN
0e6a5d1c5785cf7d16235e1a539c352b Iaaaal
0e072722ff0b52b4d8efce5838280fda JaaacP
0e7f073b9701f3db27e83312b41a562c Kaaakn
0ec8c8fd26aa23c5b5933148795c3b3d LaaatJ
0e47adc73495a965a5114d5e16b70c78 MaaaaM
0edf7fe4e0148a52401b1951e529ae41 Naaaea
0e94f0f84773bbd691dec8b61c0c4f67 Oaaae2
0e79b18f75647ff7d3559beeac04c857 Paaaa8
0e91e2497a84c108b9dd3f58c62e17cf Qaaadr
0e312e1d7354272a0f7af98e3f12beee Raaaa4
0e57201859c078cebf65fc4da841b7b0 Saaaea
0e7faba6001cb0b8a930b128cea1bd28 TaaaaH
0eaeb5168e0c16442a83dd2059bd77ae Uaaaif
0efea2555a6bdb087a88d32b7b620cfe Vaaagr
0ecac74e8afde8bbf370baca232400d2 Waaabo
0ef74044fa1a333241bd00751a8d5c6b Xaaaan
0e6d0acea3fb18c498b09ad3d04bdd0c Yaaab4
0ed7f23534604153a96387f90cef213f ZaaabC
0ec92f8847011379ce0c1c95d3d52677 0aaaga
0e644c2d05e6d81ff04194145d497c74 1aaabw
0e93fcef5a44bbc455bb54011b8c6b2f 2aaady
0edfb3f3a9ab8d5ae227861e9a44b3e7 3aaacO
0eabd2eeb3b01d5b516a4e5bc51d6a43 4aaaci
0e1e066173172fd0eb55ac92ee4d9254 5aaabd
0e98a9e89b8bf419701c85ec8183247c 6aaabp
0e17990dcefa714d524be3fcab79491c 7aaaad
0e5a9f50d8369a2bbbab1797752111f1 8aaalf
0e2eb438bed241fdb0f6fa0d93ac86c5 9aaaaE