2009-02-22 64 views
10

我是PHP新手。在學習PHP語言的路徑,我注意到,一些網站將這種URL的:什麼是「?」在URL中使用的符號在PHP?

www.website.com/profile.php?user=roa3 & ......

我的問題:

  1. 什麼是「?」符號用於?

  2. 如果我是開發一個PHP網站,我必須使用它在我的網址?例如,在用戶(roa3)成功登錄後,我將重定向到「www.website.com/profile.php?user=roa3」而不是「www.website.com/profile.php」

  3. 使用它的優點和缺點是什麼?

回答

21

好的問題,簡單地說,

  1. 「?」代表開始查詢 字符串,其中包含要傳送到服務器的數據爲 。在這種情況下 您正將用戶= roa3傳遞到 profile.php頁面。您可以使用 profile.php中的$ _GET ['user']獲取 數據。查詢字符串是從客戶端代理髮送數據到服務器的方法之一。另一個將數據放在HTTP正文和POST到服務器,你沒有直接從瀏覽器看到HTTP POST數據。

  2. 查詢字符串可由用戶編輯 並且它對公衆可見。如果 www.website.com/profile.php?user=roa3 是打算公開的,那麼它是 罰款,否則您可能需要使用 會話獲取當前用戶的 上下文。

  3. 它是將數據傳遞到 服務器靈活的方式,但它是可見的, 可編輯的用戶,對於一些 敏感數據,附着至少 它的查詢字符串之前產生 某種散列,這可以防止 用戶編輯它或理解 它的含義。但是這 並不妨礙一個體面的黑客 做你的網站 錯誤。不同的瀏覽器支持不同的URL最大長度,冗長的URL由這些查詢字符串參數組成。如果您想發送大量數據,請將數據放入HTTP正文並POST到服務器。

0

從服務器的角度來看,只是另一個角色。 PHP提供了簡單的URL部分方法,字符,例如對於「/profile.php?user=roa3」,PHP將設置$ _GET ['user'] ='roa3'。

原因?在URL中非常有用的是,瀏覽器可以使用表單構建動態URL - 在上面的例子中,我希望URL是由帶有字段「user」的HTTP表單構建的,用戶輸入「roa3」。

+0

這是錯誤的。 「?」不是服務器的「另一個角色」。服務器將「?」上的URL分開(如果有的話)。前面的部分是請求的文件,後面的部分是「查詢字符串」,作爲QUERY_STRING環境變量呈現給CGI。 – 2009-02-22 07:14:31

+1

我應該說,一般*的服務器*不應該專門處理它。在PHP(以及大多數其他Web框架)的情況下,提供了一些處理,因爲我繼續討論。這個問題沒有在任何地方指定CGI。 – Edmund 2009-02-22 07:46:21

+1

服務器可能不是特殊的,但它是HTTP標準的一部分,而不是PHP。 – 2009-02-22 08:34:06

0
  1. 「?「用於分隔URL和參數,例如,它就像http://www.url.com/resourcepath?a=b&c=d,在這種情況下,a = b就像request_parameter = request_value

  2. Ya,不建議使用大部分參數,因爲總數url的大小是有限的,它就像GET請求,其中所有參數都顯示在url上,用戶可以修改它。在你的示例中,說出如果用戶修改url爲「user = techmaddy」。

  3. 優點是它可以用於GET類請求。缺點是安全性低,體積受限。

4

1)如果用戶登錄到你的網站,你會用Sessions,而不是存儲其傳遞的URL如profile.php?username=roa3

2)使用在?符號的存在的用戶名Search Engine Optimization通常被認爲是不好的。另外,這些網址看起來有點難看。使用mod_rewrite,您可以執行與profile.php?user=roa3products.php?id=123&category=toys相同的操作:site.com/profile/roa3products/toys/123

使用CodeIgniter框架默認會爲您提供友好的網址,並且不需要在您的網址中使用?。以this page爲例。

3)?符號也用於php頁面的代碼中。例如,if else塊如:

if ($x==1) 
    $y=2; 
else 
    $y=3; 

也可以寫爲: 「?」

$y=($x==1) ? 2 : 3; 
3

意味着一些GET變量將被遵循。您的示例使用名爲「user」的變量,並分配一個名爲「roa3」的變量。

優點使用GET變量:

  • 它們可以作爲書籤的網址

缺點的一部分

  • 他們是公衆..任何人都可以截獲並看到此信息。這些url請求甚至可以被旅途中的服務器緩存。因此,任何人只需用手打字信息冒充您的roa3用戶......此外,他們可以在roa3更改爲不同的用戶和模仿他們..

您還可以使用「&」符號進行分隔許多變量,例如: www.website.com/profile.php?user=roa3&fav_colour=blue

其他選項:

  • POST變量

    • 您可以通過POST變量發送變量。這些變量被傳遞到請求的頭部,而不是請求的URL。它們並不立即顯而易見,並且在旅途中不會被服務器緩存,但它們仍然可以被讀取。除非您已經建立了HTTPS連接。
    • 表單中的變量可以通過POST或GET方法發送。您可以在表單的「方法」中指定此值。 <form action="index.php" method='post'/>
  • Session變量

    • Session變量存儲在服務器上。會話標識被傳遞給用戶,並且每次用戶發出另一個請求時,此會話標識都會被傳回服務器。然後可以使用此會話標識來獲取已存儲的會話變量。所以你可以存儲一個用戶喜歡的顏色,他們的名字和IP地址等等,但是你可以把它存儲在服務器上而不是用戶的家用PC上。
      會話ID可以被模擬,所以最好檢查用戶的IP,或者將它們包裝在安全連接中。例如https。
    • 會話變量不能被攔截請求的人改變。
  • COOKIE變量:
    類似於會話變量,除了它們存儲在用戶的PC,而不是服務器上。它們存儲在一個域中,當它們進入該域時,它們將請求頭中的變量重新提交給服務器。這意味着用戶可以更改和破解變量,或者其他人可以。

要訪問PHP這些變量可以使用:

  • $x = $_GET['user']爲得到可變
  • $x = $_POST['user]
  • $x = $_REQUEST['user'] - GET,POST和Cookie變量
  • $x = $_COOKIE['user']的組合 - Cookie變量
  • $x = $_SESSION['user']訪問會話變量

夠簡單的東西(user可以和你正在使用的變量的名稱來代替),但重要的是要知道他們實際上做。

6

到目前爲止,我所見過的大部分答案都是以PHP的形式出現的,但實際上這並不是語言特定的。到目前爲止給出的答案都是從PHP的角度出發的,用來訪問信息的方法因語言的不同而不同,但數據在URL中的格式(稱爲查詢字符串)仍將保留相同(例如:page.ext?key1 =值& key2 =值& ...)。

我不知道你的技術背景或知識,所以請原諒我...

有一個網頁,以提供數據返回給Web服務器的兩種不同的方法。這些被稱爲POST或GET方法。還有一些其他的,但是在處理普通用戶時,這些都不應該用於任何網頁設計。POST方法不可見地發送到服務器,用於'上傳'數據,而GET方法作爲URL中的查詢字符串對用戶是可見的,僅用於從字面上'獲取'信息。

並不是所有的網站都遵循這個經驗法則,但是爲什麼會有原因。例如,一個站點可能會專門用POST來繞過代理服務器或瀏覽器的緩存,或者因爲它們使用雙字節語言,並且由於編碼轉換而嘗試執行GET時可能會導致問題。

關於這兩種方法以及何時使用它們的一些資源...

http://www.cs.tut.fi/~jkorpela/forms/methods.html http://weblogs.asp.net/mschwarz/archive/2006/12/04/post-vs-get.aspx http://en.wikipedia.org/wiki/Query_string

現在,從嚴格的PHP位置,現在有3個不同的陣列可以使用來獲得網頁已發送回服務器的信息。你有你的處置......

  • $ _ POST [「鍵名」],搶僅從POST方法的信息
  • $ _GET [「鍵名」],從GET只抓取的信息方法
  • $ _REQUEST ['keyname'],允許您獲取可能已提交的POST,GET和任何COOKIE信息。排序的一種方式,特別是在您不知道哪個頁面可能用於提交數據的情況下。

通過直接使用$ _REQUEST方法不要馬虎。除非像上面提到的$ _REQUEST變量那樣,否則不要使用它。當涉及到安全性時,你想嘗試使用'拒絕所有,只允許x,y,z'的方法。只查找您知道自己的網站將發送的數據,只查找您期望的組合,並在使用之前清除所有信息。例如..

  • 對任何通過上述方法傳遞的東西都不要做eval()。我從來沒有見過這樣做,但這並不意味着人們沒有嘗試或做過。
  • 從不直接與數據庫不清洗他們(研究SQL注入攻擊,如果你不熟悉他們)使用的信息

這是迄今爲止不是結束一切,待所有PHP安全,但我們不是爲了這個。如果你想知道更多的線,那麼這是另一個問題。

希望這可以幫助,並隨時提出任何問題。

1

?是HTTP標準的一部分,而不是PHP的一部分。以爲我應該指出這一點,所以當你移動到另一種語言並再次看到它時,你並不感到困惑,認爲有PHP參與。

否則上面有一些優秀的答案。