Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.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_Request_Sql Injection - Fatal编程技术网

Php 是否有一种更为动态的方式来清理订单

Php 是否有一种更为动态的方式来清理订单,php,mysql,request,sql-injection,Php,Mysql,Request,Sql Injection,我有一个from,其中两个字段如下 <select name="sortfield"> <option value="name" selected="selected">Name</option> <option value="price">Price</option> <option value="id">ID Code</option> </select> <sele

我有一个from,其中两个字段如下

<select name="sortfield">
    <option value="name" selected="selected">Name</option>
    <option value="price">Price</option>
    <option value="id">ID Code</option>
</select>
<select name="sortdir">
    <option value="asc" selected="selected">Ascending</option>
    <option value="desc">Descending</option>
</select>
很明显,这可能是sql注入的一个问题,我可以解决这个问题的一个方法是更改值,并在进行查询时使用一个切换案例来交换值,类似这样

switch($_REQUEST['sortfield'])
{
    case '5524879':
        $query .= "ORDER BY name";
        break;
    case '4587532':
        $query .= "ORDER BY price";
        break;
    default:
        $query .= "ORDER BY id";
}

虽然这有助于防止sql注入,但它不是非常动态的,因为如果查询/表结构发生更改,每次都必须更改页面,我想知道是否有一种更动态的方法来清理字符串,而不必使用
开关。。。case

一种更动态的方法是使用创建一个表字段数组,并在检查
sortfield

if ( !in_array( $_REQUEST['sortfield'], $table_fields ) ) {
    // error
}
我还建议不要使用$\u请求。你应该知道你的变量来自哪里

$\u请求中的变量通过GET提供给脚本, POST和COOKIE输入机制,因此可以通过 无法信任远程用户和。存在与秩序 此数组中列出的变量是根据PHP定义的 变量\u顺序配置指令


是的,对于ORDERBY子句,您只能格式化动态标识符,而无需对照白名单进行检查

if (!empty($_GET['sortfield']))
{
    $query .= "ORDER BY `".str_replace("`","``",$_GET['sortfield'])."`";
} else {
    $query .= "ORDER BY id";
}
请注意,它将保护您免受注入,但不会保存SQL语法错误-因此,最好还是验证字段名


此外,表中可能没有
id
字段,因此该代码也不是很动态。所以,不管怎样,最好还是坚持白名单。毕竟,这并不难。有时手动修改比自动修改更好。

用白名单验证值。@Gumbo如果你没有,他会这样做notice@SajunaFernando因为这里没有字符串?@sskoko和所有投票人:让你知道,这个函数在这里是无用的。
if (!empty($_GET['sortfield']))
{
    $query .= "ORDER BY `".str_replace("`","``",$_GET['sortfield'])."`";
} else {
    $query .= "ORDER BY id";
}