MySQL和PHP在開發中非常常用,它們的相互配合可以完成很多常規的業務需求。然而,由于開發人員的疏忽或不解規范,在數據的輸入、輸出或存儲過程中,容易出現惡意攻擊或程序崩潰的情況,這時候,轉義就顯得尤為至關重要。
轉義的主要目的是對特殊字符進行處理,以避免出現SQL注入或其他安全問題。MySQL提供了在增、刪、改之前對數據進行轉義的函數mysql_real_escape_string(), 而在PHP中也有addslashes()/stripslashes()這兩種方法。
<?php $username = "yang'yang"; $password = "'123456"; //使用mysql_real_escape_string轉義 $username = mysql_real_escape_string($username); $password = mysql_real_escape_string($password); //使用addslashes轉義 $username = addslashes($username); $password = addslashes($password); ?>
通常,我們在想要將用戶輸入插入到數據庫中時,要先對用戶輸入進行轉義。在PHP中,addslashes()函數可以將用戶輸入中的單引號、雙引號、反斜杠等特殊字符進行轉義,以免意外地產生SQL語句。如下:
<?php $str = "Is this Yang's cat?"; $str = addslashes($str); echo $str; ?>
而如果是使用MySQL自帶的函數進行轉義呢:
<?php $str = "Is this Yang's cat?"; $conn = mysqli_connect("localhost","my_user","my_password","my_db"); $query = "SELECT * FROM names WHERE name='".mysqli_real_escape_string($conn,$str)."'"; ?>
以上代碼中我們利用了mysqli_real_escape_string()函數。
$conn參數是一個連接對象,字符串"my_user"表示連接數據庫的用戶名,字符串"my_password"是連接的用戶密碼。
值得注意的是,SQL注入攻擊不只是針對SELECT語句的,很多可以執行SQL語句的操作都存在注入漏洞。例如INSERT語句、UPDATE語句、DELETE語句、ORDER BY語句等命令行。
另外還需要注意的是,轉義是為了安全,但過度的轉義會使數據流失精度,因此不同的場景需要采用不同的方式進行處理。例如,存儲路徑名時,反斜杠是非常重要的,此時可以用 addcslashes() 來保護數據。
總之,在編寫程序過程中必須要考慮到程序的安全性,尤其是涉及到用戶輸入需轉義的地方,加強轉義能較好地預防惡意輸入造成的破壞。同時,轉義也要謹慎使用,避免不必要的麻煩。