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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

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

Q&A

解決済

3回答

8722閲覧

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

minoru23

総合スコア23

PHP

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

0グッド

5クリップ

投稿2017/10/31 05:26

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

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

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

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

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

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

なお、

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

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

投稿2017/10/31 05:52

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

minoru23

2017/10/31 14:58

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

2017/11/07 01: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を設定してログに残し、定期的に確認するのが事故の早期発見には望ましいと思います。
guest

0

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

投稿2017/10/31 05:48

yambejp

総合スコア114769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

minoru23

2017/10/31 14:58

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

0

私も詳しく知らないのでググってみたのですが、まさしく攻撃ですね。
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 05:44

編集2017/10/31 05:47
masaya_ohashi

総合スコア9206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

minoru23

2017/10/31 14:57

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問