Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何安全地通过字段名和参数传递订单?_Php_Mysql_Sql Injection_Meekro - Fatal编程技术网

Php 如何安全地通过字段名和参数传递订单?

Php 如何安全地通过字段名和参数传递订单?,php,mysql,sql-injection,meekro,Php,Mysql,Sql Injection,Meekro,我正在一个PHP项目中使用MeekroDB。对于某些查询,我需要传递任意字段名进行排序。meekro网站上没有订单条款的例子 如何安全地传递字段名并避免SQL注入漏洞?我意识到我可以事先用有效字段列表检查每个字段名,但我正试图将此代码更一般化为一个基本的“get”函数:函数get(数组$filters,数组$sort_by) %b占位符(反勾号)是否足以在传递字段名时防止任意代码注入 例如: SELECT * FROM table1 ORDER BY %b 或对于多个字段: SELECT *

我正在一个PHP项目中使用MeekroDB。对于某些查询,我需要传递任意字段名进行排序。meekro网站上没有订单条款的例子

如何安全地传递字段名并避免SQL注入漏洞?我意识到我可以事先用有效字段列表检查每个字段名,但我正试图将此代码更一般化为一个基本的“get”函数:函数get(数组$filters,数组$sort_by)

%b占位符(反勾号)是否足以在传递字段名时防止任意代码注入

例如:

SELECT * FROM table1 ORDER BY %b
或对于多个字段:

SELECT * FROM table1 ORDER BY %lb
这安全吗


此外,如何根据需要任意包含DESC或ASC修饰符?

是的,您可以为此目的安全地使用
b
lb
,因为两者都是使用安全的方法实现的

不幸的是,方向修改器应该像这样用手消毒

$dirs  = ["ASC","DESC"]; 
$key   = array_search($_GET['dir'], $dirs); // see if we have such a value
$dir   = $dirs[$key]; //if not, first one will be set automatically. smart enuf :)
$query = "SELECT * FROM table1 ORDER BY %b $dir"; //value is safe

谢谢你的回答!如何添加多个ORDER BY字段,每个字段都有自己的方向修改器?例如,从表1中按
field1
DESC、
field2
ASC顺序选择*?实际的meekro DB::query()函数看起来如何?(我意识到我可以遍历订单字段,为每个“字段”和“方向”说明符添加%b%l。但我不明白如何动态地将它们传递给DB::query函数。这将是一项艰巨的任务。我建议在Meekro github上打开一个问题,描述一种情况,并建议b和lb修饰符都可以接受由字段名和方向组成的数组。或者,您可以使用单独的
b
s来接受您自己的建议。我应该不太复杂。使用单独的%b和%l需要将任意数量的参数传递给DB::query()。我必须使用eval调用它,我觉得这不是一个好的做法。有什么建议吗?永远不需要eval。因为PHP5.6有一个很好的splat操作符,当您可以为接受参数列表的函数发送数组时,就像这样:
$results=DB::query($sql,$parameters)
如果你的PHP已经过时,那么你必须坚持使用
call_user\u func\u array()
很好。我不知道那个操作符!太好了。