使用空参数运行PHP搜索脚本将返回整个MySQL表

时间:2011-10-17 21:44:43

标签: php mysql performance sql-injection user-input

当我通过PHP运行以下MySQL查询并且$_GET()的所有元素都是空字符串时,volunteers表中的所有记录都会被返回(原因很明显)。

$first = $_GET['FirstName'];
$last = $_GET['LastName'];
$middle = $_GET['MI'];

$query = "SELECT * FROM volunteers WHERE 0=0";

if ($first){
    $query .= " AND first like '$first%'";
}

if ($middle){
    $query .= " AND mi like '$middle%'";
}

if ($last){
    $query .= " AND last like '$last%'";
}

$result = mysql_query($query);

允许将空参数发送到此脚本的最优雅方法是什么,结果是返回空$result

3 个答案:

答案 0 :(得分:2)

我的解决方案:

$input = Array(
    'FirstName' => 'first',
    'LastName'  => 'last',
    'MI'        => 'mi'
);

$where = Array();
foreach($input as $key => $column) {
    $value = trim(mysql_escape_string($_GET[$key]));
    if($value) $where[] = "`$column` like '$value%'";
}
if(count($where)) {
    $query = "SELECT * FROM volunteers WHERE ".join(" AND ", $where);
    $result = mysql_query($query);
}

答案 1 :(得分:1)

如果没有任何查询可以执行,那么运行(可能)昂贵的查询是没有意义的。因此,如果没有条款,则不要尝试提出替代查询以防止搜索无条件,如果没有条款,则根本不要运行搜索:

$where = '';
... add clauses ...
if ($where !== '') {
   $sql = "SELECT ... WHERE $where";
   ... do query ...
} else {
   die("You didn't enter any search terms");
}

答案 2 :(得分:0)

使用当前代码,如果所有内容都为空,您将获得WHERE 0 = 0 SQL,该表对于表中的所有行都为TRUE。

您所要做的就是删除if语句......