bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

php注入修改數據 php修改mysql數據

php防sql注入的代碼

一、 注入式攻擊的類型

成都網站設計、成都網站建設、外貿網站建設服務團隊是一支充滿著熱情的團隊,執著、敏銳、追求更好,是創新互聯的標準與要求,同時竭誠為客戶提供服務是我們的理念。創新互聯把每個網站當做一個產品來開發,精雕細琢,追求一名工匠心中的細致,我們更用心!

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

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

SELECT * FROM wines WHERE variety = ’lagrein’ OR 1=1;’

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

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

UPDATE wines SET type=’red’,’vintage’=’9999’ WHERE variety = ’lagrein’

通過把一個例如1=1這樣的恒真條件添加到一條更新指令的WHERE子句中,這種修改范圍可以擴展到每一條記錄,例如下面的例子(其中,注入部分以粗體顯示):

UPDATE wines SET type=’red’,’vintage’=’9999 WHERE variety = ’lagrein’ OR 1=1;’

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

DELETE FROM wines WHERE variety = ’lagrein’ OR 1=1;’

二、 多個查詢注入

多個查詢注入將會加劇一個攻擊者可能引起的潛在的損壞-通過允許多條破壞性指令包括在一個查詢中。在使用MySQL數據庫時, 攻擊者通過把一個出乎意料之外的終止符插入到查詢中即可很容易實現這一點-此時一個注入的引號(單引號或雙引號)標記期望變量的結尾;然后使用一個分號終 止該指令。現在,一個另外的攻擊指令可能被添加到現在終止的原始指令的結尾。最終的破壞性查詢可能看起來如下所示:

SELECT * FROM wines WHERE variety = ’lagrein’;

GRANT ALL ON *.* TO ’BadGuy@%’ IDENTIFIED BY ’gotcha’;’

這個注入將創建一個新的用戶BadGuy并賦予其網絡特權(在所有的表格上具有所有的特權);其中,還有一個"不祥"的口令被加入到這個簡單的SELECT語句中。如果你遵循我們在以前文章中的建議-嚴格限制該過程用戶的特權,那么,這應該無法工作,因為web服務器守護程序不再擁有你撤回的GRANT特權。但是從理論上講,這樣的一個攻擊可能給予BadGuy自由權力來實現他對你的數據庫的任何操作。

至 于這樣的一個多查詢是否會被MySQL服務器處理,結論并不唯一。這其中的一些原因可能是由于不同版本的MySQL所致,但是大多數情況卻是由于多查詢存 在的方式所致。MySQL的監視程序完全允許這樣的一個查詢。常用的MySQL GUI-phpMyAdmin,在最終查詢之前會復制出以前所有的內容,并且僅僅這樣做。

但是,大多數的在一個注入上下文中的多查詢都是由PHP的mysql 擴展負責管理的。幸好,默認情況下,它是不允許在一個查詢中執行多個指令的;試圖執行兩個指令(例如上面所示的注入)將會簡單地導致失敗-不設置任何錯 誤,并且沒有生成任何輸出信息。在這種情況下,盡管PHP也只是"規規矩矩"地實現其缺省行為,但是確實能夠保護你免于大多數簡單的注入式攻擊。

PHP5中的新的mysqli擴展(參考),就象mysql一樣,內在地也不支持多個查詢,不過卻提供了一個mysqli_multi_query()函數以支持你實現多查詢-如果你確實想這樣做的話。

然而,對于SQLite-與PHP5綁定到一起的可嵌入的SQL數據庫引擎(參考和) 情況更為可怕,由于其易于使用而吸引了大量用戶的關注。在有些情況下,SQLite缺省地允許這樣的多指令查詢,因為該數據庫可以優化批查詢,特別是非常 有效的批INSERT語句處理。然而,如果查詢的結果為你的腳本所使用的話(例如在使用一個SELECT語句檢索記錄的情況下), sqlite_query()函數卻不會允許執行多個查詢。三、 INVISION Power BOARD SQL注入脆弱性

Invision Power Board是一個著名的論壇系統。2005年五月6號,在登錄代碼中發現了一處SQL注入脆弱性。其發現

者為GulfTech Security Research的James Bercegay。

這個登錄查詢如下所示:

$DB-query("SELECT * FROM ibf_members WHERE id=$mid AND password=’$pid’");

其中,成員ID變量$mid和口令ID變量$pid被使用下面兩行代碼從my_cookie()函數中檢索出:

$mid = intval($std-my_getcookie(’member_id’));

$pid = $std-my_getcookie(’pass_hash’);

在此,my_cookie()函數使用下列語句從cookie中檢索要求的變量:

return urldecode($_COOKIE[$ibforums-vars[’cookie_id’].$name]);

【注意】從該cookie返回的值根本沒有被處理。盡管$mid在使用于查詢之前被強制轉換成一個整數,但是$pid卻保持不變。因此,它很容易遭受我們前面所討論的注入類型的攻擊。

因此,通過以如下方式修改my_cookie()函數,這種脆弱性就會暴露出來:

if ( ! in_array( $name,array(’topicsread’, ’forum_read’,’collapseprefs’) ) )

{

return $this-

clean_value(urldecode($_COOKIE[$ibforums-vars[’cookie_id’].$name]));

else

{

return urldecode($_COOKIE[$ibforums-vars[’cookie_id’].$name]);

}

經過這樣的改正之后,其中的關鍵變量在"通過"全局clean_value()函數后被返回,而其它變量卻未進行檢查。

現 在,既然我們大致了解了什么是SQL注入,它的注入原理以及這種注入的脆弱程度,那么接下來,讓我們探討如何有效地預防它。幸好,PHP為我們提供了豐富 的資源,因此我們有充分的信心預言,一個經仔細地徹底地使用我們所推薦的技術構建的應用程序將會從你的腳本中根本上消除任何可能性的SQL注入-通過在它 可能造成任何損壞之前"清理"你的用戶的數據來實現。

四、 界定你的查詢中的每一個值

我們推薦,你確保界定了你的查詢中的每一個值。字符串值首當其沖,以及那些你通常期望應該使用"單"(而不是"雙")引號的內容。一方面,如果你使用雙引 號來允許PHP在字符串內的變量替代,這樣可以使得輸入查詢更為容易些;另一方面,這(無可否認,只是極少量地)也會減少以后PHP代碼的分析工作。

下面,讓我們使用我們一開始使用的那個非注入式查詢來說明這個問題:

SELECT * FROM wines WHERE variety = ’lagrein’

或以PHP語句表達為:

$query = "SELECT * FROM wines WHERE variety = ’$variety’";

從技術上講,引號對于數字值來說是不需要使用的。但是,如果你并不介意用引號把例如葡萄酒這樣的一個域相應的一個值括起來并且如果你的用戶把一個空值輸入到你的表單中的話,那么,你會看到一個類似下面的查詢:

SELECT * FROM wines WHERE vintage =

當然,這個查詢從語法上講是無效的;但是,下面的語法卻是有效的:

SELECT * FROM wines WHERE vintage = ’’

第二個查詢將(大概)不會返回任何果,但是至少它不會返回一個錯誤消息。

五、 檢查用戶提交的值的類型

從前面的討論中我們看到,迄今為止,SQL注入的主要來源往往出在一個意料之外的表單入口上。然而,當你經由一個表單向用戶提供機會提交某些值時,你應該有相當的優勢來確

定 你想取得什么樣的輸入內容-這可以使得我們比較容易地檢查用戶入口的有效性。在以前的文章中,我們已經討論過這樣的校驗問題;所以,在此,我們僅簡單地總 結當時我們討論的要點。如果你正在期望一個數字,那么你可以使用下面這些技術之一來確保你得到的真正是一個數字類型:

?6?1 使用is_int()函數(或is_integer()或is_long())。

?6?1 使用gettype()函數。

?6?1 使用intval()函數。

?6?1 使用settype()函數。

為 了檢查用戶輸入內容的長度,你可以使用strlen()函數。為了檢查一個期望的時間或日期是否有效,你可以使用strtotime()函數。它幾乎一定 能夠確保一位用戶的入口中沒有包含分號字符(除非標點符號可以被合法地包括在內)。你可以借助于strpos()函數容易地實現這一點,如下所示:if( strpos( $variety, ’;’ ) ) exit ( "$variety is an invalid value for variety!" );

正如我們在前面所提到的,只要你仔細分析你的用戶輸入期望,那么,你應該能夠很容易地檢查出其中存在的許多問題。

六、 從你的查詢中濾去每一個可疑字符

盡管在以前的文章中,我們已經討論過如何過濾掉危險字符的問題;但是在此,還是讓我們再次簡單地強調并歸納一下這個問題:

?6?1 不要使用magic_quotes_gpc指令或它的"幕后搭擋"-addslashes()函數,此函數在應用程序開發中是被限制使用的,并且此函數還要求使用額外的步驟-使用stripslashes()函數。

?6?1 相比之下,mysql_real_escape_string()函數更為常用,但是也有它自己的缺點。

php怎么實例化有依賴注入的類

PHP依賴注入的理解。分享給大家供大家參考,具體如下:

看Laravel的IoC容器文檔只是介紹實例,但是沒有說原理,之前用MVC框架都沒有在意這個概念,無意中在phalcon的文檔中看到這個詳細的介紹,感覺豁然開朗,復制粘貼過來,主要是好久沒有寫東西了,現在確實很懶變得!

首先,我們假設,我們要開發一個組件命名為SomeComponent。這個組件中現在將要注入一個數據庫連接。

在這個例子中,數據庫連接在component中被創建,這種方法是不切實際的,這樣做的話,我們將不能改變數據庫連接參數及數據庫類型等一些參數。

class SomeComponent {

/**

* The instantiation of the connection is hardcoded inside

* the component so is difficult to replace it externally

* or change its behavior

*/

public function someDbTask()

{

$connection = new Connection(array(

"host" = "localhost",

"username" = "root",

"password" = "secret",

"dbname" = "invo"

));

// ...

}

}

$some = new SomeComponent();

$some-someDbTask();

為了解決上面所說的問題,我們需要在使用前創建一個外部連接,并注入到容器中。就目前而言,這看起來是一個很好的解決方案:

class SomeComponent {

protected $_connection;

/**

* Sets the connection externally

*/

public function setConnection($connection)

{

$this-_connection = $connection;

}

public function someDbTask()

{

$connection = $this-_connection;

// ...

}

}

$some = new SomeComponent();

//Create the connection

$connection = new Connection(array(

"host" = "localhost",

"username" = "root",

"password" = "secret",

"dbname" = "invo"

));

//Inject the connection in the component

$some-setConnection($connection);

$some-someDbTask();

現在我們來考慮一個問題,我們在應用程序中的不同地方使用此組件,將多次創建數據庫連接。使用一種類似全局注冊表的方式,從這獲得一個數據庫連接實例,而不是使用一次就創建一次。

class Registry

{

/**

* Returns the connection

*/

public static function getConnection()

{

return new Connection(array(

"host" = "localhost",

"username" = "root",

"password" = "secret",

"dbname" = "invo"

));

}

}

class SomeComponent

{

protected $_connection;

/**

* Sets the connection externally

*/

public function setConnection($connection){

$this-_connection = $connection;

}

public function someDbTask()

{

$connection = $this-_connection;

// ...

}

}

$some = new SomeComponent();

//Pass the connection defined in the registry

$some-setConnection(Registry::getConnection());

$some-someDbTask();

現在,讓我們來想像一下,我們必須在組件中實現兩個方法,首先需要創建一個新的數據庫連接,第二個總是獲得一個共享連接:

class Registry

{

protected static $_connection;

/**

* Creates a connection

*/

protected static function _createConnection()

{

return new Connection(array(

"host" = "localhost",

"username" = "root",

"password" = "secret",

"dbname" = "invo"

));

}

/**

* Creates a connection only once and returns it

*/

public static function getSharedConnection()

{

if (self::$_connection===null){

$connection = self::_createConnection();

self::$_connection = $connection;

}

return self::$_connection;

}

/**

* Always returns a new connection

*/

public static function getNewConnection()

{

return self::_createConnection();

}

}

class SomeComponent

{

protected $_connection;

/**

* Sets the connection externally

*/

public function setConnection($connection){

$this-_connection = $connection;

}

/**

* This method always needs the shared connection

*/

public function someDbTask()

{

$connection = $this-_connection;

// ...

}

/**

* This method always needs a new connection

*/

public function someOtherDbTask($connection)

{

}

}

$some = new SomeComponent();

//This injects the shared connection

$some-setConnection(Registry::getSharedConnection());

$some-someDbTask();

//Here, we always pass a new connection as parameter

$some-someOtherDbTask(Registry::getConnection());

到此為止,我們已經看到了如何使用依賴注入解決我們的問題。不是在代碼內部創建依賴關系,而是讓其作為一個參數傳遞,這使得我們的程序更容易維護,降低程序代碼的耦合度,實現一種松耦合。但是從長遠來看,這種形式的依賴注入也有一些缺點。

例如,如果組件中有較多的依賴關系,我們需要創建多個setter方法傳遞,或創建構造函數進行傳遞。另外,每次使用組件時,都需要創建依賴組件,使代碼維護不太易,我們編寫的代碼可能像這樣:

//Create the dependencies or retrieve them from the registry

$connection = new Connection();

$session = new Session();

$fileSystem = new FileSystem();

$filter = new Filter();

$selector = new Selector();

//Pass them as constructor parameters

$some = new SomeComponent($connection, $session, $fileSystem, $filter, $selector);

// ... or using setters

$some-setConnection($connection);

$some-setSession($session);

$some-setFileSystem($fileSystem);

$some-setFilter($filter);

$some-setSelector($selector);

我想,我們不得不在應用程序的許多地方創建這個對象。如果你不需要依賴的組件后,我們又要去代碼注入部分移除構造函數中的參數或者是setter方法。為了解決這個問題,我們再次返回去使用一個全局注冊表來創建組件。但是,在創建對象之前,它增加了一個新的抽象層:

class SomeComponent

{

// ...

/**

* Define a factory method to create SomeComponent instances injecting its dependencies

*/

public static function factory()

{

$connection = new Connection();

$session = new Session();

$fileSystem = new FileSystem();

$filter = new Filter();

$selector = new Selector();

return new self($connection, $session, $fileSystem, $filter, $selector);

}

}

這一刻,我們好像回到了問題的開始,我們正在創建組件內部的依賴,我們每次都在修改以及找尋一種解決問題的辦法,但這都不是很好的做法。

一種實用和優雅的來解決這些問題,是使用容器的依賴注入,像我們在前面看到的,容器作為全局注冊表,使用容器的依賴注入做為一種橋梁來解決依賴可以使我們的代碼耦合度更低,很好的降低了組件的復雜性:

class SomeComponent

{

protected $_di;

public function __construct($di)

{

$this-_di = $di;

}

public function someDbTask()

{

// Get the connection service

// Always returns a new connection

$connection = $this-_di-get('db');

}

public function someOtherDbTask()

{

// Get a shared connection service,

// this will return the same connection everytime

$connection = $this-_di-getShared('db');

//This method also requires a input filtering service

$filter = $this-_db-get('filter');

}

}

$di = new Phalcon\DI();

//Register a "db" service in the container

$di-set('db', function(){

return new Connection(array(

"host" = "localhost",

"username" = "root",

"password" = "secret",

"dbname" = "invo"

));

});

//Register a "filter" service in the container

$di-set('filter', function(){

return new Filter();

});

//Register a "session" service in the container

$di-set('session', function(){

return new Session();

});

//Pass the service container as unique parameter

$some = new SomeComponent($di);

$some-someTask();

現在,該組件只有訪問某種service的時候才需要它,如果它不需要,它甚至不初始化,以節約資源。該組件是高度解耦。他們的行為,或者說他們的任何其他方面都不會影響到組件本身。我們的實現辦法

Phalcon\DI 是一個實現了服務的依賴注入功能的組件,它本身也是一個容器。

由于Phalcon高度解耦,Phalcon\DI 是框架用來集成其他組件的必不可少的部分,開發人員也可以使用這個組件依賴注入和管理應用程序中不同類文件的實例。

基本上,這個組件實現了 Inversion of Control 模式。基于此,對象不再以構造函數接收參數或者使用setter的方式來實現注入,而是直接請求服務的依賴注入。這就大大降低了整體程序的復雜性,因為只有一個方法用以獲得所需要的一個組件的依賴關系。

此外,這種模式增強了代碼的可測試性,從而使它不容易出錯。

在容器中注冊服務

框架本身或開發人員都可以注冊服務。當一個組件A要求調用組件B(或它的類的一個實例),可以從容器中請求調用組件B,而不是創建組件B的一個實例。

這種工作方式為我們提供了許多優點:

我們可以更換一個組件,從他們本身或者第三方輕松創建。

在組件發布之前,我們可以充分的控制對象的初始化,并對對象進行各種設置。

我們可以使用統一的方式從組件得到一個結構化的全局實例

服務可以通過以下幾種方式注入到容器:

//Create the Dependency Injector Container

$di = new Phalcon\DI();

//By its class name

$di-set("request", 'Phalcon\Http\Request');

//Using an anonymous function, the instance will lazy loaded

$di-set("request", function(){

return new Phalcon\Http\Request();

});

//Registering directly an instance

$di-set("request", new Phalcon\Http\Request());

//Using an array definition

$di-set("request", array(

"className" = 'Phalcon\Http\Request'

));

在上面的例子中,當向框架請求訪問一個請求數據時,它將首先確定容器中是否存在這個”reqeust”名稱的服務。

容器會反回一個請求數據的實例,開發人員最終得到他們想要的組件。

在上面示例中的每一種方法都有優缺點,具體使用哪一種,由開發過程中的特定場景來決定的。

用一個字符串來設定一個服務非常簡單,但缺少靈活性。設置服務時,使用數組則提供了更多的靈活性,而且可以使用較復雜的代碼。lambda函數是兩者之間一個很好的平衡,但也可能導致更多的維護管理成本。

Phalcon\DI 提供服務的延遲加載。除非開發人員在注入服務的時候直接實例化一個對象,然后存存儲到容器中。在容器中,通過數組,字符串等方式存儲的服務都將被延遲加載,即只有在請求對象的時候才被初始化。

//Register a service "db" with a class name and its parameters

$di-set("db", array(

"className" = "Phalcon\Db\Adapter\Pdo\Mysql",

"parameters" = array(

"parameter" = array(

"host" = "localhost",

"username" = "root",

"password" = "secret",

"dbname" = "blog"

)

)

));

//Using an anonymous function

$di-set("db", function(){

return new Phalcon\Db\Adapter\Pdo\Mysql(array(

"host" = "localhost",

"username" = "root",

"password" = "secret",

"dbname" = "blog"

));

});

以上這兩種服務的注冊方式產生相同的結果。然后,通過數組定義的,在后面需要的時候,你可以修改服務參數:

$di-setParameter("db", 0, array(

"host" = "localhost",

"username" = "root",

"password" = "secret"

));

從容器中獲得服務的最簡單方式就是使用”get”方法,它將從容器中返回一個新的實例:

$request = $di-get("request");

或者通過下面這種魔術方法的形式調用:

$request = $di-getRequest();

Phalcon\DI 同時允許服務重用,為了得到一個已經實例化過的服務,可以使用 getShared() 方法的形式來獲得服務。

具體的 Phalcon\Http\Request 請求示例:

$request = $di-getShared("request");

參數還可以在請求的時候通過將一個數組參數傳遞給構造函數的方式:

$component = $di-get("MyComponent", array("some-parameter", "other"));

php過濾sql注入,新手

我在PHP4環境下寫了一個防SQL注入的代碼,經過實際使用在PHP5下也兼容,歡迎大家使用修改,使用。

代碼如下:

?php

/*

sqlin 防注入類

*/

class sqlin

{

//dowith_sql($value)

function dowith_sql($str)

{

$str = str_replace("and","",$str);

$str = str_replace("execute","",$str);

$str = str_replace("update","",$str);

$str = str_replace("count","",$str);

$str = str_replace("chr","",$str);

$str = str_replace("mid","",$str);

$str = str_replace("master","",$str);

$str = str_replace("truncate","",$str);

$str = str_replace("char","",$str);

$str = str_replace("declare","",$str);

$str = str_replace("select","",$str);

$str = str_replace("create","",$str);

$str = str_replace("delete","",$str);

$str = str_replace("insert","",$str);

$str = str_replace("'","",$str);

$str = str_replace(""","",$str);

$str = str_replace(" ","",$str);

$str = str_replace("or","",$str);

$str = str_replace("=","",$str);

$str = str_replace("%20","",$str);

//echo $str;

return $str;

}

//aticle()防SQL注入函數

function sqlin()

{

foreach ($_GET as $key=$value)

{

$_GET[$key]=$this-dowith_sql($value);

}

foreach ($_POST as $key=$value)

{

$_POST[$key]=$this-dowith_sql($value);

}

}

}

$dbsql=new sqlin();

?

===================================================================================

使用方式:

將以上代碼復制新建一個sqlin.php的文件,然后包含在有GET或者POST數據接收的頁面

原理:

將所有的SQL關鍵字替換為空.

php+mysql如何防止網頁刷新一次 就往數據庫注入數據一次

給你個例子,是用隨機數與session來解決的,請根據你的實際情況進行修改

?php

session_start();

//判斷是否刷新*********************

if(isset($_POST['mark'])) {

if($_POST['mark'] == $_SESSION['code']) {

// 處理該表單的語句。。。

}

else {

// 處理刷新時的語句。。。

}

}

//END******************************

$code = mt_rand(0,1000000);

$_SESSION['code'] = $code;

?

form name=form1 method="post"

input type="text" name="text" /

input type="submit" value="submit" /

input type="hidden" name="mark" value="?php echo $code;?"

/form

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

php5 注入

在PHP文件頭部這樣寫

if(get_magic_quotes_gpc())

{

foreach($_GET as $k = $v) $_GET[$k] = stripslashes($v);

}

文章標題:php注入修改數據 php修改mysql數據
文章分享:http://vcdvsql.cn/article34/hehjpe.html

成都網站建設公司_創新互聯,為您提供小程序開發營銷型網站建設網頁設計公司外貿網站建設定制開發

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都網站建設公司