我正在尝试通过检查几个不同的数据库字段来构建MySQL查询以返回适当的搜索结果。例如,如果用户搜索“管道工利兹”,如果某个企业在“城市”字段中“利用”并且“管道工”这个词作为其名称的一部分,我希望返回该搜索结果。
用户搜索可能包含多个单词且无法预测。我目前通过爆炸搜索术语,修剪它并使用它来编译复杂的搜索查询以返回所有相关结果来实现我所需要的。
我将这个复杂的查询存储在一个变量中,并使用Codeigniter的Active Record来运行查询。
$this->db->where($compiled_query, null, false);
我担心的是我没有用反引号来保护查询,我不确定这是否是一个安全问题。我已启用XSS Clean但仍不确定这是否正常。
根据CI的用户手册: $ this-> db-> where()接受可选的第三个参数。如果将其设置为FALSE,CodeIgniter将不会尝试使用反引号来保护您的字段或表名。
来源:http://ellislab.com/codeigniter/user-guide/database/active_record.html
有关如何在单独的问题中编译查询的一些信息。我知道mysql_real_escape_string即将被弃用,并不是一个全能的,因此我担心这个方法。
任何帮助表示赞赏
答案 0 :(得分:3)
反引号与安全性无关。它们实际上只是一种“字符串化”字段和表名的方法,因此您可以使用名为datatype
的字段,而不会与mysql关键字冲突
你很安全
答案 1 :(得分:1)
我不会说你绝对“安全”,因为如果你在SQL查询中接受用户输入,你就不会在技术上安全了(即使你已经操纵过它......当有遗嘱时,有一个方式)。
一旦您放弃对应用程序的控制权,您必须非常小心地处理这些数据,这样就不会让自己受到注入攻击。
XSS Clean将帮助POST
或Cookie数据 - 它不会自动在GET
个变量上运行。如果它来自$data = $this->security->xss_clean($data);
数组,我会在输入上手动运行GET
。