2012-04-03 147 views
2

我被黑客聯繫表示會使用會話劫持來關閉我的網站,他說我的文本框會話劫持脆弱。停止會話劫持

是否有任何保護文本框免受會話劫持 我使用它來逃避和防止SQL注入。

這裏是我的形式

 <form name="hide" action="hideboxupdate.php" method="post"> 
      <input type="radio" name="yes" value="1" /> 
    Yes<br /> 
    <input type="radio" name="no" value="0" /> 
    No 
    <input name="submit" type="submit" value="Submit" /> 
     </form> 

那麼這裏就是我的hideboxupdate.php

<?php 

$yes= mysql_real_escape_string($_POST['yes']); 
$yes2 = strip_tags($yes); 




$no= mysql_real_escape_string($_POST['no']); 
$no2 = strip_tags($no); 
?> 
      <?php 

      if (isset($yes2)) { 





    $result3333 = mysql_query("UPDATE users SET hide_box='1' WHERE username = '".$_SESSION['username']."'") 
or die(mysql_error()); 

echo "Users now can not see your user box"; 
} 

if (isset($no2)) { 


$result3333 = mysql_query("UPDATE users SET hide_box='0' WHERE username = '".$_SESSION['username']."'") 
or die(mysql_error()); 

echo "Users can now see your box on your profile"; 

} 
?> 

在那裏反正會話劫持保護???

+0

是,閱讀此相關的問題: http://stackoverflow.com/questions/6483092/php-session-hijacking [PHP會話安全(的 – joelparkerhenderson 2012-04-03 13:21:10

+0

可能重複http://stackoverflow.com/q/328 /),[防止會話劫持的最佳方法是什麼?](http://stackoverflow.com/q/22880/90527) – outis 2012-04-19 09:22:48

回答

5

使會話的md5,瀏覽器數據和ip放在數據庫中,每個頁面加載檢查是否仍然相同,如果不能破壞會話。

+0

+1這也是相當不錯的解決方案。 – 2012-04-03 13:23:02

+0

謝謝你會試試這個。 – user1152332 2012-04-03 13:24:13

+1

我爲會話製作新表,將其綁定在用戶標識或其他內容上,添加更新時間戳並刪除舊會話(這也是防止雙重登錄的好方法) – MakuraYami 2012-04-03 13:49:08

0

您應該考慮通過安裝驗證碼保護來保護向您的系統發出「寫入」問題的請求。

我用Google reCaptcha這是相當不錯的...

此外,請確保你對認證系統(例如登錄表單)後,正在重置您的PHPSESSID:session-regenerate-id

+0

我使用了captcha,並且可以解釋關於「確保您在對系統進行身份驗證後重置您的PHPSESSID(例如登錄表單):session-regenerate-id」 – user1152332 2012-04-03 13:23:22

+0

重置後的想法是,您必須在成功登錄後更改會話。如您所知,會話失效後不會自動刪除會話文件,黑客可以使用它來獲得對系統的特權訪問權限。這種方式你特別要求**當前ID **應該重新設置**新的** - 我相信舊的會話將被自動刪除。 – 2012-04-03 13:54:44

3

當您發送頁面與形式,包括與一個隨機字符串隱藏的輸入,你還寫信給用戶的記錄在數據庫中,這樣的事情:

<input type="hidden" name="csrf" value="0432985732409857243"/> 

當使用r提交表單,您驗證表單的隱藏數據csrf與存儲在數據庫中的值匹配。如果csrf匹配,這意味着更新是好的,你也刪除csrf;如果csrf無法匹配,那麼您不會執行更新。

這可以保護用戶,因爲只有他能夠提交該表單,並且只能提交一次。

+0

你可以使用螢火蟲來查看這個值... – user1152332 2012-04-03 13:27:27

+0

是的,螢火蟲會向用戶顯示他自己的網頁加載的價值 - 但是他的價值會與其他人的價值不同。 – joelparkerhenderson 2012-04-03 13:42:02

2

這不會阻止您的代碼受到攻擊。只需在本地主機上創建一個表單並使用您使用的相同變量名稱發佈到您的服務器,人們就可以將任意數據發佈到您的表單。

這只是一種情況。使用白名單方法。在服務器端,創建一個數組,其中包含表單中每個變量的所有可能值,您希望它們是正確的輸入(顯然<input>,<textarea>不可能)。

此外,由於用戶正在討論會話固定...每次註銷後銷燬會話....登錄後使用session_regenarate_id(使用md5 + salt加密)。不要在url中傳播session_id。

幾點提示:(由Chris Shiflett撰寫...一個Renowed網絡安全專家)

http://shiflett.org/articles/session-hijacking

http://shiflett.org/articles/session-fixation

http://shiflett.org/articles/foiling-cross-site-attacks

http://shiflett.org/articles/the-truth-about-sessions

http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-string

希望它可以幫助...

0

請考慮服務器和客戶端經歷一個通常爲SSL的登錄階段,或者服務器可以提供其他客戶數據,以便客戶端和服務器可以形成唯一的共享salt值(例如用戶密碼)。即使在非SSL登錄中,也只需要傳輸密碼的密碼,而不是密碼本身。然後,服務器可以開始傳輸計數,客戶端可以在下一頁請求中使用(count + private salt)的散列進行響應。潛在的會話劫持者沒有辦法獲得這個私有的salt,因此不能在序列中產生下一個散列。