當前位置:首頁 » 編程語言 » php注入類

php注入類

發布時間: 2025-07-15 22:13:28

A. 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);

B. php防止sql注入示例分析和幾種常見攻擊正則

1. 函數 `customError` 用於處理錯誤,將自定義錯誤輸出並停止腳本執行。
2. 設置了錯誤處理函數 `customError`,它將捕捉並處理 E_ERROR 級別的錯誤。
3. `$getfilter`、`$postfilter` 和 `$cookiefilter` 變數定義了正則表達式模式,用於檢測惡意的 SQL 注入嘗試。
4. 函數 `StopAttack` 用於阻止潛在的 SQL 注入攻擊。它檢查通過 GET、POST 和 COOKIE 傳遞的參數。
5. 如果 `$_REQUEST['securityToken']` 未設置,且參數值與定義的模式匹配,`StopAttack` 函數將記錄攻擊日誌並終止腳本執行。
6. `slog` 函數用於記錄日誌,將日誌信息追加到 `log.htm` 文件中。
注意:這段代碼雖然是為了防止 SQL 注入而設計的,但它使用了正則表達式來過濾參數,這可能會對合法輸入造成誤攔截。在實際應用中,更推薦使用參數化查詢和准備語句來防止 SQL 注入。

C. Thinkphp3.2.3 SQL注入總結

針對ThinkPHP3.2.3版本的SQL注入總結,首先確保資料庫配置正確,使用預定義的資料庫如sqllabs的資料庫。

構建一個查詢入口,如在Application/Home/Controller/IndexController.class.php文件中,使用sqllabs的users表。ThinkPHP內置了大寫函數,對SQL注入進行檢測。

常規注入方法如'1' or '1'='1'#在實際應用中無法實現,因為id欄位的處理流程涉及多個步驟,包括進入D方法、實例化模型、I方法獲取參數等。在I方法中,傳遞的參數被htmlspecialchars過濾,然後進入find方法,進一步處理為數組,避免了直接轉換為整型的可能。

對於int型欄位的注入嘗試失敗,因為數據被正確地處理為整型。而將欄位改為varchar類型後,注入嘗試仍然失敗,原因在於即使在數組注入下,通過htmlspecialchars的轉義機制也阻止了注入的實現。

數組繞過嘗試通過?id[where]=1,實現繞過常規參數處理,然而在ThinkPHP的過濾機制下,這種方式並不適用,因為參數處理過程相對簡單,不需要復雜的繞過策略。

EXP注入利用了where參數,繞過了I方法的過濾,直接將注入payload傳遞給find方法。在處理過程中,繞開了int型的intval轉換,使用數組直接賦值給where,進而執行SQL注入。

BIND注入則通過save方法和bindParam函數,繞過了數據的類型轉換,直接將payload綁定到查詢中,實現了注入的執行。

總結,ThinkPHP3.2.3版本的SQL注入涉及到多個步驟和安全檢查,通過理解每個步驟的處理方式,可以識別和繞過注入嘗試,但實際應用中,ThinkPHP的過濾機制和參數處理邏輯設計使得常規的SQL注入變得困難。

D. php如何防止sql注入攻擊

注入式攻擊的類型

可能存在許多不同類型的攻擊動機,但是乍看上去,似乎仿橡存在更多的類型。這是非常真實的-如果惡意用戶發現了一個能夠執行多個查詢的辦法的話。本文後面,我們會對此作詳細討論。

果你的腳本正在執行一個SELECT指令,那麼,攻擊者可以強迫顯示一個表格中的每一行記錄-通過把一個例如 =1這樣的條件注態大頌入到WHERE子句中,如下所示(其中,注入部分以粗體顯示):

SELECT*FROMsitesWHEREsite='html580.com'OR1=1;'

正如我們在前面所討論的,這本身可能是很有用的信息,因為它揭示了該表格的一般結構(這是一條普通的記錄所不能實現的),以及潛在地顯示包含機密信息的記錄。

一條更新指令潛在地具有更直接的威脅。通過把其它屬性放到SET子句中,一名攻擊者可以修改當前被更新的記錄中的任何欄位,例如下面的例子(其中,注入部分以粗體顯示):

UPDATEsitesSETsite='diygw.com'WHERE=

site='html580.com'

通過把一個例如1=1這樣的恆真條件添加到一條更新指令的WHERE子句中,帆鄭這種修改范圍可以擴展到每一條記錄,例如下面的例子:

UPDATEsitesSETsite='diygw.com'WHERE=

site='html580.comOR1=1;'

最危險的指令可能是DELETE-這是不難想像的。其注入技術與我們已經看到的相同-通過修改WHERE子句來擴展受影響的記錄的范圍,例如下面的例子:

DELETEFROMsitesSETsite='diygw.com'WHERE=

site='html580.comOR1=1;

E. ThinkPHP 3.2.0 的注入漏洞,如何在這個程序利用

Thinkphp裡面的where方法是具有過濾作團肆冊用的,也就是說你這里想通過openid參數去注入是失敗的。因為where方法對傳入的參雹做數進行了轉義。具體可塌宏以去看下源碼

F. PHP網站怎麼sql注入有沒有破解防禦的方法

網站的運行安全肯定是每個站長必須考慮的問題,大家知道,大多數黑客攻擊網站都是採用sql注入,這就是我們常說的為什麼最原始的靜態的網站反而是最安全的。 今天我們講講PHP注入的安全規范,防止自己的網站被sql注入。
如今主流的網站開發語言還是php,那我們就從php網站如何防止sql注入開始說起:
Php注入的安全防範通過上面的過程,我們可以了解到php注入的原理和手法,當然我們也同樣可以制定出相應該的防範方法:
首先是對伺服器的安全設置,這里主要是php+mysql的安全設置和linux主機的安全設置。對php+mysql注射的防範,首先將magic_quotes_gpc設置為On,display_errors設置為Off,如果id型,我們利用intval()將其轉換成整數類型,如代碼:
$id=intval($id);
mysql_query=」select *from example where articieid=』$id』」;或者這樣寫:mysql_query(」SELECT * FROM article WHERE articleid=」.intval($id).」")
如果是字元型就用addslashes()過濾一下,然後再過濾」%」和」_」如:
$search=addslashes($search);
$search=str_replace(「_」,」\_」,$search);
$search=str_replace(「%」,」\%」,$search);
當然也可以加php通用防注入代碼:
/*************************
PHP通用防注入安全代碼
說明:
判斷傳遞的變數中是否含有非法字元
如$_POST、$_GET
功能:
防注入
**************************/
//要過濾的非法字元
$ArrFiltrate=array(」『」,」;」,」union」);
//出錯後要跳轉的url,不填則默認前一頁
$StrGoUrl=」";
//是否存在數組中的值
function FunStringExist($StrFiltrate,$ArrFiltrate){
foreach ($ArrFiltrate as $key=>$value){
if (eregi($value,$StrFiltrate)){
return true;
}
}
return false;
}
//合並$_POST 和 $_GET
if(function_exists(array_merge)){
$ArrPostAndGet=array_merge($HTTP_POST_VARS,$HTTP_GET_VARS);
}else{
foreach($HTTP_POST_VARS as $key=>$value){
$ArrPostAndGet[]=$value;
}
foreach($HTTP_GET_VARS as $key=>$value){
$ArrPostAndGet[]=$value;
}
}
//驗證開始
foreach($ArrPostAndGet as $key=>$value){
if (FunStringExist($value,$ArrFiltrate)){
echo 「alert(/」Neeao提示,非法字元/」);」;
if (empty($StrGoUrl)){
echo 「history.go(-1);」;
}else{
echo 「window.location=/」".$StrGoUrl.」/」;」;
}
exit;
}
}
?>
/*************************
保存為checkpostandget.php
然後在每個php文件前加include(「checkpostandget.php「);即可
**************************/
另外將管理員用戶名和密碼都採取md5加密,這樣就能有效地防止了php的注入。
還有伺服器和mysql也要加強一些安全防範。
對於linux伺服器的安全設置:
加密口令,使用「/usr/sbin/authconfig」工具打開密碼的shadow功能,對password進行加密。
禁止訪問重要文件,進入linux命令界面,在提示符下輸入:
#chmod 600 /etc/inetd.conf //改變文件屬性為600
#chattr +I /etc/inetd.conf //保證文件屬主為root
#chattr –I /etc/inetd.conf // 對該文件的改變做限制
禁止任何用戶通過su命令改變為root用戶
在su配置文件即/etc/pam.d/目錄下的開頭添加下面兩行:
Auth sufficient /lib/security/pam_rootok.so debug
Auth required /lib/security/pam_whell.so group=wheel
刪除所有的特殊帳戶
#userdel lp等等 刪除用戶
#groupdel lp等等 刪除組
禁止不使用的suid/sgid程序
#find / -type f \(-perm -04000 - o –perm -02000 \) \-execls –lg {} \;

G. 【PHP】依賴注入(DI)和控制反轉(IOC)詳解

依賴注入與控制反轉在技術領域常被提及,實際是同一種設計模式,旨在減少組件間的耦合度。下面以PHP為視角,深入解析依賴注入概念。

想像我們有一個類需要使用資料庫連接,最原始方法是將資料庫類文件包含在構造函數中,通過新實例化db類並傳入連接信息,之後調用資料庫操作。這看似實現功能,但問題隨之而來:隨著越來越多類需用到db組件,修改代碼時若資料庫信息變動,將不得不回頭修改所有類文件。

為解決此問題,引入了工廠模式。通過創建工廠方法,利用Factory::getDb()方法獲取db組件實例。雖然此法減少了與db類的直接耦合,但與Factory工廠類形成新耦合。若Factory方法改名或需變更,同樣會帶來問題。

為避免此類問題,引入依賴注入概念。其核心在於將依賴作為參數傳遞給類而非內部創建,從而解耦外部類。例如,通過外部調用example類的setDb方法注入連接實例。如此,example無需關注db連接生成細節,實現維護性提升。

進一步,假設example類還需要其他外部類,通過依賴注入解決。引入容器概念,用於存放可能用到的各種類實例。通過容器設置實例,無需多次調用setXXX方法,簡化代碼。容器可實現單例模式,確保實例化效率與內存管理。

整合上述概念,引入Di類作為容器,通過構造函數傳入Di,設置所需實例。在example中通過Di獲取實例,實現依賴注入的簡化與自動化。Di類可自定義構造方式,如通過回調函數設置實例,避免立即實例化,直到真正需要時才執行。這樣,只需全局聲明Di類,所有依賴注入的類放置其中,構造函數接收Di容器作為參數,即可在example內部獲取所需實例,實現高效、靈活的依賴注入機制。

熱點內容
小米4清除緩存 發布:2025-07-16 03:03:17 瀏覽:562
如何緩解壓力英語作文 發布:2025-07-16 03:03:15 瀏覽:14
手機視頻怎麼緩存 發布:2025-07-16 02:59:05 瀏覽:932
安卓手機設備在哪裡找 發布:2025-07-16 02:49:28 瀏覽:356
php建立數組 發布:2025-07-16 02:34:30 瀏覽:284
oracle存儲過程同步 發布:2025-07-16 02:29:18 瀏覽:941
歐諾s買哪個配置的好 發布:2025-07-16 02:26:22 瀏覽:559
熱點可以建立ftp嗎 發布:2025-07-16 02:26:21 瀏覽:304
如何選擇最佳配置 發布:2025-07-16 01:56:44 瀏覽:604
mad加密 發布:2025-07-16 01:52:12 瀏覽:425