網絡安全自學篇-PHP代碼審計(二)

一個網絡安全小白在學習過程中記錄下的筆記,希望在CSDN能和大家一起成長,學習,分享,進步,下面分享的是我搜集的一些關於字符串的各種函數,數組,類和正則,希望對入門代碼審計的朋友們有所幫助,大神有興趣看看即可,勿噴感謝,同時也歡迎各位師傅私聊交流學習。文章有所參考,也感謝教授我網安知識的師父們,感謝出生在這個互聯網時代,知識觸手可及。

認識函數

一、字符串操作函數
1、查找

//strchr()查找字符串在另一字符串中第一次出現的位置,並返回剩餘字符串
echo "strchr:Hello world!-->".strchr("Hello world!","world")."\n";
//stristr()查找字符串在另一字符串中第一次出現的位置,並返回剩餘字符串(大小寫不敏感)
echo "stristr:Hello world!-->".stristr("Hello world!","wo")."\n";
//strstr()在字符串中搜索指定字符,並返回字符串從指定字符第一次出現的位置開始的剩餘部分
echo "strstr:Hello world!-->".strstr("Hello world!","world")."\n";
//strpos()查找字符串在另一字符串中第一次出現的位置(大小寫敏感)
echo "strpos:Hello world!-->".strpos("Hello world!","wo")."\n";
//stripos()返回字符串在另一字符串中第一次出現的位置(大小寫不敏感)
echo "stripos:Hello world!-->".stripos("Hello world!","wo")."\n";
//strrpos()查找字符串在另一字符串中最後一次出現的位置(大小寫敏感)
echo "strrpos:Hello world!-->".strrpos("Hello world!","L")."\n";
//strripos()查找字符串在另一字符串中最後一次出現的位置(大小寫不敏感)
echo "strripos:Hello world!-->".strripos("Hello world!","l")."\n";
//strcspn()返回字符串在找到任何指定的字符之前的字符數量
echo "strcspn:Hello world!-->".strcspn("Hello world!","w")."\n";
//strpbrk()在字符串中搜索指定字符,並返回字符串從指定字符第一次出現的位置開始的剩餘部分
echo "strpbrk:Hello world!-->".strpbrk("Hello world!","oe")."\n";
//str_word_count()計算字符串中的單詞數
echo "str_word_count:Hello world!-->".str_word_count("Hello world!")."\n";

2、截取

//chop()從字符串右端刪除字符,注意是右端
echo "chop:Hello world!-->".chop("Hello world!","world!")."\n";
//trim()移除字符串兩側的指定字符
echo "trim:Hello world!-->".trim(" Hello world! "," ")."\n";
//ltrim()從字符串左端刪除字符,注意是左端
echo "ltrim:Hello world!-->".ltrim("Hello world!","Hello")."\n";
//ltrim()從字符串右端刪除字符,注意是右端
echo "rtrim:Hello world!-->".rtrim("Hello world!","world!")."\n";
//ord()返回字符串中第一個字符的 ASCII 值
echo "ord:Hello world!-->".ord("Hello world!")."\n";
//strtok()把字符串分割爲更小的字符串
echo "strtok:Hello world!-->".strtok("Hello world!","w")."\n";
//substr()返回從指定位置開始的剩餘字符串
echo "substr:Hello world!-->".substr("Hello world!",6)."\n";
//mb_substr()返回中文字符串從指定位置開始的幾個字符串,中文佔3字節
echo "mb_substr:Hello world!-->".mb_substr("你好世界",0,6)."\n";

3、替換

//addcslashes()在指定字符前添加反斜槓
echo "addcslashes:Hello world!-->".addcslashes("Hello world!","w")."\n";
//addslashes() 在預定義的字符前添加反斜槓的字符串,如',",\,NULL
echo "addslashes:Hello world!-->".addslashes('Hello \ "world!"')."\n";
//bin2hex() 轉換爲十六進制值
echo "bin2hex:Hello world!-->".bin2hex("Hello world!")."\n";
//hex2bin() 把十六進制值轉換爲 ASCII 字符
echo "hex2bin:48656c6c6f20576f726c6421-->".hex2bin("48656c6c6f20576f726c6421")."\n";
//chr()從指定 ASCII 值返回字符
echo "chr:Hello world!-->".chr("52")."\n";
//convert_cyr_string()把字符串由一種字符集轉換成另一種
//k - koi8-r,
//w - windows-1251
//i - iso8859-5
//a - x-cp866
//d - x-cp866
//m - x-mac-cyrillic
echo "convert_cyr_string:Hello world! æøå-->".convert_cyr_string("Hello world! æøå",'w','a')."\n";
//convert_uudecode()對 uuencode 編碼的字符串進行解碼
echo "convert_uudecode:,2&5L;&\@=V]R;&0A
-->".convert_uudecode(",2&5L;&\@=V]R;&0A
")."\n";
//htmlspecialchars ()輸出 htmlspecialchars 函數使用的翻譯表
print_r(get_html_translation_table());
//htmlentities()把一些字符轉換爲 HTML 實體
echo "htmlentities:<© W3CSçh°°¦§>-->".htmlentities("<© W3CSçh°°¦§>")."\n";
//html_entity_decode()把html實體轉換爲字符
echo "html_entity_decode:&lt;&copy; W3CS&ccedil;h&deg;&deg;&brvbar;&sect;&gt;-->".html_entity_decode("&lt;&copy; W3CS&ccedil;h&deg;&deg;&brvbar;&sect;&gt;")."\n";
//htmlspecialchars()把一些預定義的字符轉換爲 HTML 實體
echo "htmlspecialchars:<b>Hello world!</b>-->".htmlspecialchars("<b>Hello world!</b>")."\n";
//htmlspecialchars_decode()把預定義的 HTML 實體 "&lt;"(小於)和 "&gt;"(大於)轉換爲字符
echo "htmlspecialchars_decode:&lt;b&gt;bold&lt;/b&gt;-->".htmlspecialchars_decode("&lt;b&gt;Hello world!&lt;/b&gt;")."\n";
//implode(),join()把數組元素組合爲一個字符串
echo "implode,join:'Hello','world!'-->".implode(" ",array('Hello','World!'))."\n";
//lcfirst()把字符串中的首字符轉換爲小寫
echo "lcfirst:Hello world!-->".lcfirst("Hello world!")."\n";
//md5()計算字符串的 MD5 散列
echo "md5:Hello world!-->".md5("Hello world!")."\n";
//計算字符串的 SHA-1 散列
echo "sha1:Hello world!-->".sha1("Hello world!")."\n";
//str_ireplace()替換字符串中的一些字符(大小寫不敏感)
echo "str_ireplace:Hello world!-->".str_ireplace("WORLD","JADORE","Hello world!")."\n";
//str_replace()替換字符串中的一些字符(大小寫敏感)
echo "str_replace:Hello world!-->".str_replace("WORLD","JADORE","Hello world!")."\n";
//str_rot13()對字符串執行 ROT13 編碼
echo "str_rot13:Hello world!-->".str_rot13("Hello world!")."\n";
//str_shuffle()隨機地打亂字符串中的所有字符
echo "str_shuffle:Hello world!-->".str_shuffle("Hello world!")."\n";
//stripcslashes()刪除由 addcslashes() 函數添加的反斜槓
echo "stripcslashes:\Hello world!-->".stripcslashes("\Hello world!")."\n";
//stripslashes()刪除由 addslashes() 函數添加的反斜槓
echo "stripslashes:\Hello world!-->".stripslashes("\Hello world!")."\n";
//strrev()反轉字符串
echo "strrev:Hello world!-->".strrev("Hello world!")."\n";
//strtr()轉換字符串中特定的字符
echo "strtr:Hello world!-->".strtr("Hello world!","lo","ae")."\n";
//substr_replace()把字符串的一部分替換爲另一個字符串
echo "substr_replace:Hello-->".substr_replace("Hello","world",0)."\n";
//ucfirst()把字符串中的首字符轉換爲大寫
echo "ucfirst:hello world!-->".ucfirst("hello world!")."\n";
//ucwords()把字符串中每個單詞的首字符轉換爲大寫
echo "ucwords:hello world!-->".ucfirst("hello world!")."\n";
//strtoupper()把字符串轉換爲大寫
echo "strtoupper:hello world!-->".strtoupper("hello world!")."\n";
//strtolower()把字符串轉換爲小寫
echo "strtolower:HELLO WORLD!-->".strtolower("HELLO WORLD!")."\n";

4、分割

//chunk_split()把字符串分割爲一連串更小的部分
echo "chunk_split:HELLO WORLD!-->".chunk_split("HELLO WORLD!",1,".")."\n";
//str_split()把字符串分割到數組中
echo "str_split:Hello world!-->";
print_r(str_split("Hello world!",3));
//explode()把字符串打散爲數組
echo "explode:Hello world!-->";
print_r(explode(" ","Hello world!"));
//strip_tags()剝去字符串中的 HTML 和 PHP 標籤
echo "strip_tags:<php> <b>Hello world!-->".strip_tags("<php> <b>Hello world!")."\n";

正則

一、最左原則(非貪婪模式):正則表達式總是從目標字符串的最左側開始,依次匹配,直到匹配到符合表達式要求的部分,或直到匹配目標字符串的結束
二、最長原則(貪婪模式):對於匹配到的目標字符串,正則表達式總是會匹配到符合正則表達式要求的最長的部分
首先從分隔符開始,常用包括/,#,~,用於表明一串正則的開始,如/a.*a/,當表達式有過多轉義字符時,建議先用
#,如url鏈接

preg_match("/https:\/\/.*com/","https://baidu.com",$match);
print_r($match);
preg_match("#https://.*com#","https://baidu.com",$match);
print_r($match);

\d匹配一個數字字符。等價於 [0-9]。
\D匹配一個非數字字符。等價於 [^0-9]。
\f匹配一個換頁符。等價於 \x0c 和 \cL。
\n匹配一個換行符。等價於 \x0a 和 \cJ。
\r匹配一個回車符。等價於 \x0d 和 \cM。
\s匹配任何空白字符,包括空格、製表符、換頁符等等。等價於 [ \f\n\r\t\v]。
\S匹配任何非空白字符。等價於 [^ \f\n\r\t\v]。
\t匹配一個製表符。等價於 \x09 和 \cI。
\v匹配一個垂直製表符。等價於 \x0b 和 \cK。
\w匹配包括下劃線的任何單詞字符。等價於’[A-Za-z0-9_]’。
\W匹配任何非單詞字符。等價於 ‘[^A-Za-z0-9_]’。
\xn匹配 n,其中 n 爲十六進制轉義值。十六進制轉義值必須爲確定的兩個數字長。例如,’\x41’ 匹配 “A”。’\x041’ 則等價於 ‘\x04’ & “1”。正則表達式中可以使用 ASCII 編碼。
\nm標識一個八進制轉義值或一個向後引用。如果 \nm 之前至少有 nm 個獲得子表達式,則 nm 爲向後引用。如果 \nm 之前至少有 n 個獲取,則 n 爲一個後跟文字 m 的向後引用。如果前面的條件都不滿足,若 n 和 m 均爲八進制數字 (0-7),則 • \nm 將匹配八進制轉義值 nm。
\nml如果 n 爲八進制數字 (0-3),且 m 和 l 均爲八進制數字 (0-7),則匹配八進制轉義值 nml。
\un十六進制數字表示的 Unicode 字符。例如, \u00A9 匹配版權符號(?)。
.匹配除 “\n” 之外的任何單個字符
匹配輸入字符串的開始位置。在字符域[]中表示取反,如’[\w]‘等於’\w’;而^\w表示以單詞字符開頭。
KaTeX parse error: Undefined control sequence: \w at position 16: 匹配輸入字符串的結束位置。例'\̲w̲‘表示以單詞字符結尾。
?匹配前面的子表達式零次或一次 等價於 {0,1},例如,“do(es)?” 可以匹配 “do” 或 “does”。
匹配前面的子表達式零次或多次,等價於{0,}。例如,zo 能匹配 “z” 、 “zo”、‘zoo’。
+匹配前面的子表達式一次或多次,等價於{1,}例如,‘zo+’ 能匹配 “zo” 以及 “zoo”。
{n}n 爲非負整數,匹配確定的n次。例如,‘o{2}’ 不能匹配 “Bob” 或‘Booob’,但是能匹配 “food” 中的兩個 o。
{n,}n 爲非負整數。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。‘o{1,}’ 等價於 ‘o+’。‘o{0,}’ 則等價於 ‘o*’。
{n,m}m和n均爲非負整數,其中n<= m。最少匹配n次且最多匹配m次。例如,“o{1,3}” 將匹配 “fooooood” 中的前三個 o。‘o{0,1}’ 等價於 ‘o?’。請注意在逗號和兩個數之間不能有空格。
[]字符集合(字符域)。匹配所包含的任意一個字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。
()匹配 ()內的內容 並獲取這一匹配。搭配\n(n爲大於1的整數),‘http://baidu.com’若表達式:'(\w+) (:)\/\/.*\1’則匹配‘http://baidu.comhttp',\1表示http。
(?:)匹配不獲取匹配結果,不進行存儲供以後使用。這在使用 “或” 字符 (|) 來組合一個模式的各個部分是很有用。例如, ‘industr(?:y|ies) 就是一個比 ‘industry|industries’ 更簡略的表達式。上面表達式若改爲'(?:\w+)(:)\/\/.*\1',則\1表示爲:
| x|y,匹配 x 或 y。例如,‘z|food’ 能匹配 “z” 或 “food”。’(z|f)ood’ 則匹配 “zood” 或 “food”。
[-] 字符範圍。匹配指定範圍內的任意字符。例如,’[a-z]’ 可以匹配 ‘a’ 到 ‘z’ 範圍內的任意小寫字母字符。
(?=pattern)正 向預查,在任何匹配 pattern 的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹 配不需要獲取供以後使用。例如,‘Windows (?=95|98|NT|2000)’ 能匹配 “Windows 2000” 中的 “Windows” ,但不能匹配 “Windows 3.1” 中的 “Windows”。預查不消耗字符,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹 配的搜索,而不是從包含預查的字符之後開始。
(?!pattern)負 向預查,在任何不匹配 pattern 的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不 需要獲取供以後使用。例如’Windows (?!95|98|NT|2000)’ 能匹配 “Windows 3.1” 中的 “Windows”,但不能匹配 “Windows 2000” 中的 “Windows”。預查不消耗字符,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜 索,而不是從包含預查的字符之後開始
有時候最後定界符會有一個字母,如‘/as.*/i’,那這個i又是什麼呢,這就是模式修正符;
i表示在和模式進行匹配進不區分大小寫
m將模式視爲多行,使用^和s使".",xe使pregreplace使()AZ表示任何一行都可以以正則表達式開始或結束 s如果沒有使用這個模式修正符號,元字符中的"."默認不能表示換行符號,將字符串視爲單行 x表示模式中的空白忽略不計 e正則表達式必須使用在preg_replace替換字符串的函數中時纔可以使用(講這個函數時再說) A以模式字符串開頭,相當於元字符^ Z以模式字符串結尾,相當於元字符
U正則表達式的特點:就是比較“貪婪”,使用該模式修正符可以取消貪婪模式
貪婪模式案例:

preg_match('/a.*d/','asddassdasd',$match);//最長
print_r($match);
preg_match('/a.*d/U','asddassdasd',$match);//最短
print_r($match);
//preg_match只匹配一次,preg_match_all會把所有符合的字符串都匹配出來,並且放置到matches二維數組中
preg_match_all("/a.*d/U","asddassdasd",$matchs);
print_r($matchs);

數組

$cars=array("Volvo","BMW","Toyota");
print_r($cars);
$arr=array(1,2,3,'a'=>4);
$arr['b']=5;//增
unset($arr['b']);//刪
$arr[2]=2;//改
print_r($arr);//查
//數組排序
//sort() - 對數組進行升序排列
//rsort() - 對數組進行降序排列
//asort() - 根據關聯數組的值,對數組進行升序排列
//ksort() - 根據關聯數組的鍵,對數組進行升序排列
//arsort() - 根據關聯數組的值,對數組進行降序排列
//krsort() - 根據關聯數組的鍵,對數組進行降序排列
//1.按照字母升序排列
$cars=array("Volvo","BMW","Toyota");
sort($cars);
print_r($cars);
//2.按照數字升序排列
$numbers=array(4,5,8,22,1,2);
sort($numbers);
print_r($numbers);
//3.按照字母降序排列
$cars=array("Volvo","BMW","Toyota");
sort($cars);
print_r($cars);
//4.按照數字降序排列
$numbers=array(4,5,8,22,1,2);
sort($numbers);
print_r($numbers);

類 − 定義了一件事物的抽象特點。類的定義包含了數據的形式以及對數據的操作。
對象 − 是類的實例。
成員變量 − 定義在類內部的變量。該變量的值對外是不可見的,但是可以通過成員函數訪問,在類被實例化爲對象後,該變量即可稱爲對象的屬性。
成員函數 − 定義在類的內部,可用於訪問對象的數據。
繼承 − 繼承性是子類自動共享父類數據結構和方法的機制,這是類之間的一種關係。在定義和實現一個類的時候,可以在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容作爲自己的內容,並加入若干新的內容。
父類 − 一個類被其他類繼承,可將該類稱爲父類,或基類,或超類。
子類 − 一個類繼承其他類稱爲子類,也可稱爲派生類。
多態 − 多態性是指相同的函數或方法可作用於多種類型的對象上並獲得不同的結果。不同的對象,收到同一消息可以產生不同的結果,這種現象稱爲多態性。
重載 − 簡單說,就是函數或者方法有同樣的名稱,但是參數列表不相同的情形,這樣的同名不同參數的函數或者方法之間,互相稱之爲重載函數或者方法。
抽象性 − 抽象性是指將具有一致的數據結構(屬性)和行爲(操作)的對象抽象成類。一個類就是這樣一種抽象,它反映了與應用有關的重要性質,而忽略其他一些無關內容。任何類的劃分都是主觀的,但必須與具體的應用有關。
封裝 − 封裝是指將現實世界中存在的某個客體的屬性與行爲綁定在一起,並放置在一個邏輯單元內。
構造函數 − 主要用來在創建對象時初始化對象, 即爲對象成員變量賦初始值,總與new運算符一起使用在創建對象的語句中。
析構函數 − 析構函數(destructor) 與構造函數相反,當對象結束其生命週期時(例如對象所在的函數已調用完畢),系統自動執行析構函數。析構函數往往用來做"清理善後" 的工作(例如在建立對象時用new開闢了一片內存空間,應在退出前在析構函數中用delete釋放)。

class Site {
    /*成員變量*/
    var $url;
    var $title;
    /*構造函數*/
    function __construct($par1, $par2)
    {
        $this->url = $par1;
        $this->title = $par2;
    }
    /*成員函數*/
    function setUrl($par) {
        $this->url = $par;
    }
    function getUrl() {
        echo $this->url . PHP_EOL;//PHP_EOL爲換行符
    }
    function setTitle($par) {
        $this->title = $par;
    }
    function getTitle() {
        echo $this->title . PHP_EOL;
    }
}
//構造函數
echo "添加了構造函數"."\n";
$yxzj1 = new Site('夜行字節','https://ityo.cn');
$zjmb1 = new Site('字節脈搏','https://zj.cn');
$jadore1 = new Site('我','https://jadore.cn');
//析構函數
echo "析構函數"."\n";
class MyDes {
    function __construct()
    {
        print "構造函數\n";
        $this->name = "我的銷燬類";
    }
    function __destruct()
    {
        print "銷燬".$this->name."\n";
    }
}
$obj = new MyDes();
echo "繼承"."\n";
class Child_Site extends Site {
    var $category;
    function setCate($par) {
        $this->category = $par;
    }
    function getCate() {
        echo $this->category . PHP_EOL;
    }
    /*方法重寫*/
    function getUrl()
    {
        echo $this->url . POP_EOL;
        return $this->url;
    }
    function getTitle()
    {
        echo $this->title . PHP_EOL;
        return $this->title;
    }
}
//訪問控制
//public(公有):公有的類成員可以在任何地方被訪問。
//protected(受保護):受保護的類成員則可以被其自身以及其子類和父類訪問。
//private(私有):私有的類成員則只能被其定義所在的類訪問。
class MyClass {
    public $public = 'Public';
    protected $protected = 'Protected';
    private $private = 'Private';
    function printHello() {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}
$obj1 = new MyClass();
echo $obj1->public;
//echo $obj1->protected;
//echo $obj1->private;
$obj1->printHello();
class MyClass2 extends MyClass {
    protected $protected = 'Protected2';
    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        //echo $this->private;
    }
}
$obj2 = new MyClass2();
echo $obj2->public; // 這行能被正常執行
//echo $obj2->private; // 未定義 private
//echo $obj2->protected; // 這行會產生一個致命錯誤
$obj2->printHello(); // 輸出 Public、Protected2 和 Undefined
echo "\n";
//聲明一個接口
interface iTemplate {
    public function setVariable($name,$var);
    public function getHtml($template);
}
//接口實現
class Template implements iTemplate {
    private $vars = array();
    public function setVariable($name, $var)
    {
        $this->vars[$name] = $var;
    }
    public function getHtml($template)
    {
        foreach ($this->vars as $name => $value) {
            $template = str_replace('{'.$name.'}',$value,$template);
        }
        return $template;
    }
}
class MyCl {
    const constant = '常量值';
    function showConstant() {
        echo self::constant.PHP_EOL;
    }
}
echo MyCl::constant.PHP_EOL;
$classname = "MyCl";
echo $classname::constant.PHP_EOL;
$class = new MyCl();
$class->showConstant();
echo $class::constant.PHP_EOL;
abstract class AbstractClass{
    //強制要求子類定義這些方法
    abstract protected function getValue();
    abstract protected function prefixValue($prefix);
    public function printOut() {
        print $this->getValue() . PHP_EOL;
    }
}
class ConcreteClass1 extends AbstractClass {
    protected function getValue() {
        return "ConcreteClass1";
    }
    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}
class ConcreteClass2 extends AbstractClass
{
    public function getValue() {
        return "ConcreteClass2";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass2";
    }
}
$class1 = new ConcreteClass1();
$class1->printOut();
echo $class1->prefixValue('FOO_').PHP_EOL;
$class2 = new ConcreteClass2();
$class2->printOut();
echo $class2->prefixValue('FOO_').PHP_EOL;
//Static 關鍵字
//聲明類屬性或方法爲 static(靜態),就可以不實例化類而直接訪問
class FOO {
    public static $my_static = 'foo';
    public function staticValue() {
        return self::$my_static;
    }
}
print FOO::$my_static . PHP_EOL;
$foo = new FOO();
print $foo->staticValue() . PHP_EOL;
//Final 關鍵字
//如果父類中的方法被聲明爲 final,則子類無法覆蓋該方法,如果一個類被聲明爲 final,則不能被繼承。
class BaseClass {
    function __construct()
    {
        print "BaseClass 類中構造方法" . PHP_EOL;
    }
}
class SubClass extends BaseClass {
    //繼承BaseClass類的構造方法
}
//調用BaseClass構造方法
$obj3 = new BaseClass();
//調用BaseClass、SubClass構造方法
$obj3 = new SubClass();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章