[英]Converting from mysql_query's to prepared statements (mysqli/PDO)? Necessary?
在過去的幾周里,我一直在學習PHP和MySQL,而我現在剛聽到有關准備好的語句和PDO / mysqli的信息。 我讀了一些書,有人說:
$getFromDatabase = mysql_query("SELECT * FROM table WHERE userid='$id'");
while($row = mysql_fetch_assoc($getFromDatabase)){
stuff();
}
...將不再工作。 我在代碼中經常使用類似的東西。 我還閱讀了很多有關准備好的語句如何更好地防止注入的信息。 我對它的更好之處有透徹的了解,但是它好得多了,值得從mysql_real_escape_string()切換過來嗎? 是否需要切換到Mysqli或PDO? 在什么情況下可以繞過mysql_real_escape_string()的地方?
這是必要的,因為從軟件角度來講, mysql_query
是一個古老的工件。 這是福特T型車的MySQL數據庫接口,笨重,不可靠,而且非常危險,如果你不能准確使用。 如果您不太謹慎,那么您將犯錯,並且即使有人在您的站點上使用自動SQL注入漏洞檢測工具 ,也不會引起微小的錯誤。
基本上,您是靠mysql_query
。
如果您使用mysqli
或PDO並努力使用占位符,則SQL注入錯誤的風險非常低。 可能需要大約半小時的時間才能弄清楚如何將舊代碼轉換為這些新方法,實際上並沒有那么陡峭的學習曲線,而且這種知識將來會為您節省很多麻煩。 如果使用mysqli
和基本占位符,則轉換現有代碼通常沒什么大不了的。 我敢打賭,在修補問題時,您甚至還會發現一些嚴重的錯誤。
就好處而言,您無需進行任何mysql_real_escape_string
調用,只需使用bind_param
,而且您不必擔心會丟失其中一個變量的轉義。 從長遠來看,實際上要少很多工作。
此外,使用?
或諸如:id
類的命名占位符可以使您的查詢明顯更易於閱讀,調試和維護。 此外,您可以重復使用同一條語句並將不同的值綁定到該語句,最終使您的應用程序更快。
可以使用mysql_query
編寫安全的代碼,但是為什么呢? 該接口被列為已棄用,這是從PHP完全刪除該接口的初步階段。 如果您想要面向未來的應用程序,則最好使用受支持的接口之一。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.