Php 是否有一种更为动态的方式来清理订单
我有一个from,其中两个字段如下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
<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";
}