2011-11-10 80 views
2

我想在the last question I asked中的一些建議之後保護我的腳本。什麼是保護數據進出數據庫的正確方法?

我需要使用mysql_real_escape_string函數來保護像$row['page_name']這樣的東西嗎?例如:

$pagename = mysql_real_escape_string($row['page_name']); 

我問,主要是因爲當我做保證每一行,我得到了一些錯誤試圖number_format()時,它拋出number_format() expects parameter 1 to be double, string given而當它不與mysql_real_escape_string確保它的工作原理等。

有人可以幫我清楚嗎?我只需要保證COOKIE的行或行取得?

我得到了這個職位的建議:你倒着做HERE(看選擇的答案)

+1

你能顯示錯誤代碼,而不僅僅是一行嗎? – SergeS

+0

請告訴我你想看到什麼代碼,我寧願不要發佈整個腳本,因爲它很長時間以來與很多不相關的東西。 – Ricardo

回答

4

。推測$row是這個數據庫中出來的一行。你沒有mysql_real_escape_string的途徑出了的數據庫,你用它把數據轉到轉成這個數據庫來防止SQL注入。它可以防止人們提交包含可執行SQL代碼的數據。

一旦數據安全地在數據庫中,您就完成了mysql_real_escape_string(直到您嘗試更新該數據)。用戶數據到達數據庫需要通過htmlspecialchars運行,然後纔到達頁面以防止腳本注入。

基本上,在前往數據庫的途中,就在插入/更新之前運行,您需要轉義潛在的可執行SQL。在前往瀏覽器的途中,就在字符串離開您的應用程序瀏覽器之前,您需要轉義潛在的可執行JavaScript和/或可解釋的HTML。在應用程序離開瀏覽器或數據庫之前,轉義應該是您對一段數據所做的最後一件事。

+0

1)所以我不能定義一個變量的擔保價值? 2)當從數據庫中提取數據時,我需要使用'html_special_chars'而不是'mysql_real_escape_string'? – Ricardo

+1

1)你可以在任何地方存儲編碼值,它只是一個值。把它放在一個變量或數組中。我假設你的變量來自數據庫,因爲你沒有指定。 2)是的,在使用瀏覽器的數據時使用'mysql_real_escape_string'會產生輸出錯誤和潛在的JS注入漏洞。 – meagar

0

mysql_real_escape_string不「保護」任何東西。它逃脫了可用於sql injection attacks的字符。因此,您應該轉義的唯一值是您的用戶提供的值。應該沒有必要轉義出自己數據庫中的東西。

+0

我已經編輯了這篇文章,並提供了我之前提出的建議來做我目前正在做的事情,任何關於那裏的人的建議的解釋? – Ricardo

1

插入/更新值來自不受信任來源的行時,您只需要使用mysql_real_escape_string()

這包括諸如:即來自於瀏覽器

    • $ _GET
    • $ _ POST
    • $ _COOKIE
    • 什麼..]

    你應該只有在將數據放入數據庫時​​才使用它,而不是在使用時因爲他們應該已經安全了。

    完全一個更安全的方法是使用PDO

  • 1

    如果使用PDO擴展打造乾淨的請求,您可以創建功能,將做到這(安全串並定義它們的類型):

    個例,其中$文字文本和$數字的字符串是一個整數:

    public function InsertThis($number, $text) { 
        $pdo = $this->getPdo(); 
        $sth = $pdo->prepare("INSERT INTO my_table (number, text) VALUES (:number, :text"); 
        $sth->bindParam('number',$number,PDO::PARAM_INT); 
        $sth->bindParam('text',$text); 
        $sth->execute(); 
    } 
    

    http://php.net/manual/en/book.pdo.php

    3

    這絕不是一個完整的答案。

    在編寫任何更多的代碼之前,您需要停下來並考慮到你要完成的是什麼。

    換句話說,你通過運行mysql_real_escape_string函數獲得了什麼?

    一般來說,您會轉義客戶端提交的數據。這是爲了幫助防止sql注入。此外,您應該進一步實際驗證客戶發送的內容是否可接受(即「完整性檢查」)。例如,如果您希望輸入數字,請不要接受字符串,並且範圍檢查值。如果您希望字符串數據像名稱一樣,請不要接受HTML,但再次進行範圍檢查以驗證長度是否可接受。當客戶提交數據時,這兩種情況都會發生,而不是在您將其寫回時。

    進一步說,你的cookies應該被加密並用httponly標記來告訴瀏覽器它不用於客戶端腳本。即使這樣,你也不應該相信cookie中的數據;所以繼續運行你的理智檢查,並仍然在查詢中逃避這些值。

    我強烈建議您進入OWASP website並仔細閱讀所有問題,以更好地理解攻擊是如何工作的以及如何防禦攻擊。 Web應用程序的安全性太重要,不能在不知道發生了什麼事情的情況下開始編碼。

    順便說一句,向您瞭解這一點,並試圖捍衛您的網站。太多的開發人員甚至根本不考慮安全性。

    相關問題