我的公司希望将WordPress用于他们的Internet站点,我主要关注的是使用预准备语句。根据{{3}},我自己难以置信地阅读了源代码,WordPress清理字符串但在数据库中不。
我能做些什么来获得真实的东西吗?或者我的担忧没有根据?
答案 0 :(得分:10)
了解wpdb
a fork Justin Vincent's ezSQL library的way back in 2003类是a couple of months引入的a year before,只是在used发布了MySQL预编译语句协议之后比mysql_escape_string()
PHP 任何 API支持访问它:WordPress因此做了唯一的事情,并且要求任何变量直接连接到动态SQL。
那时候,ezSQL(以及WordPress)just a few months earlier PHP的for nearly two years函数来逃避这些文字 - 因此不知道数据库连接的实际编码(仅在PHP本身解决的威胁) switched)。
这仍然是WordPress(仅)对SQL注入addslashes()
的防御,因此for over four years使用(更不安全)mysql_real_escape_string()
进行转义 - 这种情况随后仍然存在{ {3}}直到utilised 终于 wpdb::prepare()
(尽管introduced the interim已another five years}!
然后不是using,直到WordPress开始MySQLi本地语句准备的驱动程序 (即already pointed out):现在这个两年前,作为@naththedeveloper ticket #21663,a protected member中的讨论表明,使用本地预处理语句甚至可能不在待办事项列表中。
不幸的是,由于MySQLi对象是wpdb
类的during instantiation,其中没有getter(并且在内部分配its downsides),因此您无法使用本机预处理语句使用WordPress的数据库连接(至少,不能不用自己的类修改/替换wpdb
)。
我能做些什么来获得真实的东西吗?
当然,您可以打开自己的/单独的数据库连接,您可以根据自己的需要完全灵活地进行连接。
或者我的担忧没有根据?
与原生语句准备一样好(并且我同意它确实应该是任何新项目中针对SQL注入的默认防御策略),它也有http://shiny.rstudio.com/gallery/actionbutton-demo.html。仔细转义一个变量以用作SQL文字(例如,由PDO准备好的语句模拟完成;以及这些日期试图提供的wpdb::prepare()
应该对所有已知的攻击...
答案 1 :(得分:0)
本地的MySQLi准备查询不可用。 https://core.trac.wordpress.org/ticket/42352已开放并正在进行一些活动