質問: サーバーのログに下記のようなログが大量に残っていました。 一部略しています。 [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の該当箇所に@を入れてブラウザ上にエラー表示をしないようにしました。 これで根本的解決にはなっていないと思いますが、不正なアクセスをしようとしている人には効果があるのでしょうか? どうかよろしくお願いいたします。
回答: > > どのようにして対策をしたらいいのでしょうか? > > > まずは、「SQLインジェクションが起きないようにプログラムを作る」のが大前提です。バインドなどでSQL文をきちんと組み立てていれば、パラメータに何かをねじ込もうとするような攻撃が来ても、ログが残るだけで影響はありません。 基本的にHTTPアクセス自体を止めるのは得策ではありませんが、 * 特定の帯域(あるクラウドサービス、あるいは特定の国)から来ることが判明していて、その帯域にサービスしなくても問題ない場合 * 内輪向けのサービスなど、接続する人間が限られるような場合 には、IPアドレスレベルで接続を切ってしまってもいいかもしれません。 なお、 > > mysql.phpの該当箇所に@を入れてブラウザ上にエラー表示をしないようにしました。 > > > 本番環境では、`error_reporting(0);`でエラー表示を**完全に止めておきましょう**。閲覧者に表示させるのは攻撃の手がかりになるだけで、有害無益です。