0

人!

WHEREから引数を取得するこのクエリがあります$_POST。重要なのは、値ごとにクエリを作成せずに、両方の比較値を動的に取得したいということです。私が今持っているのは:

$what = $mysqli->real_escape_string($_POST['what']);
........
$query = "SELECT * FROM list WHERE ";
$query .= $what . " = ? LIMIT 0,10";
........
$stmt->bind_param('s', $what);

私の最初の質問:これは実際にはどれくらい安全ですか?両方のパラメーターをバインドできないため、同じことを管理できる別のより良い方法はありますか?

= ?私が抱えている2番目の問題は、をに変更したいのですが、LIKE %?%動作させることができません。(悪い、私は知っている)を使ってみCONCAT('%', ?, '%')ましたが、それでも機能しません。基本的に私が最終的に達成したいのは:WHERE ? LIKE %?%。出来ますか?これで少し手伝ってもらえますか?

乾杯、アレックス

4

4 に答える 4

0

$where厳密なパラメータセットを確認するだけです。

if (!in_array($where, array("table1", "table2"))) {
   //do smth with wrong parameter
}

in_arrayは複雑に実行されているO(N)ため、パラメータのセットが大きい場合は、テーブル名をキーとして連想配列を使用することをお勧めします。

于 2013-02-11T15:07:39.143 に答える
0

mysql_real_escape_string または類似の関数はバッククォート (`) をエスケープしないため、アプリケーションは SQL インジェクションに対して脆弱です。

すべての列でホワイトリストを定義し、列が配列にあるかどうかを確認するだけです。

後に検索するには、検索語の前後にLIKE %?%a を追加します。%このことを適切にエスケープするには、次を参照してください: MySQL ワイルドカードのエスケープ

于 2013-02-11T15:09:56.587 に答える
-1

このように動的なクエリを実行することもできますが、WebサイトはSQLインジェクションに対して脆弱になります。

于 2013-02-11T15:07:47.083 に答える
-1

mysql_real_escape_string はバッククォートをエスケープしますが、手動でエスケープできます。
また、すべてのエスケープ処理を何らかのヘルパー ライブラリに移動することもお勧めします。したがって、データは 2 行で取得されます。

$sql  = "SELECT * FROM list WHERE ?n = ?s LIMIT 0,10";
$data = $db->getAll($sql, $_POST['what'], $_POST['where']);
于 2013-02-11T15:53:48.037 に答える