2011-10-26 31 views
2

據我所知,我可以使用POST方法的URL參數來顯示數據根據特定的變量,我知道如何使用GET方法 - 但我被告知, POST方法可以用來隱藏像這樣的URL部分。使用POST方法來隱藏URL參數

/data.php?parameter=1234 

這兩種方法在URL參數方面的實際區別是什麼?

下面是一些代碼,根據特定的鏈接

<?php 
//This includes the variables, adjusted within the 'config.php file' and the functions from the 'functions.php' - the config variables are adjusted prior to anything else. 
require('configs/config.php'); 
require('configs/functions.php'); 

    //This is the actual interaction with the database, according to the id. 
    $query = mysql_query("SELECT * FROM table WHERE id=" .$_GET['id'] . ";") or die("An error has occurred"); 

      //This re-directs to an error page the user preventing them from viewing the page if there are no rows with data equal to the query. 
    if(mysql_num_rows($query) < 1) 
{ 
    header('Location: 404.php'); 
    exit; 
} 

    //Here each cell in the database is fetched and assigned a variable. 
    while($row = mysql_fetch_array($query)) 
    { 
     $id = $row['id']; 
     $title = $row['title']; 
     $month = $row['month']; 
     $day = $row['day']; 
     $photo = $row['photo']; 
     $text = $row['text'];  
    } 
?> 

的ID在一個單獨的頁面我根據像這樣的ID生成鏈接到data.php文件從數據庫中提取數據:

<a href="post.php?id=<?php echo $content['id']; ?>"><?php echo $content['title']; ?></a> 

忘記,有可以通過上面的代碼中出現潛在的SQL注入,我將如何去利用POST方法,以隱藏URL參數,或者至少不會像這樣顯示出來:

http://example.com/data.php?id=1 
+0

一個小側面說明'''的mysql_query(只是增加POST到窗體中被移除的參數 「SELECT * FROM表WHERE ID =」。$ _ GET [ '身份證'] 「;」)'''很容易受到SQL注入的影響,所以如果你把它放在線上並且你的數據庫包含重要的數據,那麼請小心。 – Mason

回答

2

爲了使用POST,您將需要使用<form>標記,並且根據您如何拉起這些URL,可能更容易使用javascript來提供幫助。這裏有一個簡單的例子:

<form method="post" action="data.php"> 
    <input type="hidden" name="parameter" value="1234" /> 
    <input type="submit" value="Go" /> 
</form> 

GO按鈕將POST表單數據,現在在data.php你將能夠從$_POST['parameter']檢索值。請注意,使用POST時,您可能需要將(HTTP 302)重定向回頁面,以便當用戶點擊後退按鈕時,瀏覽器不會提示重新提交表單。

使用javascript,您可以在發佈表單之前將parameter輸入設置爲不同的值。

+0

感謝您的回覆,我正在執行一個類似的過程,通過post提交的表單將數據插入到數據庫中,然後將用戶帶到他們通過標頭提交的數據的頁面('Location:../data ?.PHP ID =」 $ ID);這是否意味着我現在實際上使用了不正確的代碼? – Alex

+0

這沒有什麼不正確的,但是如果你想使用POST來從URL中刪除id,那麼你會想在會話中存儲這個ID($ _SESSION)。這樣,當用戶在data.php上時,可以從會話中查找id,而不是從GET中查找。 –

+0

那麼我將不得不堅持用於更新數據庫的代碼在同一個文件中也顯示插入的內容?所以表單會運行該腳本 - 插入到數據庫中,然後顯示爲用戶插入的數據? – Alex

0

對於POST值,瀏覽器必須使用method =「post」或JavaScript模擬表單的表單。各種開發工具(fireug等)可以將GET表單轉換爲POST表單,但通常情況下,表單是必需的。

理論上GET請求不應該有任何副作用,並且「應該」從請求到請求是一致的。也就是說,服務器應該返回相同的內容。在今天的世界中,幾乎所有的事物都是動態的,這可能沒有什麼實際的設計意義。

0

無論您使用GET還是POST,參數都會出現在$_REQUEST中。關鍵的區別是使用POST允許變量不出現在URL歷史記錄中。這會降低您不想在URL歷史記錄中顯示的密碼等數據的可見性。要使用POST而不是GET,只需在文檔中生成<form method="POST" ...>

更好的辦法是將敏感值(如用戶id)存儲在cookie中,以便它們完全不會出現在$_REQUEST中。由於cookie的內容是在額外的HTTP請求頭中提供的,而不是在內容中提供的,所以它們通常不作爲歷史記錄的一部分存儲。

0

爲了使用而不是GET POST,你需要在你的HTML中使用的HTML表單標籤,就像這樣:

<form method="POST" action="/data.php"> 
    <input type="hidden" name="parameter" value="1234" /> 
    <button type="submit">Submit</button> 
</form> 

提交時,您的網址將只是/data.php和參數= 1234將在你的(隱藏的)後期緩衝區中。

有意義嗎?

0

要做一個POST,你必須使用一個表單或者一些javascript/ajax技巧。一個<a>將只會導致一個GET請求。

請注意POST請求仍然可以在URL中具有查詢參數。擁有它們並不「正常」,但它們是被允許的。主要區別在於,通過GET請求(忽略cookie),URL是向服務器發送參數/數據的方式。通過POST,您可以同時使用URL和POST請求的正文,POST請求通常是放置POST數據的地方。

2

對錶單使用方法「POST」。我有同樣的問題,從URL

<form id="abc" name="abc" action="someaction.php" method="post"> 
    <input type="text" id="username" name="username"/> 
    <input type="password" id="password" name="password"/> 
    <input type="submit" id="submit" name="submit" value="submit"/> 
</form>