2011-12-28 40 views
1

我有這樣一個URL(您需要登錄才能看到): https://www.example.com/form.php?id=268加密和MySQL查詢之前做會話變量檢查

form.php的是用戶對特定更新的詳細信息數據庫條目(在這種情況下,編號爲268)

應用程序基本上獲取id no,驗證並清理它,運行mysql查詢,然後用查詢結果填充表單。

在查詢中,我使用來自url的id加上會話變量$ _SESSION ['company_id'],它在登錄時設置。這意味着,如果用戶手動將url更改爲(例如)?id = 269,則只有當company_id與session變量中設置的company_id相匹配時,他/她才能夠看到id 269的詳細信息。

我確信url id會很好/安全,但session變量會讓我擔心。在運行mysql查詢之前,我沒有對會話變量執行任何IP或用戶代理檢查,這讓我感覺有點暴露。所以...

  1. 您認爲我應該加密$ _SESSION ['company_id']以獲得額外的安全性嗎?
  2. 您認爲在運行 查詢之前運行用戶代理檢查是否值得?這是否會增加任何安全值?

-

更新

已經重寫的問題和標題,試圖更具體

+3

你的第一個大禁忌正在生成的SQL查詢那樣;你打開自己的注射攻擊(http://en.wikipedia.org/wiki/SQL_injection)。使用[prepared statements](http://php.net/manual/en/pdo.prepared-statements.php)。 – 2011-12-28 19:40:21

+1

您還需要清理和驗證輸入。在這種情況下,應該很容易確保ID是一個有效的int。 – MrGlass 2011-12-28 19:45:08

+0

我逃離了獲得$ id = mysqli_real_escape_string($ link,$ _GET ['id']),這有助於 – gelviis 2011-12-28 19:46:19

回答

0

即時通訊將嘗試解決你本來就不好的編程習慣,
.1永遠不會將原始ID發送給用戶的眼睛
.2總是在查詢之前對數據進行清理,或者您會在電話中找到自己的身份,您的託管公司整天重置您的服務器....
.3您可以將任何內容傳遞到您的服務器並操作數據。

繼承人的繞了防止用戶更改此 HTML標記的方式:

//設置一個隱藏的id字段像這樣在登錄頁面上。

<? 
$array = array('1,2,3,4,5,6,7,8,9,10'); 
shuffle($array); 
$val = pop($array); 
$val = md5($val) 
?> 

<form action="page.php?$val"> 
<input name="whatever" value "<? echo $val ?>" 
..... rest of your form 
</form> 

然後你想page.php文件用下面的代碼

<? 
switch($_POST['whatever']){ 
    case md5(1): 
... run your login code 
    break; 
    case md5(2): 
... run your login code 
break; 
    case md5(3): 
... run your login code 
break; 
    case md5(4): 
... run your login code 
break; 
    case md5(5): 
... run your login code 
break; 
    case md5(6): 
... run your login code 
break; 
    case md5(7): 
... run your login code 
break; 
    case md5(8): 
... run your login code 
break; 
    case md5(9): 
... run your login code 
break; 
    case md5(10): 
... run your login code 
break; 
} 
?> 

現在也無所謂什麼號碼是因爲它的隨機....但如果他們這麼多的變化URL中的一個字符與服務器定義的md5字符串不匹配,女巫不會被switch statement捕獲.....現在需要一些額外的錯誤報告,但這是您的工作小孩! 希望它有幫助。

1

沒有辦法讀取或修改$ _SESSION變量沒有PHP爲你做,所以我找不到你應該加密它們的理由。因爲這個問題似乎主要是關於個人的意見或安全技術,這是我會怎麼做:

  1. 我不知道爲什麼,但每當我看到GET變量的URL,我總是開始尖叫在我腦海中不安全。這對我來說似乎很危險。我認爲這樣的網址只會讓更多人想嘗試一些東西。它也可以影響SEO排名。我會做一些mod_rewriting,以便http://www.example.com/form/123/自動加載http://www.example.com/form.php?id=123。如果沒有別的,至少網址會很好看。

  2. 不要假設ID將始終包含數字。不要依賴用戶傳遞數字,並讓MySQL爲了安全而逃避它們,爲什麼不自己驗證ID並確保它只包含數字?

  3. 我不知道在PHP中準備好的語句的確切實現,所以我不打擾給你一個例子,但我建議使用它們。它們大大降低了SQL注入的風險。

這裏有一個.htaccess文件來證明該URL重寫:

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^form/([0-9]+)/?$ form.php?id=$1 [L,QSA] 
</IfModule> 

驗證:

<?php 
if(preg_match("/^[0-9]+$/", $_GET['id'])) 
{ 
    // show record 
} 
?>