2013-11-02 51 views
1

我想問一下當我使用$ _GET ['something']時如何提高安全性; ?

我的意思是,如何防止人們直接從地址欄執行這些「獲取」?因爲我有一個測試頁,您可以從中獲得XP,並從XP獲得等級。

它看起來像這樣:

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="get"> 
<label for="addxp"><font color="yellow">Add XP:</font></label> <input type="text" name="xpadd"><br> 

<input type="submit"> 
</form> 

$xpadd = $_GET['xpadd']; 

    mysql_query("UPDATE users SET xp=xp + '" . $_GET['xpadd'] . "' WHERE user_id='" . $_SESSION['user_id'] . "'") ; 

它是工作,但是當我鍵入此到我的瀏覽器的地址欄:http://mywebsite.com/xp.php?xpadd=50它增加了50 xp下我的觀點。有人可以告訴我,我該如何預防?

+1

使用nonces爲:http://stackoverflow.com/questions/4145531/how-to-create-and-use-nonces – Joren

+2

此外,不要使用'mysql_'函數,他們已被棄用。改用'mysqli'或'PDO'。在插入到數據庫之前轉義值也是一個好主意。請參閱http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php – Joren

+1

讓他們能夠添加XP是最少的擔心,你有一個** SQL注入**後門 - 左**寬**開 – AlexP

回答

2

正如你所說的,任何人都可以執行這個GET請求 - 因此你不能阻止人們這樣做。

您需要驗證在您的代碼中允許當前登錄的用戶執行此類命令。只有驗證成功後才執行更新。

一種選擇是持有該表的標記,並檢查這兩種設置/取消設置(取決於您的業務邏輯)

例如:

SELECT 1 FROM users WHERE user_id = ? AND is_allowed_xp_update = 1 

只有這個收益真,那麼執行更新

UPDATE users SET xp = xp + ? WHERE userid = ? AND is_allowed_xp_update = 1 

還可以使用備用數據庫庫,然後在mysql_*功能,它們已經過時,並提供DYNAM小安ic查詢

0

基本上,你不能。有經驗的用戶可以閱讀頁面的HTML代碼並形成GET查詢(直接在瀏覽器的地址欄中)或POST查詢(這將需要更多的工作,但仍有可能)。

安全服務器不應該信任客戶端。

所以你需要在服務器端的授權碼。 (從你的問題中不清楚誰可以使用addxp,誰不允許。)