PHP是一門流行的編程語言,擁有眾多實用的函數。其中一個函數是addslashes(),主要是為了在將數據存儲到數據庫中時,防止 SQL 注入攻擊。然而,此函數不僅不夠安全,而且還會造成一些錯誤。于是我們需要尋找替代函數。
用真實的情況來說明addslashes()函數存在的問題。 假設下面的腳本需要將一個叫作 O'Connell 的真實名字存儲到數據庫的一個字符串字段中。 此腳本使用的代碼如下:
$name = "O'Connell"; $sql = "INSERT INTO user (name) VALUES ('$name')"; $result = mysqli_query($conn, $sql);
當執行這個腳本時,將會產生一個 SQL 錯誤。 在這種情況下,如果使用addslashes()函數并重新運行相同的腳本,則不會發生錯誤,因為函數會將字符 O'Connell 中的單引號轉義為 \' 即:
$name = "O'Connell"; $name = addslashes($name); $sql = "INSERT INTO user (name) VALUES ('$name')"; $result = mysqli_query($conn, $sql);
然而,此函數存在一些問題。 當字符串中包含反斜杠(\)或 NUL 字符時,addslashes()函數會產生錯誤的結果。此外,如果在MySQL,請注意,如果當前下述語句在創建表時使用 ESCAPE '\'; , 那么mysql_escape_string()可以正確地保護反斜杠和 NUL字符,而addslashes()不能。因此需要使用類似htmlentities替代addslashes函數
使用php自帶的htmlentities()函數也可以實現相似的效果。此函數將字符轉換為HTML實體,包括單引號('),以防止 SQL 注入攻擊。示例代碼如下所示:
$name = "O'Connell"; $name = htmlentities($name, ENT_QUOTES, "UTF-8"); $sql = "INSERT INTO user (name) VALUES ('$name')"; $result = mysqli_query($conn, $sql);
上述示例中,ENT_QUOTES 常量告訴函數轉換單引號。UTF-8 常量指定編碼。
此外,還有另一個實用的函數使用mysql_real_escape_string()用來轉義一些字符。不過需要注意此函數并沒有多少用處,主要是在使用對于Mysql過時驅動程序內部MySQL句柄函數建立連接,進行查詢等操作。
$name = "O'Connell"; $name = mysql_real_escape_string($name); $sql = "INSERT INTO user (name) VALUES ('$name')"; $result = mysqli_query($conn, $sql);
然而,需要注意的是,如果您的編程語言庫支持 PDO(PHP 數據對象),并且您正在使用預處理語句的話,那么addslashes()或類似的函數將不再必需了。 預處理語句將確保正確地轉義變量,從而保護您的應用程序免受 SQL 注入攻擊。
總之,在開發 Web 應用程序時非常重要的是注意數據安全性。很多輸入應該被過濾,輸出也應該進行編碼。在處理數據時,應該遵循最佳安全規則,使您的應用程序免受任何侵害。幸運的是,對于 PHP 開發者來說,有很多實用函數可供使用,來提高您的應用程序的安全性。