0

だから私はこのPHP関数を持っています:

public static function findByPageAndFieldContains($recordsPerPage, $page, $field, $searchterm) {
    $query = CouchbaseN1qlQuery::fromString('SELECT * FROM `public_portal` WHERE `collection`=$collection AND `'.$field.'` LIKE "%'.$searchterm.'%" ORDER BY `_id` limit $limit offset $offset');
    $query->options['$collection'] = static::COLLECTION_NAME;
    //$query->options['$field'] = $field;
    $query->options['$limit'] = $recordsPerPage;
    $query->options['$offset'] = $recordsPerPage*($page-1);
    //$query->options['$searchterm'] = $searchterm;

    $result = DB::getDB()->query($query);
    //var_dump($query);
    //var_dump($result);
    $objects = array();
    foreach($result as $row) {
        $object = new static($row->{"public_portal"});
        $object->setId($row->{"public_portal"}->{"_id"});
        $objects[] = $object;
    }
    //var_dump($objects);
    return $objects;
}

このクエリは、n1ql インジェクションに対して脆弱です。知っている。なんで?プレースホルダー(現在はコメント済み)を使用すると、結果が得られませんでした。解決できない場合は、2 つ目の質問を投稿します。

ここで質問したいのは、この関数は、ユーザーがドキュメントを検索したときにドキュメントをうまく見つけることができるかということです。ただし、フィールドが整数の場合、結果は表示されません。LIKE を「=」に置き換えようとし、引用符と % の両方を削除しました。その後、ユーザーは整数フィールドで数値を正常に検索できます。しかし、ユーザーは文字列フィールドを検索できなくなります。何か案は?

4

1 に答える 1

1

わかった。n1ql ステートメントに TOSTRING() を追加したところ、string と int の両方で機能するようになりました。

public static function findByPageAndFieldContains($recordsPerPage, $page, $field, $searchterm) {
    $query = CouchbaseN1qlQuery::fromString('SELECT * FROM `public_portal` WHERE `collection`=$collection AND TOSTRING('.$field.') LIKE "%'.$searchterm.'%" ORDER BY `_id` limit $limit offset $offset');
    $query->options['$collection'] = static::COLLECTION_NAME;
    //$query->options['$field'] = $field;
    $query->options['$limit'] = $recordsPerPage;
    $query->options['$offset'] = $recordsPerPage*($page-1);
    //$query->options['$searchterm'] = $searchterm;

    $result = DB::getDB()->query($query);
    //var_dump($query);
    //var_dump($result);
    $objects = array();
    foreach($result as $row) {
        $object = new static($row->{"public_portal"});
        $object->setId($row->{"public_portal"}->{"_id"});
        $objects[] = $object;
    }
    //var_dump($objects);
    return $objects;
    return $result;
}
于 2016-07-08T13:29:39.503 に答える