2014-01-14 78 views
0

我正在測試我的網站是否有SQL注入問題,並遇到了一些我無法理解的問題。SQL注入測試錯誤

在基礎知識中,我構建了一個用戶博客系統。

我使用的是SQL注入我Firefox的插件,這裏有一些錯誤,我收到:

「字符串錯誤發現:‘誠信約束衝突’」

「服務器狀態代碼:302已暫時移動」 - 我認爲這只是因爲我重定向錯誤的用戶某種形式

總的來說,我沒有失敗,並通過了42,000測試。但是我的一些數據庫項目正在生效。

可以說,我是呼應了從數據庫中「帖」:

我把所有的數據,然後一個隱藏的形式,用於編輯數據。如果用戶登錄,則會顯示一個按鈕,他們可以點擊並顯示此表單。

即使用戶未登錄,SQL注入也可以修改帖子。

在我的更新帖子的處理頁面中,我檢查POST,並且我還再次運行一個檢查,檢查數據庫中的帖子用戶名以及登錄的用戶名(空白如果未登錄)。但是,這仍然允許進行更改。

這怎麼可能?並且正在顯示一個「display:none」的表單嗎?

+0

你在用什麼連接「mysqli」? – Ryan

+0

@ryan我所有的表單處理都是使用綁定查詢和PDO完成的。 – Lovelock

+0

@ jeroen - 我認爲這有點不同,因爲它詢問了測試以及結果是如何到達的;而不是注射或預防。 – jww

回答

0

在將任何數據插入數據庫之前,您應該檢查用戶是否已登錄(具有有效會話)下面的示例代碼:

在您的登錄頁面,如果用戶名/密碼是正確的,執行此:

$_SESSION["logged_in"] = true; 

這將使PHP「記住」當前會話cookie是有效的,屬於有效用戶。

無論何時您需要更改數據庫的內容,你可以檢查:

if (isset($_SESSION["logged_in"]) && $_SESSION["logged_in"]) { 
    // all good, user is logged in, you can change database contents 
    mysqli_query("UPDATE ..."); // example query 
} else { 
    // something is wrong, the form is submitted without a valid session 
    // so it's probably a malicious user, anyway don't change database contents 
    echo "Access denied, please log in."; // display error message 
    header("Location : /login.php"); // or redirect them to the login page 
}; 

,並顯示一表「顯示:沒有」足夠好?

否;惡意用戶可以提交表單,即使它隱藏了(通過使用開發人員工具可以看到該表單或查看頁面源代碼並編寫提交表單的腳本),實際上這正是您的漏洞檢查程序擴展正在執行的操作,它會嘗試即使他們被隱藏,也要提交表單。

+0

在插入數據之前,我會考慮改進用戶檢查。另外我怎樣才能解決這個問題?我可以用js來創建我想要的形式。 – Lovelock

+0

只要您在將任何數據插入數據庫之前檢查用戶的會話,並且使用Javascript作爲「保護」是一個糟糕的主意,那麼您的表單就沒有問題;攻擊者可以輕鬆繞過該攻擊。 – 2014-01-14 21:31:26

+0

對不起,我的意思是顯示錶格。如果我用js創建表單而不是回顯並顯示爲隱藏表單。 – Lovelock