2

私はfromを持っています.2つのフィールドは次のとおりです

<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>

これは次のページで取得$_REQUEST[]され、クエリに追加されて、クエリの結果がどのようにソートされるかを決定します。迅速で汚い、サニタイズされていない方法はこれです

$query .= "ORDER BY ".$_REQUEST['sortfield']." ".$_REQUEST['sortdir'];

明らかに、これはSQLインジェクションの問題である可能性があります。これを修正できる1つの方法は、値を変更し、クエリを作成して値を交換するときにスイッチケースを使用することです。

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

これはSQLインジェクションを防ぐのに役立ちますが、クエリ/テーブル構造が変更されるたびにページを変更する必要があるため、あまり動的ではありません.switch ... case

4

2 に答える 2

1

より動的な方法は、show fieldsを使用してテーブル フィールドの配列を作成し、それをホワイト リストとして使用して、sortfield

if ( !in_array( $_REQUEST['sortfield'], $table_fields ) ) {
    // error
}

$_REQUEST をまったく使用しないこともお勧めします。変数がどこから来ているかを知っておく必要があります。

$_REQUEST の変数は、GET、POST、および COOKIE 入力メカニズムを介してスクリプトに提供されるため、リモート ユーザーによって変更される可能性があり、信頼できません。この配列にリストされる変数の存在と順序は、PHP の variables_order 構成ディレクティブに従って定義されます。

于 2013-10-22T05:31:03.467 に答える
1

はい、order by 句の場合、ホワイトリストと照合せずに、動的識別子のみをフォーマットできます。

if (!empty($_GET['sortfield']))
{
    $query .= "ORDER BY `".str_replace("`","``",$_GET['sortfield'])."`";
} else {
    $query .= "ORDER BY id";
}

インジェクションからは保護されますが、SQL 構文エラーからは保護されないことに注意してください。とにかく、フィールド名を確認することをお勧めします。

また、テーブルにフィールドがない可能性もあるidため、このコードもあまり動的ではありません。したがって、とにかくホワイトリストに固執することをお勧めします。結局のところ、それはそれほど難しいことではありません。自動修正よりも手動修正の方が優れている場合があります。

于 2013-10-22T05:36:02.533 に答える