2016-06-16 6 views
0

私は、ユーザが単純なブール論理を入力してそれをmySQL検索文字列に変換できるデータベース検索フィールドを用意しました。例えばのでユーザが入力したブール検索文字列をmySQLに変換

ユーザ入力の場合:(php AND mysql) OR ajax

私はそれを変換したい:

((c.Skillset LIKE '%php%' AND c.Skillset LIKE %mysql%) OR c.Skillset LIKE '%ajax%')

は、これを行うのはかなり簡単な方法はありますか?私はブラケットの解決策が出てくるのを特に困らせていますが、そうでなければそれはかなり簡単でしょう。

+0

このツールのユーザーはどの程度悪意のあると思われますか?最悪のユーザー以外は何も設計するべきではないことを知っていますが、有効であることを検証するために文字列をトークン化/解析する必要がある場合、それはいくつかのpreg_replacesを行うよりも難しい問題です。 – Steve

+0

さて、私は、htmlspecialcharsを実行することを計画していました。 'ajax'、 'mysql'などの検索項目を想定し、入力からロジックを解釈することによって何かが関数によって書き込まれます。私が理解しているように、検索文字列にandsとorsとbracketを配置するだけで、悪意のあるものではないので、それはうまくいくと思います。 – dlofrodloh

+0

しかし、 '(((((php AND mysql)OR ajax'例えば、有効なクエリではないでしょう。したがって、用語を適切にグループ化する括弧の数を一致させると、複雑さが増します。 – Steve

答えて

1

ここでは、SQL_PREFIX_STRINGという定数が定義されていることを前提としています。

$string = '(php AND mysql) OR java'; 
preg_match_all('/[a-z]+/', $string, $skills); // puts the skills in an array 
$skills = $skills[0]; // shift array to get the matching values 
array_walk($skills, function (&$skill) {$skill = '%'.$skill.'%';}); // add wildcards to parameters 

$query_string = preg_replace('/[a-z]+/', 'c.Skillset LIKE ?', $string); // create the ? parameters for the SQL string 

$pdoStatement = $pdo->prepare(SQL_PREFIX_STRING.$sql); // prepare 
$pdoStatement->execute($skills); // execute 
+1

上記は決して「最適」ではありませんが、何らかのレベルのセキュリティを提供しながら必要なものを達成します。また、置換ステートメントを追加して任意の単語や文字を削除することもできますあなたが許さないもの、例えば ";このコードの前に$ string変数から「DROP TABLE ...」を追加してください(ホワイトリストで最もうまくいっています)。 – Steve

+0

素晴らしいですが、これを使用してアプリケーションに合わせて少し修正します。 – dlofrodloh

関連する問題