これによればSQL インジェクションの基礎記事:
<…> SQL クエリの破壊\ファジングに主に使用される操作は次のとおりです。
'
一重引用符"
二重引用符\
バックスラッシュ (MySQL エスケープ文字)
16 進数でエンコードされた文字 (例0x3a3a
) も時々あります。
これらを含むすべてのリクエストをログに記録して削除したいと思います。これまでのところ、次のとおりです。
set $susp 0;
if ($request_uri ~ "%27") {
set $susp 1;
}
location ~ \.php {
if ($susp = 1) {
access_log /var/log/nginx/for-review.log;
return 500;
}
# further fastcgi configuration
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/var/run/php5-fpm.sock;
}
(という事は承知しています悪であれば、しかしそれは必要と思われる)
これは ではトリガーされません/foo/ba'r
が、 では少なくとも正常に動作します/?foo=b'ar
。 しかし、それだけです。私が試した他の文字もトリガーされません。
私が試したことは次のとおりです:
$request_uri ~ "%27|%22"
: シングルは機能するが、ダブルは機能しない$request_uri ~ "%27|\""
: シングルは機能するが、ダブルは機能しない$request_uri ~ "%27|0x"
: どちらも機能しますが、0x
誤検出が発生しますサムネイル=230x240
また、バックスラッシュにどうアプローチすればよいのかさえわかりません。
皆さんはそれをどうやって機能させるか知っていますか?
PS 使用を検討しましたアマゾンWASただし、別のサービス (Cloudflare またはロード バランサー) が必要であり、まだ準備ができていません。
PS 他の対策も必要だとは思います。これは、あの迷惑なGETスキャンをなくすためのものです。また、正当な訪問者がブラウジング中にそれらに遭遇するとは思えません。私の考えはこうです。ハッキングを複雑にする障壁は何でも役に立つのです。
答え1
メインnginx.conf
、下記http {}
:
# set the variable
map "$request_uri" $susp {
default 0;
"~*(?<suspm>(\\x|%)(3c|3e|5c|22|27)+)" 1;
}
# match logging
log_format suspl '$remote_addr /$suspm/ - $remote_user $host [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" "$http_cookie"';
個別の仮想ホスト構成:
location / {
if (\$susp = 1) {
access_log /var/log/suspl.log suspl;
return 403;
}
# etc…
}
また、
正当な訪問者がブラウジング中にそれらを入手するとは思えない
注意: どうやら、%7B%22
一部の (すべてではない) 追跡/分析ソフトウェアによって設定された Cookie のようなものが、実際に保存されているようです。