在PHP中,當我們需要將一段包含單引號或雙引號的字符串插入到數(shù)據(jù)庫中時,就需要使用到轉(zhuǎn)義字符。
轉(zhuǎn)義字符是一種通過在特殊字符前添加“\”來表示該字符的方法,因為一些特殊的字符像單引號、雙引號或者反斜杠本身也是一些特殊意義的字符。
代碼舉例: $var1 = 'I\'m dog'; $var2 = "I\"m cat"; echo $var1; // 輸出 I'm dog echo $var2; // 輸出 I"m cat
正如上面的例子,使用單引號的時候需要使用“\”將單引號轉(zhuǎn)義,使用雙引號的時候需要使用“\”來轉(zhuǎn)義雙引號。那么對于插入數(shù)據(jù)庫的時候,應該如何處理轉(zhuǎn)義呢?
PHP提供了一個函數(shù)對插入的字符串進行轉(zhuǎn)義處理,來避免數(shù)據(jù)庫注入攻擊,這個函數(shù)就是addslashes()
代碼舉例: $var3 = "I'm Tim"; $sql = "INSERT INTO users (username) VALUES ('".addslashes($var3)."')"; echo $sql; // 輸出 INSERT INTO users (username) VALUES ('I\'m Tim')
addslashes函數(shù)會在單引號、雙引號、反斜杠前面自動加上“\”,這樣就可以保證插入到數(shù)據(jù)庫中的字符串是不會出錯的。
但是,這個函數(shù)有一定的限制,因為在某些語境下可能會發(fā)生誤報轉(zhuǎn)義的情況,比如像O'Reilly這樣的字符串,就會被誤報成O\'Reilly,因為函數(shù)中會默認將O’作為單引號進行轉(zhuǎn)義處理。針對這種情況,可以通過關(guān)閉魔術(shù)引號(magic_quotes_gpc)來解決。
針對不同的轉(zhuǎn)義問題,PHP也提供了不同的函數(shù)給予解決:
- htmlspecialchars,將html特殊字符進行轉(zhuǎn)義,比如:< 轉(zhuǎn)義成 <,’ 轉(zhuǎn)義成 '。
- stripslashes,與addslashes對應,去除字符串中的轉(zhuǎn)義字符。
- [$mysqli->real_escape_string()](https://www.php.net/manual/en/mysqli.real-escape-string.php),針對mysqli連接擴展的轉(zhuǎn)義函數(shù),比addslashes()效率更高。
綜上所述,在開發(fā)中應該根據(jù)具體情況,選擇最適合的轉(zhuǎn)義方式來保證代碼的安全性。
下一篇php qq昵稱