高手整理的PHP+MySQL安全方案

來源:互聯網
上載者:User

1 不要依賴於伺服器端的magic_quotes,雖然他們預設都是開啟的(magic_quotes_gpc)

將下面兩個關閉

ini_set("magic_quotes_runtime", 0);
ini_set("magic_quotes_sybase", 0);

全部自己手工對所有變數添加magic_quotes,就是添加addslashes

代碼如下:

function stripslashes_deep($value){
    $value = is_array($value) ?
    array_map('stripslashes_deep', $value) :
    stripslashes($value);
    return $value;
}

function strip_slashes(){
    // If already slashed, strip.
    //把原有的slash去掉,重新添加自己的magic_quotes
    if ( get_magic_quotes_gpc() ) {
        $_GET    = stripslashes_deep($_GET);
        $_POST   = stripslashes_deep($_POST  );
        $_COOKIE = stripslashes_deep($_COOKIE);
        $_SERVER = stripslashes_deep($_SERVER);
        $_REQUEST = stripslashes_deep($_REQUEST);
    }
    $_GET    = add_magic_quotes($_GET   );
    $_POST   = add_magic_quotes($_POST  );
    $_COOKIE = add_magic_quotes($_COOKIE);
    $_SERVER = add_magic_quotes($_SERVER);
    $_REQUEST = add_magic_quotes($_REQUEST);
}

strip_slashes();

 
顯示的時候全部stripslashes還原,雖然這很麻煩,不過如果你有一個模板引擎,可以在變數賦值的時候,統一作這個事情,

例如:

function assign($var, $value = '') {
  if (is_array($var)) {
   foreach ($var as $k => $v) {
    $this->vars[$k] = stripslashes_deep($v);
   }
  } else {
   $this->vars[$var] = stripslashes_deep($value);
  }
 }


這樣可以避免' " 等符號,下面還會有說明

2 對於使用者名稱這樣的欄位,輸入時候,檢查不允許有空格,而且必須是字母數字底線或劃線這四種,用正則檢查

還有諸如結點名,菜單名,角色名稱這些不需要用' " 的,一定要在錄入之前就檢查,或者用替換為空白

3 所有ID為數位變數,必須檢查是否為數字,並將變數強制轉換成數字

如果ID是前面帶0的或者字元型的,可用編碼規則對其進行檢查,例如全是數位正則

4 對於php的mysql函數,由於天生一次只能執行一條語句,即;不會自動斷。所以無法通過追加語句實現注入,只可能通過將語句插入到變數中來起作用注入,所以對於delete ,select,update都可能有破壞作用。

例如:

delete from tbl_users where user_id = 'admin' 變成 delete from tbl_users where user_id = 'admin or user_id<>'0',即在輸入欄為:admin or user_id<>'0

所以對於變數參數:
不該有空格的,空格要去掉
該位元字的,一定要轉換成數字
有編碼規則的,一定要檢查編碼規則
有長度限制的一定要加入長度限制
絕對不會有注入語句的,就篩查sql關鍵字
將一些危險字元進行替換,例如用“代替",空格用%20代替,特殊字元轉成html等等
當然用addslashes還是有明顯效果的,對於php來說,要想在變數中插入條件,必須通過'來完成,所以這一招可以徹底斷了所有企圖
 
5 apache,php,mysql不要以系統使用者運行

6 串連mysql不要用root

7 系統的所有錯誤資訊必須關閉或者屏蔽

8 屏蔽非主流瀏覽器的user-agent

9 記錄所有的sql操作和使用者ip,如果發現危險語句,可以立刻屏蔽該IP,例如3天
  如果是使用者登入後,有危險sql注入的語句,直接刪除該使用者,同時屏蔽IP

10 對於驗證碼要可以採用使用中文,變換字串樣式,必須點擊彈出等方法

11 如果還是不安全,就要像電子銀行那樣,用U盾和專用控制項了

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.