2

完全なルートアクセス権を持つ専用サーバー (Ubuntu Server 8.10) で PHP 5 と MySQL 5 を実行しています。継承したいくつかの LAMP コードをクリーンアップしており、このタイプの構成で多数の SQL 選択を行っています。

SELECT ... FROM table WHERE
  LCASE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
    strSomeField, ' ', '-'), ',', ''), '/', '-'), '&', ''), '+', '')
  ) = $somevalue

そもそもデータベースがそのような選択を要求するように構築されるべきではないという事実を無視し、ギャップのあるセキュリティホールを塞ぐために $somevalue フィールドをパラメーター化する必要があります.WHERE条件を何かに修正するための私の最良のオプションは何ですか?攻撃性が低い?MSSQL や Oracle を使用していた場合は、単純にユーザー定義関数を作成しますが、MySQL の経験は限られているため、これまで UDF を構築したことはありませんでした。ただし、C のコーディングには満足しています。

更新:元のコードで既に眉をひそめている人のために説明すると、$somevalue は実際には $GET['product'] のようなもので、テーマにはいくつかのバリエーションがあります。この場合、select は、以前に URI パラメーターとして渡されたものと一致するように文字を削除した後、製品名でデータベースから製品を引き戻しています。

4

5 に答える 5

1

ああ、それは楽しいものです。strSomeField に対する処理の概要は次のとおりです。

  • スペースとスラッシュはハイフンになります
  • コンマ、アンパサンド、プラス記号は削除されます
  • 小文字に変換

これは、MarkusQ がリンクした regexp_replace ユーザー定義関数を追加しない限り、MySQL で簡単に実行できません。MySQL の再コンパイルが必要になると思います。

これが不要になるように、テーブル内のすべてのデータを単純に処理するオプションはありますか? strSomeField のすべての値を選択する PHP スクリプトを作成し、上で要約したのと同じ処理を実行して、行を新しい値で更新します。それとも、これによりアプリケーションの他の部分が壊れますか?

于 2009-02-25T20:08:21.610 に答える
0

前処理された strSomeField 列を使用して新しいフィールドを作成する場合は、strSomeField が変更された場合に自動的に更新するトリガーを追加する必要があります。いくつかの頭痛を解消するかもしれません。

于 2009-02-26T11:57:09.753 に答える
0

以前に URI パラメータとして渡されたものと一致するように、文字を削除した後。

おー。何度も何度も同じ落とし穴。

製品名をキーとして使用しないでください。

SO の作成者はあなたよりも経験が浅いと思いませんか?
しかし、SOの質問のURLを見てください:
stackoverflow.com/questions/ 587422 /how-can-i-clean-up-this-select-query
彼らは数字キーを使用し、残りは装飾のためだけに使用します。
そのため、名前はいつでも編集できますが、ページは同じままです。確かに、あなたのような問題はありません。

データベースの問題ではありません。設計上の問題です。間違いだと思います。

于 2010-05-31T05:13:19.393 に答える