質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.75%

  • PHP

    19211questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

URLクエリパラメータの改ざん対策について

解決済

回答 3

投稿

  • 評価
  • クリップ 5
  • VIEW 716

minoru23

score 14

サーバーのログに下記のようなログが大量に残っていました。
一部略しています。

[error] [client xx.xxx.xxx.x] PHP Warning:  mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/www/html/example.com/mysql.php on line 22, ref
erer: 
http://www.example.com/sample.php?page=5&u_sort=count&u_order=999999.9+%2f%2fuNiOn%2f%2faLl+%2f**%2fsElEcT+0x393133353134353632312e39,0x393133353134353632322e39,0x393133353134353632332e39,0x39313
3353134353632342e39,0x39313335313435363233352e39--

これは不正なアクセスを狙ったものでしょうか。
その場合、どのようにして対策をしたらいいのでしょうか?

パラメーターに数字以外が含まれていたらアクセス拒否したらいいのかなと思ったのですが、その方法が分かりません。

また、mysql.phpの該当箇所に@を入れてブラウザ上にエラー表示をしないようにしました。
これで根本的解決にはなっていないと思いますが、不正なアクセスをしようとしている人には効果があるのでしょうか?

どうかよろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+5

どのようにして対策をしたらいいのでしょうか?

まずは、「SQLインジェクションが起きないようにプログラムを作る」のが大前提です。バインドなどでSQL文をきちんと組み立てていれば、パラメータに何かをねじ込もうとするような攻撃が来ても、ログが残るだけで影響はありません。

基本的にHTTPアクセス自体を止めるのは得策ではありませんが、

  • 特定の帯域(あるクラウドサービス、あるいは特定の国)から来ることが判明していて、その帯域にサービスしなくても問題ない場合
  • 内輪向けのサービスなど、接続する人間が限られるような場合

には、IPアドレスレベルで接続を切ってしまってもいいかもしれません。

なお、

mysql.phpの該当箇所に@を入れてブラウザ上にエラー表示をしないようにしました。

本番環境では、error_reporting(0);でエラー表示を完全に止めておきましょう。閲覧者に表示させるのは攻撃の手がかりになるだけで、有害無益です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/31 23:58

    ありがとうございました。とても参考になりました。

    キャンセル

  • 2017/11/07 10:37

    > error_reporting(0);
    エラー表示を止めるのは ini_set("display_errors", 0); だと思います。
    構文エラーや、メモリ切れを起こすような巨大ファイルアップロードではini_set()する前に問題が出るかもしれないので、可能であればphpプログラム内ではなく php.ini ファイルまたは .htaccessにphp_valueディレクティブを用いて記載するのが良いと思います。 http://php.net/manual/ja/configuration.changes.php
    本来はエラーレポートはiniでlog_errorsを設定してログに残し、定期的に確認するのが事故の早期発見には望ましいと思います。

    キャンセル

+4

私も詳しく知らないのでググってみたのですが、まさしく攻撃ですね。
SQLインジェクションの中の、UNIONインジェクションと呼ばれる攻撃のようです。

UNIONインジェクションの説明記事
http://www.byakuya-shobo.co.jp/hj/moh/sqlinjectioncheatsheet.html#UnionInjections

UNIONインジェクションで実際に攻撃するにはどんな手順で行われるのかの参考記事
http://d.hatena.ne.jp/nagakura_eil/20090419/p1

コード側で「SQLクエリ文字列を文字列結合で作って実行」なんてことをしてると、この攻撃で一発で全てのデータが抜かれます。プリペアドステートメントを使っていればここまで簡単には抜けないはずです。

※といっても、プリペアドステートメントなら絶対安全かというとそうでもないので、セキュリティについては調べてください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/31 23:57

    ありがとうございました。参考にさせていただきます。

    キャンセル

+4

「mysql_fetch_array()」でデータを取っているのでしょうか?
そもそもmysql_* 関数はすでに過去の遺物で使用は控えるべきです

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/31 23:58

    ありがとうございました。ご指摘の通りで、、申し訳ないです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    19211questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。