手工php注入詳解,php引入

本文目錄一覽:

PHP中什麼是依賴注入

依賴注入可能是我所知道的最簡單設計模式之一,很多情況下可能你無意識中已經使用了依賴注入。不過它也是最難解釋的一個。我認為有一部分原因是由於大多數介紹依賴注入的例子缺乏實際意義,讓人難理解。因為PHP主要用於Web開發,那就先來看一個簡單的web開發實例。

HTTP本身是一個無狀態的連接協議,為了支持客戶在發起WEB請求時應用程序能存儲用戶信息,我們就需要通過一種技術來實現存儲狀態交互。理所當然最簡單的是使用cookie,更好的方式是PHP內置的Session機制。

$_SESSION[‘language’] = ‘fr’;

上面代碼將用戶語言存儲在了名為language的Session變數中,因此在該用戶隨後的請求中,可以通過全局數組$_SESSION來獲取language:

$user_language = $_SESSION[‘language’];

依賴注入主要用於面向對像開發,現在讓我們假設我們有一個SessionStorage類,該類封裝了PHP Session機制:

class SessionStorage

{

function __construct($cookieName = ‘PHP_SESS_ID’)

{

session_name($cookieName);

session_start();

}

function set($key, $value)

{

$_SESSION[$key] = $value;

}

function get($key)

{

return $_SESSION[$key];

}

// …

}

同時還有一個User類提供了更高級的封裝:

class User

{

protected $storage;

function __construct()

{

$this-storage = new SessionStorage();

}

function setLanguage($language)

{

$this-storage-set(‘language’, $language);

}

function getLanguage()

{

return $this-storage-get(‘language’);

}

// …

}

代碼很簡單,同樣使用User類也很簡單:

$user = new User();

$user-setLanguage(‘fr’);

$user_language = $user-getLanguage();

一切都很美好,除非你的程序需要更好的擴展性。假設現在你想要更改保存session_id的COOKIE鍵值,以下有一些可供選擇的方法:

User類中創建SessionStorage實例時,在SessionStorage構造方法中使用字元串』SESSION_ID』硬編碼:

class User

{

function __construct()

{

$this-storage = new SessionStorage(‘SESSION_ID’);

}

// …

}

在User類外部設置一個常量(名為STORAGE_SESSION_NAME)

class User

{

function __construct()

{

$this-storage = new SessionStorage(STORAGE_SESSION_NAME);

}

// …

}

define(‘STORAGE_SESSION_NAME’, ‘SESSION_ID’);

通過User類構造函數中的參數傳遞Session name

class User

{

function __construct($sessionName)

{

$this-storage = new SessionStorage($sessionName);

}

// …

}

$user = new User(‘SESSION_ID’);

還是通過User類構造函數中的參數傳遞Session name,不過這次參數採用數組的方式

class User

{

function __construct($storageOptions)

{

$this-storage = new SessionStorage($storageOptions[‘session_name’]);

}

// …

}

$user = new User(array(‘session_name’ = ‘SESSION_ID’));

上面的方式都很糟糕。

在user類中硬編碼設置session name的做法沒有真正解決問題,如果以後你還需要更改保存session_id的COOKIE鍵值,你不得不再一次修改user類(User類不應該關心COOKIE鍵值)。

使用常量的方式同樣很糟,造成User類依賴於一個常量設置。

通過User類構造函數的參數或數組來傳遞session name相對來說好一些,不過也不完美,這樣做干擾了User類構造函數的參數,因為如何存儲Session並不是User類需要關心的,User類不應該和它們扯上關聯。

另外,還有一個問題不太好解決:我們如何改變SessionStorage類。這種應用場景很多,比如你要用一個Session模擬類來做測試,或者你要將Session存儲在資料庫或者內存中。目前這種實現方式,在不改變User類的情況下,很難做到這點。

現在,讓我們來使用依賴注入。回憶一下,之前我們是在User類內部創建SessionStorage對像的,現在我們修改一下,讓SessionStorage對像通過User類的構造函數傳遞進去。

class User

{

function __construct($storage)

{

$this-storage = $storage;

}

// …

這就是依賴注入最經典的案例,沒有之一。現在使用User類有一些小小的改變,首先你需要創建SessionStorage對像。

$storage = new SessionStorage(‘SESSION_ID’);

$user = new User($storage);

現在,配置session存儲對像很簡單了,同樣如果改變session存儲對像也很簡單,所有這一切並不需要去更新User類,降低了業務類之間的耦合。

Pico Container 的網站上是這樣描述依賴注入:

依賴注入是通過類的構造函數、方法、或者直接寫入的方式,將所依賴的組件傳遞給類的方式。

所以依賴注入並不只限於通過構造函數注入。下面來看看幾種注入方式:

構造函數注入

class User

{

function __construct($storage)

{

$this-storage = $storage;

}

// …

}

setter方法注入

class User

{

function setSessionStorage($storage)

{

$this-storage = $storage;

}

// …

}

屬性直接注入

class User

{

public $sessionStorage;

}

$user-sessionStorage = $storage;

根據經驗,一般通過構造函數注入的是強依賴關係的組件,setter方式用來注入可選的依賴組件。

現在,大多數流行的PHP框架都採用了依賴注入的模式實現業務組件間的高內聚低耦合。

// symfony: 構造函數注入的例子

$dispatcher = new sfEventDispatcher();

$storage = new sfMySQLSessionStorage(array(‘database’ = ‘session’, ‘db_table’ = ‘session’));

$user = new sfUser($dispatcher, $storage, array(‘default_culture’ = ‘en’));

// Zend Framework: setter方式注入的例子

$transport = new Zend_Mail_Transport_Smtp(‘smtp.gmail.com’, array(

‘auth’ = ‘login’,

‘username’ = ‘foo’,

‘password’ = ‘bar’,

‘ssl’ = ‘ssl’,

‘port’ = 465,

));

$mailer = new Zend_Mail();

$mailer-setDefaultTransport($transport);

php手工注入怎麼查詢欄位長度

暴欄位長度命令如下

Order by num/*

另完整的手工注入過程如下:

首先要做的是在判斷好欄位數後,爆破用戶信息,注入的過程中如果當前資料庫連接用戶為root或者具有root許可權就可以嘗試使用loadfile()這個函數來讀取文件。

一、在linux下我們可以讀取/etc/passwd和/etc/shadow來暴力破解linux密碼

二、在windows下我們可以讀取一些常見的文件以及敏感的地方比如serv-u的配置文件my.ini等等,然後就是一一破解欄位和欄位內容即可。

第二種情況通過version()函數得知mysql版本在5.0以上,那麼可以使用mysql自帶的information_schema這個資料庫來查詢所有的表,然後也是一一破解欄位和欄位內容即可。

最不好的情況(目前很少了)就是許可權不是root,資料庫版本過低,那麼所有的表,欄位都是要自己猜解的,沒有工具的情況下,會讓工作量加大幾十倍,還不一定能猜到,讓人汗顏。

所以有工具還是很方便的。

如何注入 php

去後盾人找視頻,上面視頻都是牛人老師錄製,含金量高,可以解答你問題

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/298164.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-28 12:17
下一篇 2024-12-28 12:17

相關推薦

  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • PHP怎麼接幣

    想要在自己的網站或應用中接受比特幣等加密貨幣的支付,就需要對該加密貨幣擁有一定的了解,並使用對應的API進行開發。本文將從多個方面詳細闡述如何使用PHP接受加密貨幣的支付。 一、環…

    編程 2025-04-29
  • 使用PHP foreach遍歷有相同屬性的值

    本篇文章將介紹如何使用PHP foreach遍歷具有相同屬性的值,並給出相應的代碼示例。 一、基礎概念 在講解如何使用PHP foreach遍歷有相同屬性的值之前,我們需要先了解幾…

    編程 2025-04-28
  • PHP獲取301跳轉後的地址

    本文將為大家介紹如何使用PHP獲取301跳轉後的地址。301重定向是什麼呢?當我們訪問一個網頁A,但是它已經被遷移到了另一個地址B,此時若伺服器端做了301重定向,那麼你的瀏覽器在…

    編程 2025-04-27
  • PHP登錄頁面代碼實現

    本文將從多個方面詳細闡述如何使用PHP編寫一個簡單的登錄頁面。 1. PHP登錄頁面基本架構 在PHP登錄頁面中,需要包含HTML表單,用戶在表單中輸入賬號密碼等信息,提交表單後服…

    編程 2025-04-27
  • PHP與Python的比較

    本文將會對PHP與Python進行比較和對比分析,包括語法特性、優缺點等方面。幫助讀者更好地理解和使用這兩種語言。 一、語法特性 PHP語法特性: <?php // 簡單的P…

    編程 2025-04-27
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁碟中。在執行sync之前,所有的文件系統更新將不會立即寫入磁碟,而是先緩存在內存…

    編程 2025-04-25
  • 神經網路代碼詳解

    神經網路作為一種人工智慧技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網路的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網路模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性感測器,能夠同時測量加速度和角速度。它由三個感測器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25

發表回復

登錄後才能評論