程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP基礎之POST與GET,phppostget

PHP基礎之POST與GET,phppostget

日期:2017/1/16 17:54:00      編輯:關於PHP編程

PHP基礎之POST與GET,phppostget


post 與 get區別 重點: *.Post傳輸數據時,不需要在URL中顯示出來,而Get方法要在URL中顯示。
*.Post傳輸的數據量大,可以達到2M,而Get方法由於受到URL長度的限制,只能傳遞大約1024字節.
*.Post顧名思義,就是為了將數據傳送到服務器段,Get就是為了從服務器段取得數據。而Get之所以也能傳送數據,只是用來設計告訴服務器,你到底需要什麼樣的數據。Post的信息作為http請求的內容,而Get是在Http頭部傳輸的。   詳細說明: 1、Get 通過 URL 請求來傳遞用戶的數據,將表單內各字段名稱與其內容以成對的字符串連接,置於 action 屬性所指程序的 url 後, 數據都會直接顯示在 url 上,就像用戶點擊一個鏈接一樣;       Post 方法通過 HTTP post 機制,將表單內各字段名稱與其內容放置在 HTML 表頭(header)內一起傳送給服務器端交由 action 屬性能所指的程序處理,該程序會通過標准輸入(stdin)方式,將表單的數據讀出並加以處理   2、 Get 方式需要使用 Request.QueryString 來取得變量的值。        Post 方式通過 Request.Form 來訪問提交的內容。

3、 Get 方式傳輸的數據量非常小,一般限制在 2 KB 左右,執行效率卻比 Post 方法好;        Post方式傳遞的數據量相對較大,它是等待服務器來讀取數據,也有字節限制,這是為了避免對服務器用大量數據進行惡意攻擊。
        建議:除非你肯定你提交的數據可以一次性提交,否則請盡量用 Post 方法   4、 Get 方式提交數據,會帶來安全問題,表單提交建議使用 Post 方法;(比如登陸頁面,通過 Get 方式提交數據時,用戶名和密碼出        現在 URL 上,如果頁面可以被緩存或者其他人可以訪問客戶這台機器,就可以從歷史記錄獲得該用戶的帳號和密碼)       Post 方法提交的表單頁面常見的問題是,該頁面如果刷新的時候,會彈出對話框。建議:出於安全性考慮,最好使用 Post 提交數據   5、Get限制Form表單的數據集的值必須為ASCII字符;而Post支持整個ISO10646字符集。
6、Get是Form的默認方法。   HTTP協議裡面,四個表示操作方式的動詞:GET、POST、PUT、DELETE。它們分別對應四種基本操作: 
GET用來獲取資源
POST用來新建資源(也可以用於更新資源)
PUT用來更新資源
DELETE用來刪除資源。

PHP通過post/get獲得數據會自動轉義

根據服務器的不同配置,在通過post、get獲得數據時可能出現一些類似於 ',"等特殊符合會被轉義。這個問題主要由PHP魔術引號引起。PHP魔術引號包括 magic_quotes_gpc,magic_quotes_runtime,magic_quotes_sybase。

magic_quotes_gpc 總結如下:

1. 對於magic_quotes_gpc=on的情況,
我們可以不對輸入和輸出數據庫的字符串數據作
addslashes()和stripslashes()的操作,數據也會正常顯示。
如果此時你對輸入的數據作了addslashes()處理,
那麼在輸出的時候就必須使用stripslashes()去掉多余的反斜槓。



2. 對於magic_quotes_gpc=off 的情況
必須使用addslashes()對輸入數據進行處理,但並不需要使用stripslashes()格式化輸出
因為addslashes()並未將反斜槓一起寫入數據庫,只是幫助mysql完成了sql語句的執行。



關於php注入中的magic_quotes_gpc     magic_quotes_gpc = on

大家都知道php配置文件php.in  ,如果裡面的magic_quotes_gpc  配置被打開 那就是magic_quotes_gpc = on   懂點php的人都知道。

那我們就要對數值型的字段注入。

 1 <?
 2      if ( isset($_POST["f_login"] ) ){
 3          //連接數據庫
 4          $t_strUid = $_POST["f_uid"];
 5          $t_strPwd = $_POST["f_pwd"];
 6          $t_strSQL = "SELECT * FROM tbl_users WHERE uid=$t_strUid AND password = '$t_strPwd'      LIMIT 0,1";
 7          if ( $t_hRes = mysql_query($t_strSQL) ){
 8           // 成功查詢
 9           }
10        }
11 ?>
 1 <html>
 2       <head>
 3              <title>sample test</title>
 4       </head>
 5       <body>
 6       <form method=post action="">
 7             User ID: <input type="text" name="username" size=30><br>
 8             Password: <input type=text name="userpwd" size=30><br>
 9             <input type="submit" name="user_login" value="登錄">
10       </form>
11 </body>

如果正確輸入:

    SELECT * FROM tbltable_users WHERE userid=admin AND password = 'admin' LIMIT 0,1

 如果攻擊者在username處,輸入:admin OR 1 =1 #,則注入的sql語句如下:

    SELECT * FROM table_users WHERE userid=admin OR 1 =1 # AND password = 'admin' LIMIT 0,1

下面就可以進行注入了.

在php.ini 中把display_errors 選項設為display_errors = off  這樣就可以防止.

magic_quotes_runtime
        如果打開的話,大部份從外部來源取得數據並返回的函數,包括從數據庫和文本文件,所返回的數據都會被反斜線轉義。該選項可在運行的時改變,在 PHP 中的默認值為 off。

magic_quotes_sybase
        如果打開的話,將會使用單引號對單引號進行轉義而非反斜線。此選項會完全覆蓋 magic_quotes_gpc。如果同時打開兩個選項的話,單引號將會被轉義成 ”。而雙引號、反斜線 和 NULL 字符將不會進行轉義。

由於不同服務器的配置不同,需要在代碼中用get_magic_quotes_gpc() 檢測服務器配置。

1 if(isset($_POST['c'])){
2     $s = $_POST['c'];
3 if(get_magic_quotes_gpc())
4         $s = stripslashes($s);//stripslashes() 函數刪除由 addslashes() 函數添加的反斜槓。
5 //do something
6 }

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved