簡體   English   中英

在哪里使用mysql_real_escape_string來阻止SQL注入?

[英]Where to use mysql_real_escape_string to prevent SQL Injection?

我和一群黑客有麻煩。 他們幾次攻擊我的客戶的網站,我的客戶端更生氣:(我的客戶丟失了他的數據庫(有數百條記錄),並且不得不輸入所有:(

現在我正在進行更多的介紹;

  • 修復了文件權限
  • 更改了ftp和主機登錄信息
  • 清除所有遠程mysql訪問

現在正致力於SQL注入問題。 我將mysql_real_escape_string添加到管理面板登錄參數。 那么我應該在哪里使用這個mysql_real_escape_string呢? 我在網站上的電子郵件表格很少,我不認為我需要添加...

我有一個index.php作為主頁。 我是否應該為此頁面做任何事情以防止任何sql注入攻擊通過url如index.php?somesql=

請建議我! 我很感激!!! :(


例如:

我有這樣的代碼;

public function showDetails($id) {

    // SQL Jobs Details
    $this->sql_job = "SELECT * FROM jobs WHERE id=".mysql_real_escape_string($id);
    $this->rst_job = mysql_query($this->sql_job);           
    $this->row_all = mysql_fetch_assoc($this->rst_job);     

    // SQL State
    $this->sql_state = "SELECT title FROM state WHERE id=" . $this->row_all[$this->tbl_jobs['f4']];
    $this->rst_state = mysql_query($this->sql_state);   
    $this->row_state = mysql_fetch_assoc($this->rst_state);
........

是否足以使用mysql_real_escape_string作為$ id。 不是$ this-> row_all [$ this-> tbl_jobs ['f4']]

基本上,每次在SQL查詢中使用一些不安全的數據(用戶輸入,數據庫,文件或外部網站的值,即您不能100%確定它是安全的任何數據)時,您應該使用它來轉義它mysql_real_escape_string 請注意, 根據OWASP ,此函數對於轉義動態表名稱並不安全(但這遠不如“基本”用戶輸入插入那么常見)。

我建議你看一下關於SQL注入的整篇OWASP文章 ,還要瀏覽網站的其他部分。 它是有關Web應用程序安全性的重要信息來源。

IMO,防止SQL注入的首選方法是使用預准備語句

請記住,如果您確實選擇使用mysql_real_escape_string()它只能在由引號分隔的字符串中使用時才有效。 切勿在任何未引用的值上使用它。 這包括數值; 相反,驗證用戶輸入實際上是數字。

用戶輸入的兩個最重要的事情是

  1. 輸入過濾
  2. 輸出轉義

輸入過濾是轉換數據/ [之前] /它存儲在數據庫中的過程。 執行mysql_real_escape_string()屬於此步驟(盡管有更好的方法可以清理數據庫插入的用戶數據),但此步驟還可以包括修剪空白區域,褻瀆過濾,標記轉換等。

將用戶內容發送到不允許惡意行為的瀏覽器時,輸出轉義非常重要。 這意味着執行htmlentities()或其他一些選擇性篩選過程。

您還可以執行其他操作,例如資源限制(DOS預防),表單令牌(CSRF保護)等。轉到OWASP並開始閱讀。

Web開發的黃金法則之一是永遠(永遠!)信任用戶輸入。 因此,在數據進入數據庫的任何地方,都應該調用mysql_real_escape_string()。

此外,為了防止將來生氣的客戶,您應該定期備份您的數據庫。 如果我是你的客戶,我現在會生氣。

祝你的網站安全。

防止SQL注入的最佳方法是使用預准備語句和綁定變量。 您使用的是哪個版本的MySQL? 准備好的聲明有4.1及更高版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM