我正在編寫一次性電子郵件腳本,它解析傳入的電子郵件,去掉一些數據並將其插入數據庫,然後在頁面上顯示電子郵件。是否可以將惡意代碼插入到電子郵件中?
我該注意什麼?
例如,我解析到電子郵件,並確保它的字母數字只(剝我的域名後,因爲我只接受字母數字ID),但它的安全插入發件人名稱 (解析從後:線)到DB顯示它在使用mysqli_real_escape_string()
然後htmlentities()
後?
我正在編寫一次性電子郵件腳本,它解析傳入的電子郵件,去掉一些數據並將其插入數據庫,然後在頁面上顯示電子郵件。是否可以將惡意代碼插入到電子郵件中?
我該注意什麼?
例如,我解析到電子郵件,並確保它的字母數字只(剝我的域名後,因爲我只接受字母數字ID),但它的安全插入發件人名稱 (解析從後:線)到DB顯示它在使用mysqli_real_escape_string()
然後htmlentities()
後?
使用預處理語句和參數化查詢。這些是由數據庫服務器獨立於任何參數發送並解析的SQL語句。這樣攻擊者不可能注入惡意SQL。
使用pdo。
$statement = $pdo->prepare('SELECT * FROM customers WHERE name = :name');
$statement ->execute(array('name' => $name));
foreach ($statement as $row) {
// do something with $row
}
使用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
}
mysqli的插入
代碼例如用於插入乾淨的數據。
$preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)');
$preparedStatement->execute(array('column' => $unsafeValue));
既然你問插入這裏是爲了防止SQL注入通過使用這種方法攻擊者自己也沒有這種機會的方法。
你應該小心代碼注入。基本上你要做的是:
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());
}
}
看看上面的例子中,檢查如何準備好的語句插入。這是最安全的方式
乾杯!
希望它可以幫助
罷了,並用電子郵件過濾器中使用準備好的語句一起http://php.net/manual/en/filter.filters.validate.php – 2014-10-20 16:11:53
是的,我認爲它足以應對SQL注入,但讓我給你提供一個保護數據的增強視圖 – 2014-10-20 16:19:45