MySQLにアクセスするアプリケーションは,ユーザーによって入力されるあらゆるデータを信頼しないようにしてください。ユーザーはWebフォーム,URL,または構築されたあらゆるアプリケーションに特殊文字またはエスケープ文字のシーケンスを入力することによってコードを欺くことを試すことができます。ユザが「;减少数据库mysql;
」のような入力を行なっても,アプリケションがセキュアな状態に保たれるようにしてください。これは極端な例ですが,同様の技術を使用するハッカーに備えていない場合,結果として大規模なセキュリティーリークおよびデータ損失が発生することがあります。
よくある過は,文字列デタ値のみ保護することです。数値デタも忘れずに検査してください。ユザが234
という値を入力したとき,アプリケションがSELECT * FROM ID=234的表
のようなクエリを生成する場合,ユは234或1 = 1
という値を入力して,从ID=234或1=1的表中选择*
というクエリをアプリケションに生成させることができます。その結果,サバはテブル内のすべての行を取得します。これはすべての行を公開し,サバに過剰な負荷がかかります。この種類の攻撃から保護するためのもっとも簡単な方法は,数値定数を囲む単一引用符を使用して,SELECT * FROM ID='234'的表
とする方法です。ユザが余分の情報を入力すると、その情報はすべて文字列の一部となります。数値コンテキストでは、MySQL は自動的にこの文字列を数値に変換し、あとに続く数値以外のすべての文字を取り除きます。
データベースに格納されているデータが公開されているもののみであれば,保護は不要だと思われることもあります。これは正しくありません。データベース内のどの行も表示が許可されている場合であっても,サービス妨害攻撃(前のパラグラフの技術に基づいた,サーバーにリソースを浪費させるものなど)から保護するべきです。そうしない場合,サバは正当なユザに対して応答不能になります。
チェックリスト:
厳密なSQLモードを有効にして,サーバーが受け入れるデータ値の制限を厳しくするようサーバーに指示します。セクション5.1.7 "サバSQLモド"を参照してください。
すべてのWebフォムに単一引用符または二重引用符(「
'
」および「"
」を入力してみます。何らかの種類のMySQLエラが出る場合,すぐに問題を調査してください。動的urlに
% 22
(「"
」)、% 23
(「#
」),および% 27
(「'
」)を追加して,これらを変更してみます。前の例で示した文字を使用して,動的urlのデタ型を数値型から文字型に変更してみます。これらの攻撃や類似の攻撃に対してアプリケションが安全であるようにしてください。
数値フィルドに,数値でなく文字,スペス,および特殊記号を入力してみます。アプリケションはこれらをMySQLに渡す前にこれらを削除するか,またはエラを生成します。検査済みでない値をMySQLに渡すことは非常に危険です。
デタをMySQLに渡す前にデ。
アプリケーションがデータベースに接続するときは,管理目的で使用するものとは異なるユーザー名を使用するようにしてください。アプリケションに不要なアクセス権限を付与しないでください。
多くのアプリケーションプログラミングインタフェースには,データ値の特殊文字をエスケープする手段が備わっています。適切に使用すれば,これにより,意図とは異なる効果を持つステートメントをアプリケーションに生成させる値を,アプリケーションユーザーが入力できないようにすることができます。
MySQL C API:
mysql_real_escape_string ()
APIコルを使用してください。MySQL++:クエリストリムに対して
逃避
および报价
修飾子を使用してください。PHP:
mysqli
またはpdo_mysql
拡張子を使用し,古いext / mysql
拡張子を使用しないでください。推奨されるAPIはプレースホルダを持つプリペアドステートメントのほかに,改善されたMySQL認証プロトコルおよびパスワードをサポートします。选择一个APIも参照してください。古い
ext / mysql
拡張子を使用する必要がある場合,エスケ,プのために,mysql_real_escape_string ()
関数を使用し,mysql_escape_string ()
またはaddslashes ()
を使用しないでください。これは,mysql_real_escape_string ()
のみが文字セットを認識し,ほかの関数は,(無効な)マルチバe .ト文字セットを使用したときに「バ邮箱パスされる」可能性があるためです。Perl DBI:プレスホルダまたは
报价()
メソッドを使用してください。Ruby DBI:プレスホルダまたは
报价()
メソッドを使用してください。Java JDBC:
PreparedStatement
オブジェクトおよびプレスホルダを使用してください。
ほかのプログラミング邮箱ンタフェ邮箱スも似たような機能を持っている場合があります。