1. 程式人生 > >【9】WEB安全學習----PHP基礎語法二

【9】WEB安全學習----PHP基礎語法二

目錄

二、陣列

建立陣列

使用陣列

多維陣列

遍歷陣列

陣列運算子

字串函式

數學函式

定義函式

函式的引數

變數函式

回撥函式

遞迴函式

匿名函式

可變引數

一、流程控制

1、IF語句

<?php
    #IF語句第一種形式 if
    if(True){
        echo 'hello world<br />';
        echo 'php is if';
    }

    #IF語句第二種形式 if-else
    if(True){
        echo 'True';
    }else {
        echo 'False';
    }

    #IF語句第三種形式  if-elseif-else
    $int1 = 5;
    if($int1 === 1){
        echo '1';
    }elseif($int1 ===2){
        echo '2';
    }elseif($int1 ===3){
        echo '3';
    }else{
        echo 'hello';
    }

    #獲取星期幾例子   輸出 2018年09月01日 14:58:52星期六
    header('content-type:text/html;charset=utf8'); #有中文,設定編碼
    echo @date('Y年m月d日 H:i:s'); #加上錯誤抑制符@,就不會顯示日期警告
    $a = @date('w');
    if($a === '1'){
        echo '星期一';
    }elseif($a === '2'){
        echo '星期二';
    }elseif($a === '3'){
        echo '星期三';
    }elseif($a === '4'){
        echo '星期四';
    }elseif($a === '5'){
        echo '星期五';
    }elseif($a === '6'){
        echo '星期六';
    }elseif($a === '0'){
        echo '星期日';
    }else{
        echo '錯誤';
    }
?>

2、預定義變數

  1. _POST:接收表單以POST方式傳送的資料
  2. _GET:接收以?形式傳參的資料
  3. _FIFES:檔案上傳變數
  4. _SERVER:伺服器和執行環境變數
  5. _ENV:環境變數
  6. _SESSION:會話變數
  7. COOKIE:HTTP Cookie
  8. REQUEST:$_GET+$_POST+$_COOKIE
  9. GLOBALS:超全域性變數,在全部作用域中始終可用的內建變數
  10. $php_errormsg:前一個錯誤資訊
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>POST、GET和REQUEST例子</title>
</head>
<body>
    <form action="" method="post">
        姓名:<input type="text" name="name" id="">
        <input type="submit" name="submit" value="提交">
    </form>
    <a href="http://127.0.0.1/bj/index.php?name=php">GET提交</a>
    <?php
        if(isset($_POST['submit'])){ #使用isset()函式,檢測變數是否被設定值
            $name=$_POST['name'];
            echo '歡迎'.$name;
        }
        if(isset($_GET['name'])){
            echo '歡迎'.$_GET['name'];
        }
        echo $_REQUEST['name'];
    ?>
</body>
</html>

3、Switch語句

<?php
    /*
    switch(exp){
        case 值1:
            程式碼段;
            break;
        case 值2:
            程式碼段;
            break;
        default:
            程式碼段;
            break;
    }
     */
    header('content-type:text/html;charset=utf-8');
    [email protected]('w');
    switch($date){
        case '1':
            echo '星期一';
            break;
        case '2':
            echo '星期二';
            break;
        case '3':
            echo '星期三';
            break;
        case '4':
            echo '星期四';
            break;
        case '5':
            echo '星期五';
            break;
        case '6':
            echo '星期六';
            break;
        default:
            echo '星期日';
            break;
    }
?>

4、For迴圈

<?php
    for($i=1;$i<10;$i++){
        echo '<br />';
        for($j=1;$j<=$i;$j++){
            echo $j.'*'.$i.'='.$i*$j."  ";
        }
    }
    #continue:跳過本次迴圈,繼續下次迴圈
    #break:跳出迴圈
?>

5、While迴圈

<?php
    $i=1;
    while($i<10){
        $j=1;
        echo '<br />';
        while($j<=$i){
            echo $j.'*'.$i.'='.$i*$j.'  ';
            $j++;
        }
        $i++;
    }

    #do-while迴圈,無條件執行一次迴圈體程式碼
    do{
        echo 'aaaa';
    }while(False)
?>

二、陣列

建立陣列

<?php

#一、通過array()函式宣告陣列
    $array1=array(); //宣告一個空陣列
    var_dump($array1); //array(0) { }
    echo gettype($array1); //array
    var_dump(is_array($array1)); //bool(true)
    $array2=array(1,2.3,'hello','name'=>'php'); //定義混合陣列
    var_dump($array2); //陣列下標從0開始,陣列分為索引陣列和關聯陣列
    /*
  array(4) {
  [0]=>
  int(1)
  [1]=>
  float(2.3)
  [2]=>
  string(5) "hello"
  ["name"]=>
  string(3) "php"
}
     */

#二、動態建立陣列  連續索引陣列
     $array1[]=1;
     $array1[]=3.14;
     $array1[]='aaa';
     var_dump($array1);
    #手動指定陣列下標
    $array2[0]=1;
    $array2[1]=3.14;
    $array2[2]='aaa';
    var_dump($array1);
    #動態建立關聯陣列
    $arr1['name']='xiaoming';
    $arr1['age']=20;
    $arr1['sex']='男';
    $arr1[]=2;
    var_dump($arr1);

#三、快速建立索引陣列
    $arr=range(1,10);
    var_dump($arr); //array(10) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) [5]=> int(6) [6]=> int(7) [7]=> int(8) [8]=> int(9) [9]=> int(10) }
    
    $arr1=range(1,10,2); //指定步長
    var_dump($arr1); //array(5) { [0]=> int(1) [1]=> int(3) [2]=> int(5) [3]=> int(7) [4]=> int(9) }
    
    #通過compact()函式快速建立關聯陣列
    $name='xiaoming';
    $age=20;
    $addr='CQ';
    $arr1=compact('name','age','addr');
    print_r($arr1); //Array ( [name] => xiaoming [age] => 20 [addr] => CQ )
?>

使用陣列

<?php

#對陣列進行增刪改查

$arr['name']='php';
$arr['age']=20;
$arr['addr']='CQ'; //增:
echo $arr['name'];  //查: 通過指定鍵名獲取鍵值  php
$arr['name']='PHP';  //改: 對陣列內元素進行修改,只需要覆蓋以前的鍵值即可
echo $arr['name']; //PHP
unset($arr['name']);  //刪:使用unset()函式刪除陣列元素
print_r($arr);
unset($arr); //刪除整個陣列
?>

多維陣列

<?php
    #使用array()函式建立多維陣列
    $arr=array(
        array(1,2,3),
        array(4,5,6)
    );
    print_r($arr); //Array ( [0] => Array ( [0] => 1 [1] => 2 [2] => 3 ) [1] => Array ( [0] => 4 [1] => 5 [2] => 6 ) )
    #使用動態建立多維陣列
    $arr1[0]['dd']='php'; //建立一個二維陣列
    $arr1[0]['name']='hello';
    print_r($arr1); 
    /*
    Array
(
    [0] => Array
        (
            [dd] => php
            [name] => hello
        )

)
    */
    echo $arr1[0]['name'];  //取值
?>

遍歷陣列

<?php
    #格式為:foreach($array as key=>value)
    $arr1[]='aaa';
    $arr1[]='bbb';
    $arr1[]='ccc';
    $arr1[]='ddd';
    foreach($arr1 as $key){ //只取key鍵名
        echo $key.'<br />';
    }
    /*
aaa
bbb
ccc
ddd
    */

    $arr2['name']='PHP';
    $arr2['age']=20;
    $arr2['addr']='CQ';
    foreach($arr2 as $key=>$value){ //取key和value
        echo $key.'=>'.$value.'<br />';
    }
    /*
name=>PHP
age=>20
addr=>CQ
    */


    #生成二維陣列
    $arr1[]=array('name'=>'php','age'=>20,'addr'=>'CQ');
    $arr1[]=array('name'=>'C++','age'=>18,'addr'=>'SH');
    $arr1[]=array('name'=>'JAVA','age'=>29,'addr'=>'CD');
    print_r($arr1);
    /*
    Array
(
    [0] => Array
        (
            [name] => php
            [age] => 20
            [addr] => CQ
        )

    [1] => Array
        (
            [name] => C++
            [age] => 18
            [addr] => SH
        )

    [2] => Array
        (
            [name] => JAVA
            [age] => 29
            [addr] => CD
        )

)
    */
    foreach($arr1 as $key=>$value){ //遍歷二維陣列
        echo $value['name'].'<br />';
        echo $value['age'].'<hr />';
    };
?>

陣列運算子

+:合併陣列,如果都有相同的鍵則取左邊的

==:具有相同的鍵值則為True

===:具有相同的鍵值且類似和順序都相同則為True

!=:具有不相同的鍵值則為True

!==:具有不相同的鍵值且類似和順序都相同則為True

<?php
    $arr1=array(1,2,3,4);
    $arr2=array('aa','bb');
    $arr3=$arr1+$arr2;
    print_r($arr3); //Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 )
?>

三、系統函式

字串函式

長度:strlen($String)  得到字串長度

echo strlen('hello你好'); //11 在UTF-8中,一箇中文佔3個長度

字串查詢:strpos($string,$serch[,$offset])  在指定字串中查詢目標字串第一次出現的位置

echo strpos('hello','l'); //2

字串查詢:stripos($string,$serch[,$offset])  忽略大小寫的去查詢

echo stripos('heLlo','l'); //2

字串替換:str_replace($search,$replace,$string)  替換字串    str_ireplace():忽略大小寫進行替換

echo str_replace('a','1','aaabbbccc'); //111bbbccc

字串大小寫轉換:strtolower() 到小寫、strtoupper() 到大寫

echo strtolower('ABC'); //abc
echo strtoupper('abc'); //ABC

字串擷取:substr($string,$start[,$length])  擷取指定長度字串

echo substr('abcdefg',3); //defg
echo substr('abcdefg',3,2); //de

字元ASCII:ord()    chr()

echo ord('a'); //97
echo chr(98); //b

加密:md5()、sha1()

echo md5('admin'); //21232f297a57a5a743894a0e4a801fc3
echo sha1('admin'); //d033e22ae348aeb5660fc2140aec35850c4da997

字串過濾:

1、trim() 刪首尾空

echo trim(' a bc ');  //a bc

2、strip_tags() 過濾字串中HTML標記

 echo strip_tags("<html><h1>hello</h1></html>"); //hello

3、addslashes() 使用反斜線引用字串中特殊字元

 echo addslashes("a'");  //a\'

4、htmlentities() 

echo htmlentities('<script>alert(/"xs"/)</script>'); //&lt;script&gt;alert(/&quot;xs&quot;/)&lt;/script&gt;gt;

5、nl2br() 將字串中的\n用<br/>代替

echo nl2br("hello\nworld"); //hello<br />world

字串比較:strcmp() 比較兩個字串大小

echo strcmp('aaa','bbb'); //-1

分割文字:expload($delimiter,$string) 將指定字串拆分為陣列

print_r(explode('#','aaa#bbb#ccc')); //Array ( [0] => aaa [1] => bbb [2] => ccc )

合併文字:join($delimiter,$array)   將陣列連線成字串

$arr1=array('aaa','bbb','ccc');
echo join('-',$arr1); //aaa-bbb-ccc

反轉字元:strrev()

echo strrev('abc'); //cba

數學函式

求絕對值:abs($number)

四捨五入:round($number,$percision)

冪運算:pow($base,$exp)

平方根:sqrt($number)

求最大值:max($va1,$va2......)

求最小值:min($va1,$va2......)

產生隨機數:mt_rand($min,$max)

日期時間函式

得到當前時間戳:time()

echo time();//1535887462

得到當前伺服器時間:date($format[,$time])

echo date('Y-m-d'); //2018-09-02

四、自定義函式

定義函式

<?php
    #函式的定義
    function fun1($int1,$int2){
        return $int1+$int2;
    }
    echo fun1(3,5); //函式的呼叫
?

函式的引數

<?php
    #函式的引數分為2種:形參和實參
    #形參有2種:必選引數和可選引數
    function fun1($str1,$str2='php'){
        return $str1.' '.$str2;
    }
    echo fun1('hello'); //hello php
    echo fun1('hello','world'); //hello world
?> 

變數的作用域

<?php
    #變數的作用域分為:區域性變數和全域性變數
    #區域性變數又分為:動態變數和靜態變數
    function test(){
        $i=1; //區域性動態變數,函式執行完就釋放
        $i++;
        echo $i.'<br/>';
        static $a=1; //區域性靜態變數,函式執行完儲存在靜態記憶體中
        $a++;
        echo $a.'<br/>';
    }
    test(); //2 2
    test(); //2 3
    test(); //2 4

    $str1='php';
    function test1(){
        global $str1;  //函式內不能直接呼叫全域性變數,如果要使用,進行global關鍵字實現
        echo $str1; //php
    }
    test1();
?> 

傳值和傳引用

<?php
    #傳值在函式體內對變數更改不影響變數本身
    #傳引用在函式體內對變數更改影響變數本身
    $str1='php';
    function test($str){
        $str='hello';
        echo $str; //hello
    }
    test($str1);
    echo $str1; //php    直接傳值,不會影響原變數

    function test1(&$str){
        $str='hello';
        echo $str; //hello
    }
    test1($str1);
    echo $str1; //hello   傳引用,會影響變數本身
?>

變數函式

<?php
    #將函式名稱賦值給變數,呼叫的時候通過變數名稱加上小括號的形式進行呼叫
    $md51='md5';
    echo $md51('admin');  //21232f297a57a5a743894a0e4a801fc3

    function test(){
        echo 'hello php';
    }
    $test1='test';
    $test1(); //hello php
?>

回撥函式

<?php
    #自定義回撥函式
    function test($str){
        echo 'hello '.$str;
    }
    function callback($call,$str1){
        $call($str1);
    }
    callback('test','php'); //hello php  把函式當作引數傳遞

    #使用call_user_func()進行呼叫
    call_user_func('test','php'); //hello php
    

?>

遞迴函式

<?php
    #函式自己呼叫本身
    function test($i){
        echo $i.'<br />';
        $i++;
        if($i<=10){ //遞迴函式一定要有結束條件
            test($i);
        }
    }
    test(1); //輸出1 2 3 4 5 6 7 8 9 10  和迴圈類似
?>

匿名函式

<?php
    #匿名函式也叫閉包函式,允許臨時建立一個不指定名稱的函式
    $test=function($str1){
        echo 'hello '.$str1;
    };
    $test('php');  //匿名函式使用變數函式來進行呼叫  hello php
?>

可變引數

<?php
    #func_num_args() 得到函式引數個數
    #func_get_arg()  得到函式引數
    #func_get_args()  得到函式引數陣列形式
    function test(){
        echo func_num_args();  //5
        echo func_get_arg(1);  //2  引數下標和陣列一樣,從0開始
        $arr1=func_get_args(); //Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 )
        foreach($arr1 as $key){
            echo $key;  //12345 得到每個引數值
        }
    };
    test(1,2,3,4,'5'); 

?>

相關推薦

9WEB安全學習----PHP基礎語法

目錄 二、陣列 建立陣列 使用陣列 多維陣列 遍歷陣列 陣列運算子 字串函式 數學函式 定義函式 函式的引數 變數函式 回撥函式 遞迴函式 匿名函式 可變引數 一、流程控制 1、IF語句 <

45WEB安全學習----JAVA基礎

一、類與物件 1、構造方法 作用:可以通過構造方法實現例項化物件中的屬性初始化處理。若類中沒有自己定義構造方法,JAVA會預設提供一個無參、什麼都不做的構造方法。 定義:方法名稱必須和類名稱保持一致、不允許設定任何的返回值型別、是在使用關鍵字new例項化物件時自動呼叫。 構造方法過載

44WEB安全學習----JAVA基礎

前言: 為什麼做滲透測試需要學習JAVA?自己的見解: 1、目前國內大中型企業專案多數採用JAVAEE開發,而在日常安全服務工作中,百分之八十的專案也是JAVA所開發,所以需要學習JAVA(達到會分析會寫,而不是之前學習PHP那樣會分析就行,因為PHP的特性,所以用來打CTF的挺多)。

43WEB安全學習----PHP-ThinkPHP框架2

模板常量替換機制 __MODULE__:表示從域名後面開始一直到分組名結束的路由 __CONTROLLER__:表示從域名後面開始一直到控制器結束的路由 __ACTION__:表示從域名後面開始一直到方法名結束的路由 __PUBLIC__:站點根目錄下的public目錄路由 _

42WEB安全學習----PHP-ThinkPHP框架1

前言 前不久參加了一個CTF比賽,有一道題是PHP程式碼審計,採用框架進行開發,因為從沒有接觸過框架學習,故找到了漏洞程式碼也不知道怎麼構造利用,悲慘之極,現在惡補下。 PHP框架 在PHP中,目前主流的框架有: Zend Framework:重量級框架,由PHP官方出品,因為功能較

46WEB安全學習----JAVA基礎

一、String類 在JAVA中,String字串用雙引號引起來,字串嚴格來說就是字元的陣列集合: 在JDK1.8及以前,String類使用char []字元陣列儲存字串,而1.9及以上使用byte []位元組陣列儲存字串。 1、字串的比較: 字串如果用 "==" 進行比較,比較的是

11WEB安全學習----MYSQL1

目錄 2、表 4、主鍵 1、整數型 2、浮點型 四、建立表 1、建立表 單欄位主鍵 五、修改表 8、刪除表

13WEB安全學習----MYSQL-3

目錄 隱式轉換: 顯式轉換: IF 函式與操作符 一、型別轉換 隱式轉換: 當運算子與不同型別的運算元一起使用時,會發生型別轉換以使運算元相容。某些轉換是隱式發生的。例如,MySQL會根據需要自動將數字轉換為字串,反之亦然。

19WEB安全學習----MySQL注入-4

一、盲注介紹 開發人員一般禁用了所有的詳細錯誤訊息,如果發現了一個SQL注入點,但應用只提供了一個通用的錯誤頁面;或者返回正常頁面但沒有我們需要的內容在上面。這些都屬於SQL盲注,沒有錯誤訊息或反饋內容就不能使用之前的注入方法,而是採用SQL邏輯操作以位元組方式推斷資料來修

27WEB安全學習----SQL server注入

一、基礎知識 系統資料庫 master資料庫 master是SQL server最重要的資料庫,是整個資料庫的核心,使用者不能直接修改。裡面資料庫包括使用者的登陸資訊、使用者所在的組、所有系統的配置選項、伺服器中本地資料庫的名稱和資訊、初始化方式等。 model資

28WEB安全學習----SQL注入總結

檢測注入 不管什麼資料庫注入,檢測是否有注入點是第一步,而檢測的方法大同小異。 1、閉合SQL拼接語句 要想進行下一步注入,首先需要閉合SQL語句,如何知道閉合符號是什麼呢?可通過在引數後面加入單引號或雙引號使其整條SQL拼接語句失敗,從而可從資料庫報錯資訊得知,若沒有

29WEB安全學習----XML注入

一、XML基礎 簡介: XML:可擴充套件標記語言。XML被設計用來是傳輸和儲存資料,XML是一種“元標記”語言,開發者可以根據自己的需要建立標記的名稱。 XML結構 XML是一種樹結構,從“根部”開始,然後擴充套件到“枝葉”,XML文件必須有根元素。 <?x

31WEB安全學習----XPath注入

一、XPath簡介 XPath 是一門在 XML 文件中查詢資訊的語言。可以理解xml為資料庫,xpath就是查詢資料庫的SQL語言。 XPath 使用路徑表示式在 XML 文件中進行導航 XPath 包含一個標準函式庫 XPath 是 XSLT 中的主要元素 XP

32WEB安全學習----Json注入

一、Json簡介 JSON 是儲存和交換文字資訊的語法,是輕量級的文字資料交換格式。類似xml,但JSON 比 XML 更小、更快,更易解析。所以現在介面資料傳輸都採用json方式進行。JSON 文字的 MIME 型別是 "application/json"。 json語

33WEB安全學習----XSS攻擊1

關於XSS跨站指令碼攻擊有太多文章和教材提供了,本章就簡單介紹XSS攻擊原理,重點介紹XSS程式碼構造和繞過。 一、XSS攻擊原理 XSS攻擊:即跨站指令碼攻擊,是指攻擊者在網頁中嵌入客戶端JavaScript指令碼,當用戶使用瀏覽器瀏覽嵌入惡意程式碼的網頁時,惡意程式碼

34WEB安全學習----XSS攻擊2

一、JavaScript事件 在構造XSS程式碼時,如果對<>進行了編碼或過濾,那麼無法結束和新建HTML元素,此時可以用事件進行觸發(這裡不討論利用HTML標籤屬性值進行觸發,因為只支援少部分瀏覽器)。 JavaScript指令碼中的事件是指使用者載入目標頁

36WEB安全學習----CSRF攻擊

CSRF攻擊 關於CSRF攻擊,網上也有很多講解,這裡就不重複造輪子了。 簡單介紹下,CSRF攻擊也叫跨站點請求偽造攻擊,其核心攻擊原理是:在傳送請求時,瀏覽器會自動附帶使用者的cookie資料進行提交,那麼通過這個原理,攻擊者通過JS構造某些功能請求,如發帖,轉發、修改

37WEB安全學習----SSRF攻擊

一、攻擊原理 SSRF:服務端請求偽造,不要把它和CSRF(跨站點請求偽造)攻擊搞混了哦,CSRF利用的是客戶端請求,而SSRF利用的是伺服器端請求,這個是本質區別。 簡單來說,SSRF攻擊原理是伺服器端請求了來自客戶端構造的連結,這個是不是和CSRF攻擊類似呢,攻擊者構

39WEB安全學習----Jsonp跨域安全

同源策略 同源策略/SOP是一種約定,它是瀏覽器最核心也最基本的安全功能,所謂同源是指"協議+域名+埠"三者相同。 同源策略限制以下幾種行為: 1、Cookie、LocalStorage 和 IndexDB 無法讀取 2、DOM 和 Js物件無法獲得 3、AJA

40WEB安全學習----URL跳轉漏洞

URL跳轉漏洞/開放重定向漏洞 由於應用越來越多的需要和其他的第三方應用互動,以及在自身應用內部根據不同的邏輯將使用者引向到不同的頁面,如果實現不好就可能導致一些安全問題,特定條件下可能引起嚴重的安全漏洞。 對於URL跳轉的實現一般會有幾種實現方式: META