我的公司希望將WordPress用於他們的Internet站點,我主要關心的是使用準備好的語句。根據this和我自己難以置信地閱讀源代碼,WordPress對字符串進行了清理,但是在數據庫中準備的不是。我可以做些什麼來獲得Wordpress中的實際準備報表
有什麼我可以做的,以獲得真實的東西?或者我的擔心是沒有根據的?
我的公司希望將WordPress用於他們的Internet站點,我主要關心的是使用準備好的語句。根據this和我自己難以置信地閱讀源代碼,WordPress對字符串進行了清理,但是在數據庫中準備的不是。我可以做些什麼來獲得Wordpress中的實際準備報表
有什麼我可以做的,以獲得真實的東西?或者我的擔心是沒有根據的?
記者瞭解到,wpdb
類,原來的Justin Vincent's ezSQL library,引入way back in 2003,只有a couple of months後MySQL的預處理語句協議被釋放,超過a year before PHP有訪問它任何 API支持:WordPress的因此它做了唯一的事情,並且需要將任何變量直接連接到動態SQL中。
那時候,ezSQL(因而WordPress的)used PHP的mysql_escape_string()
功能逃脫這樣的文字,因此是無知的數據庫連接的實際編碼(即以前只在PHP本身just a few months earlier得到解決的威脅)的。
這仍然是對SQL注入for nearly two years的WordPress的(只)的防守,於是它switched使用(偶數較不安全)addslashes()
轉義-一種情況,則留在地方for over four years直到mysql_real_escape_string()
是最後utilised(雖然wpdb::prepare()
有已在introduced在the interim)!
那麼這是不是爲another five years直到WordPress的甚至開始using驅動本地報表編制相關的能夠(即MySQLi):這個現在只是在兩年前,作爲@naththedeveloper already pointed out,在ticket #21663的討論表明,使用本地準備的語句可能甚至不在待辦事項列表中。
不幸的是,因爲庫MySQLi對象是wpdb
類,其沒有吸氣(和內部during instantiation分配)的a protected member,有沒有辦法,你可以使用與WordPress的數據庫連接的本地預處理語句(至少,不是沒有修改/用你自己的班級替換wpdb
)。
我能做些什麼來獲得真實的東西嗎?
當然,您可以打開自己的/單獨的連接到數據庫,您可以根據需要完全靈活地進行連接。
或者我的擔心是沒有根據的?
就像本地語句準備一樣(我同意它確實應該是任何新項目中針對SQL注入的默認防禦策略),它也有its downsides。仔細轉義變量以用作SQL文字(例如,由PDO準備的語句仿真完成;例如;這是什麼wpdb::prepare()
這些天試圖傳遞)應該應該抵抗所有已知的攻擊......
我最初的評論很好的擴展,我不知道所有這些,所以+1幫助我今天學習了一些東西 – naththedeveloper
根據['wpdb :: prepare()'](https://developer.wordpress.org/reference/classes/wpdb/prepare/),WordPress實際上在執行前清理完整的SQL字符串;有**沒有綁定的變量**正確的SQL注入預防。如果這涉及到你,那麼你肯定可以自由地將'mysqli_ *'或PDO類合併到你的代碼中,而不是依靠wpdb。另請參閱http://wordpress.stackexchange.com/a/174591/81625 – MonkeyZeus
我已經深入研究了使用PDO和WordPress進行廣泛搜索,並且從未發現任何正確利用它的方法。幾年前曾有人提出要修改'$ wpdb'來正確使用PDO,但它只是從'mysql_'切換到'mysqli_'函數,因爲它太多了。我懷疑是基於已經進行的長時間討論,這個(準備好的陳述的正確用法)將會使它成爲核心。門票:https://core.trac.wordpress.org/ticket/21663 – naththedeveloper
@naththedeveloper在我的自定義應用程序/頁面中,我使用mysqli準備好的語句,所以我至少有覆蓋,但WordPress本身是否做到這一點?如果不是,那麼它可以處理諸如「SELECT SOURCE FROM LIBRARY_RECORD WHERE LIBRARY_RECORD_ID = 6550」或(1,2)=(select * from(select name_const(CHAR(111,108,111,108,111,115,104,101,114),1),name_const(CHAR(111,108,111,108,111,115,104,101,114) ,1))a) - 「x」=「x」,今天早上從服務器日誌中發出? –