2014-10-20 54 views
0

我正在編寫一次性電子郵件腳本,它解析傳入的電子郵件,去掉一些數據並將其插入數據庫,然後在頁面上顯示電子郵件。是否可以將惡意代碼插入到電子郵件中?

我該注意什麼?

例如,我解析電子郵件,並確保它的字母數字只(剝我的域名後,因爲我只接受字母數字ID),但它的安全插入發件人名稱 (解析從後:線)到DB顯示它在使用mysqli_real_escape_string()然後htmlentities()後?

+3

罷了,並用電子郵件過濾器中使用準備好的語句一起http://php.net/manual/en/filter.filters.validate.php – 2014-10-20 16:11:53

+0

是的,我認爲它足以應對SQL注入,但讓我給你提供一個保護數據的增強視圖 – 2014-10-20 16:19:45

回答

4

使用預處理語句和參數化查詢。這些是由數據庫服務器獨立於任何參數發送並解析的SQL語句。這樣攻擊者不可能注入惡意SQL。

  1. 使用pdo。

    $statement = $pdo->prepare('SELECT * FROM customers WHERE name = :name'); 
    $statement ->execute(array('name' => $name)); 
    foreach ($statement as $row) { 
        // do something with $row 
    } 
    
  2. 使用mysqli來防止安全失誤。數據的

    $statement= $dbConnection->prepare('SELECT * FROM customers WHERE name = ?'); 
    $statement->bind_param('s', $name); 
    $statement->execute(); 
    $result = $statement->get_result(); 
    while ($row = $result->fetch_assoc()) { 
        // do something with $row 
    } 
    
  3. mysqli的插入

代碼例如用於插入乾淨的數據。

$preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)'); 

$preparedStatement->execute(array('column' => $unsafeValue)); 

既然你問插入這裏是爲了防止SQL注入通過使用這種方法攻擊者自己也沒有這種機會的方法。

  • 框架的安全性。

    一個簡單的方法是使用像CodeIgniter或Laravel這樣的PHP框架,它具有諸如過濾和活動記錄等內置功能,這樣您就不必擔心這些細微差別。

  • 一些準則。

    用於轉義SQL語句中的特殊字符。不使用MySQL,不推薦使用此擴展,請使用MySQLiPDO

  • 1

    你應該小心代碼注入。基本上你要做的是:

    1)你確定的每個項目都是一個數字,將其解析爲數字(可能帶有try/catch),不要接受這些字段中的任何字符串。

    2)有時是一個很好的做法,以修剪()的字符串字段。這會清除場內所有不必要的空間。

    3)不要插入MySQL的原始方式。我不知道你在用什麼語言,但是大多數語言都有Mysql語句。因此,而不是做一個簡單的插入,你會做這樣的事情(Java示例):

    public static void main(String[] args) 
     
        { 
     
        try 
     
        { 
     
         // create a mysql database connection 
     
         String myDriver = "org.gjt.mm.mysql.Driver"; 
     
         String myUrl = "jdbc:mysql://localhost/test"; 
     
         Class.forName(myDriver); 
     
         Connection conn = DriverManager.getConnection(myUrl, "root", ""); 
     
         
     
         // create a sql date object so we can use it in our INSERT statement 
     
         Calendar calendar = Calendar.getInstance(); 
     
         java.sql.Date startDate = new java.sql.Date(calendar.getTime().getTime()); 
     
        
     
         // the mysql insert statement 
     
         String query = " insert into users (first_name, last_name, date_created, is_admin, num_points)" 
     
         + " values (?, ?, ?, ?, ?)"; 
     
        
     
         // create the mysql insert preparedstatement 
     
         PreparedStatement preparedStmt = conn.prepareStatement(query); 
     
         preparedStmt.setString (1, "Barney"); 
     
         preparedStmt.setString (2, "Rubble"); 
     
         preparedStmt.setDate (3, startDate); 
     
         preparedStmt.setBoolean(4, false); 
     
         preparedStmt.setInt (5, 5000); 
     
        
     
         // execute the preparedstatement 
     
         preparedStmt.execute(); 
     
         
     
         conn.close(); 
     
        } 
     
        catch (Exception e) 
     
        { 
     
         System.err.println("Got an exception!"); 
     
         System.err.println(e.getMessage()); 
     
        } 
     
        }

    看看上面的例子中,檢查如何準備好的語句插入。這是最安全的方式

    乾杯!

    希望它可以幫助

    相關問題