1. 程式人生 > 其它 >PHP弱型別的學習

PHP弱型別的學習

 關於==和===

==是比較兩個值,如果型別相同就比較值,如果型別不同就轉換型別進行比較

===是強相等,是要比較兩者的型別也要一樣

問題就出在==的型別轉換上

行比較。

<?php
var_dump("admin"==0);  //true
var_dump("1admin"==1); //true
var_dump("admin1"==1) //false
var_dump("admin1"==0) //true
var_dump("0e123456"=="0e4456789"); //true 
?> 

當把一個字串和數字進行比較的時候進行型別轉換,會把字串轉換成int型別的,具體規則為:

如果該字串沒有包含'.','e','E'並且其數值值在整形的範圍之內
該字串被當作int來取值,其他所有情況下都被作為float來取值,該字串的開始部分決定了它的值,如果該字串以合法的數值開始,則使用該數值,否則其值為0。
x02:"array_search"與is_array"繞過
is_array:判斷傳入的是不是一個數組,array_search(x,$陣列):在陣列中尋找與指定值(x)相等的值,array_search函式 類似於"==",會進行型別的轉換
<?php
if(!is_array($_GET['test'])){exit();}
$test=$_GET['test'];
for($i=0;$i<count($test);$i++){
    if($test[$i]==="admin"){
        echo "error";
        exit();
    }
    $test[$i]=intval($test[$i]);
}
if(array_search("admin",$test)===0){
    echo "flag";
}
else{
    echo "false";
}
?>
在上面的栗子中,我們可以傳入test[]=0來進行繞過,首先test是一個數組,符合is_array的判斷,然後test=0;在array_search中0==admin為true,繞過了array_search。

0x03:strcmp漏洞繞過
strcmp是比較兩個字串,str1<str2,返回<0,str1>str2,返回>0,相等時返回等於0
 1 <?php
 2     $password="***************"
 3      if(isset($_POST['password'])){
 4 
 5         if (strcmp($_POST['password'], $password) == 0) {
 6             echo "Right!!!login success";n
 7             exit();
 8         } else {
 9             echo "Wrong password..";
10         }
11 ?>
上述程式碼中要求我們post一個password值,要與給定的password變數的值相等,但我們不知道password變數的值是什麼!這怎麼辦呢?
stamp期望傳入的值是字串型別,但如果我們傳入陣列型別會怎麼樣呢?
我們傳入 password[]=xxx 可以繞過 是因為函式接受到了不符合的型別,將發生錯誤,但還是判斷其相等