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

php注入教程

發布時間: 2022-09-22 04:31:53

㈠ 偽靜態php網站該如何注入滲透,求大神告知,解答下

thinkphp漏洞還是蠻多的~ 首先你要知道thinkphp的運行方法而不是盲目的去注入

比如Home/Login/index.html

Home/Login/index/ID/1

㈡ 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擴展(參考http://php.net/mysqli),就象mysql一樣,內在地也不支持多個查詢,不過卻提供了一個mysqli_multi_query()函數以支持你實現多查詢-如果你確實想這樣做的話。
然而,對於SQLite-與PHP5綁定到一起的可嵌入的SQL資料庫引擎(參考http://sqlite.org/和http://php.net/sqlite) 情況更為可怕,由於其易於使用而吸引了大量用戶的關注。在有些情況下,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教程(90.24G)網路網盤免費資源在線學習

鏈接: https://pan..com/s/1jK3nM2UxdXwTml7bL10POg

?pwd=g5gh 提取碼:g5gh

php教程(90.24G)

29.-react前後端分離(電影項目) 28.小程序(laravel教育系統) 27.公眾號開發 26.laravel框架 25.-sphinx+頁面靜態化 24.網站優化 23.MongoDB 22.Redis 21.Memcache緩存設計 20 Nginx伺服器集群 19.ThinkPHP5品優購商城 18 Restful 17.ThinkPHP5框架 16.VUE項目


㈣ PHP安裝以及教程

tomcat ?
據說tomcat配PHP效果不是很好..還是換apache吧....
apache嗎..反正幾乎是一路next就可以裝好了..不過你如果裝了IIS..就要注意埠問題..可能會有沖突..mysql也是.一路next,php嗎..我是這么樣的..
1.下載下來的php包解壓..文件夾最好直接命名成php.
2.將php.ini-recommended改名為php.ini(這個是php的配置文件).放到c:\windows下(不放這里好像會有問題)
3.php.ini設置:extension_dir = "c:\php\ext"設置成你的ext文件夾的目錄,去掉extension=php_mysql.dll前面的分號(載入mysql擴展).需要什麼擴展可以根據需要修改.
4.apache的設置:apache安裝目錄下的conf文件夾下.找到httpd.conf,DocumentRoot "d:/wwwroot"
這里是你的網站的目錄,
在最後添加
LoadMole php5_mole "c:/php/php5apache2_2.dll"(載入php模塊)
AddType application/x-httpd-php .php (可解析的php擴展名)
AddType application/x-httpd-php-source .phps (這個不記得了.反正肯定要的)

如果發現許可權不夠.找到這里
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
allow from all
options indexes
</Directory>
原來是deny from all改成allow from all.
最好打開apache的目錄顯示.
Options Indexes FollowSymLinks去掉前面的#,如果還不可以.就在上面的allow from all下面加上options indexes就OK了.
這是win下面的apache+php的配置..
mysql安裝比較簡單..我就不說了...
PHP的電子教程網上非常多..在這里也不可能給你貼出來吧..
還有關於框架..框架網上的教程也很多..網路一下吧..
著名的框架有zend Framework,cakephp,國產的fleaphp,thinkphp等等...

㈤ 在確定一個網站的admin.php文件存在SQL注入漏洞,可以被注入之後,應該如何進行注入操作

SQL 語句查詢他的資料庫管理員的帳號密碼,然後通過SQL更改他伺服器的系統設置 給自己開一個系統管理員的許可權 之後就可以遠程登入他的伺服器了 之後想干什麼 那就看你心情了 嘎嘎

㈥ php注入函數到底能不能注入

php 5.00 版本以上自帶防注入功能。
所謂的SQL(結構化查詢語言)注入,簡單來說就是利用SQL語句在外部對SQL資料庫進行查詢,更新等動作。

㈦ [php]這個注入函數怎麼用,放在哪裡

應該是調用,在頁面傳值進來時進行調用;

如:
$id = unsqlin("$_post['傳入框的名字']");

要是防SQL注入,其實可以使用mysql_escape_string()這個函數。方法和上面的一樣。

㈧ php依賴注入是在構造函數中注入嗎

PHP 依賴注入
tags: dependency injection,php
by Ryan on January 8, 2009
Dependency injection is the answer to more maintainable, testable, molar code.
依賴注入是對於要求更易維護,更易測試,更加模塊化的代碼的答案。
Every project has dependencies and the more complex the project is the more dependencies it will most likely have. The most common dependency in today』s web application is the database and chances are if it goes down the app will all together stop working. That is because the code is dependent on the database server… and that is perfectly fine. Not using a database server because it could one day crash is a bit ridiculous. Even though the dependency has its flaws, it still makes life for the code, and thus the developer, a lot easier.
每個項目都有依賴(外界提供的輸入), 項目越復雜,越需要更多的依賴。在現今的網路應用程序中,最常見的依賴是資料庫,其風險在於,一旦資料庫暫停運行,那麼整個程序也因此而停止運行。這是因為代碼依賴資料庫伺服器。。。這已足夠。因為資料庫伺服器有時會崩潰而棄用它是荒謬的。盡管依賴有其自身的瑕疵,它仍然使代碼,因而也使程序開發人員的生活更容易些。
The problem with most dependencies its the way that code handles and interacts with them, meaning, the problem is the code and not the dependency. If you are not using dependency injection, chances are your code looks something like this:
對於大多依賴而言,問題在於代碼如何處理它們及與它們交往。也就是說,問題是代碼本身而非依賴。如果你沒有使用依賴注入,有機會遇到下列代碼:
class Book {
publicfunction __construct(){
$registry = RegistrySingleton::getInstance();
$this->_databaseConnection=$registry->databaseConnection;
// or
global$databaseConnection;
$this->_databaseConnection=$databaseConnection;
}
}
The book object now is given full access to the database once it is constructed. That is good, the book needs to be able to talk to the database and pull data. The problem lies in the way the book gained its access. In order for the book to be able to talk to the database the code must have an outside variable named $databaseConnection, or worse, it must have a singleton pattern class (registry) object containing a record for a databaseConnection. If these don』t exist the book fails, making this code is far from molar.
現在對象book一旦建立,就已經完全連到資料庫。這沒什麼不好,book需要跟資料庫交談並取得數據。問題在於book取得其接入的方法。要使book能夠與資料庫交談,代碼必須有一個外來的變數$databaseConnect, 更糟糕的是,它必須有個singleton類型類(registry)的對象,其包含一個databaseConnection的記錄。如果這些不存在的話,book會無法運行,這就使得這些代碼遠遠不夠模塊化。
This raises the question, how exactly does the book get access to the database? This is where inversion of control comes in.
這就提出一個問題,到底book如何接入資料庫?這就是IoC出現的原因了。
In Hollywood a struggling actor does not call up Martin Scorsese and ask for a role in his next film. No, the opposite happens. Martin Scorsese calls up the broke actor and asks him to play the main character in his next movie. Objects are struggling actors, they do not get to pick the roles they play, the director needs to tell them what to do. Objects do not get to pick the outside systems they interact with, instead, the outside systems are given to the objects. Remember this as Inversion of Control: The Hollywood Way.
在好萊塢,一個瀕臨絕境的演員不會打電話給Martin Scoresese要求在他的下個影片中扮演一個角色。絕不會這樣,實際正相反。Martin Scorese 會打電話給這個困頓的演員並邀請他在下一部影片中扮演重要的角色。對象是掙扎中的演員,他們不會去撿自己所扮演的角色,導演需要告訴他們去做什麼。對象不會到它所接觸的外界挑選系統,相反,外界系統會被賦予對象。記住這就是IoC( Inversion of Control):好萊塢的做法。
This is how a developer tells his objects how to interact with outside dependencies:
如下是開發人員告訴他的對象如何與外界的依賴打交道:
class Book {

publicfunction __construct(){}

publicfunction setDatabaseConnection($databaseConnection){
$this->_databaseConnection=$databaseConnection;
}

}
$book=new Book();
$book->setDatabase($databaseConnection);
This code allows for the book class to be used in any web app. The Book is no longer dependent on anything other than the developer supplying a database shortly after object creation.這代碼允許這個book類能在任何的網頁程序中使用。此book不再依賴任何事項,除了程序開發者要在對象創建後立即要提供一個資料庫。
This is, at its finest, dependency injection. There are two common practices of injecting dependencies. The first being constructor injection and the second being setter injection. Constructor injection involves passing all of the dependencies as arguments when creating a new object. The code would look something like this:
這就是最佳方法—依賴注入。有兩種常用的依賴注入的方式。一種是 constructor (註:構造函數。這種譯法似乎並不恰當,類中此方法更多是用來對某些屬性進行初始化)注入,一種是setter 注入。Constructor注入涉及到將所有依賴作為參數,傳遞給新創建的對象。看起來像這樣:
$book=new Book($databaseConnection,$configFile);
The more dependencies an object has, the messier this construction becomes. There are other reasons why this is a bad approach, involving ideas around code reusability and constructors doing work.
對象的依賴越多,construction就會變得越雜亂。這里還有其他的原因為什麼這是一個壞方法,其涉及到包括代碼重用和constructors要做的工作。
This leaves us with other method of dependency injection, called setting injection, which involves creating a public method inside the object for the dependencies that need injection.
這就給我們留下其他的方法進行依賴注入,稱為設置注入,包含在需要注入依賴的對象里創建一個公共方法:
$book=new Book();
$book->setDatabase($databaseConnection);
$book->setConfigFile($configFile);
This is easy to follow, but it leads writing more and more code for your application. When a book object is created three lines of code are required. If we have to inject another dependency, a 4th line of code is now needed. This gets messy quickly.
這很容易實現,但是它會導致為您的程序寫大量代碼。當創建一個book對象時,需要三行代碼。如果我們必須注入另外的依賴時,必須增加第四行代碼。這很快變得一團糟。
The answer to this problem is a factory, which is class that is designed to create and then inject all the dependencies needed for an object. Here is an example:
此問題的對策是一個工廠factory,它是一個類,用來創建然後注入一個對象的所有依賴。舉例如下:
class Factory {

public static $_database;

public static function makeBook(){
$book=new Book();
$book->setDatabase(self::$_database);
// more injection...(更多注入)
return$book;
}
}
And then:
然後:
$book= Factory::makeBook();
All dependencies should be registered into the factory object ring run time. This object is now the gateway that all dependencies must pass through before they can interact with any classes. In other words, this is the dependency container.
所有的依賴在運行期間都應在此factory對象中注冊。它現在是大門,在依賴可以與任何對象打交道前,都必經此門。
The reason makeBook is a public static function is for ease of use and global access. When I started this article off I made a reference to the singleton pattern and global access being a poor choices of code. They are… for the most part. It is bad design when they control access, but it is perfectly ok when they control creation. The makeBook function is only a shortcut for creation. There is no dependency what-so-ever between the book class and the factory class. The factory class exists so we can contain our dependencies in one location and automatically inject those dependencies with one line of code creation.
makeBook作為一個靜態方法的原因是易用並且可以在全局得到。在本文開頭,我提出使用singleton類型和全局變數對代碼而言是一個糟糕的選擇。多數情形下,確實如此!當他們控制接入時,是一個差設計。但是在他們控制創建時,是一個不錯的選擇。makeBook方法僅僅是創建的一個捷徑。在book類和factory類之間,沒有任何依賴。由於factory類的存在,我們的依賴可以存放在一個地點,並且用一行創建代碼就可自動注入這些依賴。
The factory or container class removes all of the extra work of dependency injection.
此處的factory或者容器類移走了依賴注入的所有額外工作。
Before injection:
以前的注入:
$book=new Book();
And now:
目前的方法:
$book= Factory::makeBook();
Hardly any extra work, but tons of extra benefits.
幾乎沒有任何的額外工作,但是有大量益處。
When test code is run, specifically unit tests, the goal is to see if a method of a class is working correctly. Since the book class requires database access to read the book data it adds a whole layer of complexity. The test has to acquire a database connection, pull data, and test it. All of a sudden the test is no longer testing a single method in the book class, it is now also testing database. If the database is offline, the test would fail. This is FAR from the goal a unit test.當運行測試代碼時,尤其是單元測試,其目標是檢查類中的方法是否正確地工作。由於book類要求接入資料庫並且讀取圖書數據,它增加了一層復雜度。此測試不得不進行資料庫連接,取得數據,然後測試它。瞬間,測試不再是測試book類中的單個方法,它目前同時也測試資料庫。如果資料庫離線,測試就會失敗。這已經遠離了單元測試的目的。
A way of dealing with this is just using a different database dependency for the unit tests. When the test suite starts up a mmy database is injected into the book. The mmy database will always have the data the developer expects it to have. If a live database was used in a unit test the data could potentially change causing tests to unnecessarily fail. There is no need for a unit test to be refactored when a record in a database changes.
解決上述問題的方法是用不同的資料庫依賴來作單元測試。當測試套件開始時,虛擬的資料庫被注入book.虛擬資料庫將永遠擁有開發人員所期待的數據。如果使用一個真實資料庫,數據的潛在變化會導致測試不必要的失敗。當資料庫的記錄改變了,不需因此重新進行單元測試。
The code is more molar because it can dropped into any other web application. Create the book object and inject a database connection with $book->setDatabase(). It does not matter if the database is in Registery::Database, $database, or $someRandomDatabaseVarible. As long as there is a database connection the book will work inside any system.
此代碼現在更加模塊化,因為它可以被放到任何其他的網頁程序。創建book對象並且用$book->setDatabase()注入資料庫連接。此時,資料庫在 Registery::Database, $database,或者$someRandomDatabaseVarible都無關大局。只要有一個資料庫連接,book就可以在任何系統內工作。
The code is more maintainable because each object given exactly what it needs. If separate database connections are required between different instances of the same class then there no extra code needed inside the class what-so-ever. Give book1 access to database1 and book2 access to database2.
代碼更加易維護,因為每個對象都被賦予了它的所需。如果同一類的實例需要不同的資料庫連接,在類內部一點兒也不需要額外的代碼。例如book1連接到資料庫1,book2連接到資料庫2
Factory::$_database=$ourDatabaseVarForDB1;

$book1= Factory::makeBook();
$book2= Factory::makeBook();
$book2->setDatabase($database2);
Dependency injection really is the answer to more maintainable, testable, molar code.
依賴注入真的是更易維護,更易測試和更加模塊化的答案。

㈨ php + mysql 檢測到注入漏洞,如何注入腳本刪除數據

同一句語句里是不允許出現你這種格式的
如果你是有兩條語句需要依次運行,那你可以用分號隔離。
比如:
insert into article_tmp select * from article;
delete from article;
不過你這兩句語句有嚴重的邏輯性問題
delete from article;這句已經把article表裡的數據都刪了。你緊接著要select * from article,那你返回的肯定是空值,都被你前一句刪了。

熱點內容
雲頂演算法 發布:2025-01-10 22:10:07 瀏覽:988
收件伺服器有什麼作用 發布:2025-01-10 21:50:01 瀏覽:388
安卓70緩存 發布:2025-01-10 21:49:03 瀏覽:680
圖像檢索演算法 發布:2025-01-10 21:43:58 瀏覽:556
plsqlforupdate 發布:2025-01-10 21:43:50 瀏覽:914
如何設置健康碼快捷方式vivo安卓 發布:2025-01-10 21:39:52 瀏覽:501
安卓不兼容怎麼解決 發布:2025-01-10 21:37:02 瀏覽:30
linux字體大小 發布:2025-01-10 21:36:21 瀏覽:493
安卓手機的音量在哪裡調 發布:2025-01-10 21:32:11 瀏覽:614
路由器怎麼設置登錄密碼怎麼設置密碼 發布:2025-01-10 21:11:12 瀏覽:893