簡體   English   中英

防止SQL注入

[英]Protect against SQL injection

我正在開發一個網站,我正在努力保護連接部分。

我在$login上使用了addslashes函數來停止SQL注入,但有些朋友告訴我安全性不夠。 但是,他們沒有告訴我如何利用此漏洞。

我怎么能/你能破壞這段代碼? 我該如何保護它?

<?php

    if ( isset($_POST) && (!empty($_POST['login'])) && (!empty($_POST['password'])) )
    {
        extract($_POST);
        $sql = "SELECT pseudo, sex, city, pwd FROM auth WHERE pseudo = '".addslashes($login)."'";
        $req = mysql_query($sql) or die('Erreur SQL');
        if (mysql_num_rows($req) > 0)
        {
            $data = mysql_fetch_assoc($req);
            if ($password == $data['pwd'])
            {
                $loginOK = true;
            }
        }
    }
    ?>

您應該使用mysql_real_escape_string在查詢中轉義字符串輸入參數。 使用類型轉換來清理數字參數和白名單以清理標識符。

在引用的PHP頁面中,有一個登錄表單中的sql注入示例。

更好的解決方案是使用預准備語句,您可以使用PDOmysqli來完成

您以明文存儲密碼! 如果我看到一個,這是一個重大的安全問題。 怎么辦有關:至少使用密碼的(每用戶)鹽漬哈希,因為看到如這里

采用:

mysql_real_escape_string($inputToClean);

還有另一個巨大的安全漏洞 - extract 它可以避免輸入幾個字符,但是打開了太多無法提及的漏洞,因為它會覆蓋任何全局變量。

如果我發布這個會怎么樣?

$_POST {
    'login' => 'Admin',
    'loginOK' => 1
}

猜猜看,$ loginOK現在是== 1,我將以管理員身份登錄。

以后可以節省很多時間,只使用你想要使用的變量,而不是依賴於extract的可怕黑客。

除了使用addslashes() ,這些是本代碼中的一些隨機問題:

  • isset($_POST)始終為TRUE ,除非您從命令行運行它。 你可以刪除它。
  • empty()非常棘手。 例如,如果$password = '0' empty($password)TRUE
  • 你可以這樣做: if( isset($_POST['login']) && $_POST['login']!='' ){}
  • extract($_POST)是一個巨大的漏洞:任何人都可以從外部設置代碼中的變量。
  • $password == $data['pwd']表示您將純文本密碼存儲在數據庫中。 那是一種可怕的做法。 谷歌為“鹽漬密碼”。
  • 你也可以做$loginOK = $password == $data['pwd']; 你明白為什么嗎? ;-)

你應該使用mysql_real_escape_string而不是addslashes

暫無
暫無

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

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