我的公司希望在他们的网站上使用WordPress,我主要关心的是使用准备好的语句。根据这的说法,我不相信自己读了源代码,WordPress清除了字符串,但是不是在数据库中准备的。
我能做些什么才能得到真实的东西吗?还是我的担忧是没有根据的?
发布于 2016-07-05 23:26:06
历史
要理解wpdb类(最初是贾斯汀·文森特的ezSQL库的叉子 )是在发布MySQL准备语句协议之后引入的,只有在MySQL准备语句协议发布之后才引入几个月,而且一年前 PHP对访问它有任何API支持:因此,WordPress做了它当时能够做的唯一事情,并且需要将任何变量直接连接到动态SQL中。
当时,ezSQL (因此也是WordPress)使用使用 PHP的mysql_escape_string()函数来逃避这些文字--因此不知道数据库连接的实际编码(这个威胁只有在PHP本身的几个月前中才能解决)。
这仍然是WordPress(仅)针对SQL注入近两年的防御,因此它可以使用(更不安全的) addslashes()来逃跑--这种情况一直保持到mysql_real_escape_string()最终成为利用 (尽管wpdb::prepare()是介绍 in 过渡时期)为止!
直到五年开始使用WordPress --一种能够编写原生语句的驱动程序(即MySQLi)--才实现了这一点:就在两年前,正如@naththedeveloper 已指出一样,票#21663中的讨论表明,使用本机准备的语句甚至可能不在待办事项清单上。
现状
不幸的是,由于MySQLi对象是没有getter (并在内部分配实例化期间)的wpdb类的受保护成员,所以您无法使用带有WordPress的数据库连接的本机准备语句(至少,不使用您自己的类来修改/替换wpdb )。
我能做些什么才能得到真实的东西吗?
当然,您可以打开您自己的/单独的数据库连接,您可以根据自己的意愿灵活地完成该连接。
还是我的担忧是没有根据的?
尽管本机语句准备很棒(我同意它确实应该是任何新项目中针对SQL注入的默认防御策略),但它也有它的缺点。小心地转义变量以用作SQL文本(例如,PDO准备好的语句模拟所做的工作;这正是wpdb::prepare()最近试图提供的),应该能够抵抗所有已知的攻击.
https://stackoverflow.com/questions/38206366
复制相似问题