WEBサイト
  サポート

トップページ > ブログ > 開発記録 > このサイト、最初に何を整えるか・・・まずは少しセキュリティ対策を施す。SQLインジェクション対策とか、XSS防止とか・・・
このサイト、最初に何を整えるか・・・まずは少しセキュリティ対策を施す。SQLインジェクション対策とか、XSS防止とか・・・

しれっとオープンしてから数日。引き続きずっと触ってます。成長させる。

このサイトでは、今もいくつかのツールを提供してて、さらに今後も、サイト運営の現場で役に立つツールを、どんどん用意したい。

安心して使ってもらうためにも、このサイトを長く利用してもらうためにも、セキュリティ対策が必要だ。こんな小さなサイト、誰が狙うか、とも思うけども、最低限はしておかなくてはね。あ、どこかのハッカーさん、狙ってやろうなんて思わないでね、お金も得るものもは何もないから。

で、こうやってその事も書き留めておけば、誰かの目に留まり役に立つかもしれない・・・
 

"うちには関係ないよ" は 関係ない

「この規模のサイトが、狙われるわけないでしょ」・・・実は、ネットの攻撃は無差別に“自動”で仕掛けられるものが大半。たとえば放置しているWordPressの管理画面に、世界中からブルートフォース(総当たり)アタックが日常的に来るのは、実際によくある話。だから「最低限」だけでも、しておかないとだめなんだよね。サーバ委に対する、権限とかが影響して、できることにはもちろん限りもあるけどね。
 

セキュリティ対策の考え方

専門的な技術的な説明ではなく、なるべくわかりやすく記録しておく。
インターネットにおけるセキュリティ対策は、どこの時点で、何から守るかを明確に定義して、それに粛々と対応してゆくことが大事だと思っている。

何層かにわけた図とかよくあるけど、要に次の3つに分けられると思う。
  1. 一番外側 フロントと呼ばれるブラウザで直接アクセスするところ
  2. アクセスしたあと、プログラムなどの仕組みが動いているところ
  3. 大元のアクセスする基本部分
言い換えるね。
  • フロント(入口)
     └ サイトを見に来た“誰でも触れる部分”
      → ログイン画面、フォームなど

  • 仕組み(中身)
     └ サイトを動かしているプログラム部分
      → CMS(WordPress等)、各種プラグイン、APIなど

  • 土台(基盤)
     └ サーバやOS、データベース、ネットワーク設定

じゃ 実践記録を。

フロント(入口)

.htaccess というサイトにおいて色々な設定ができるファイル。最近は、rootという権限を持っていないサーバーでも、レンタルサーバーでも設定できるようになってきているね。
# ========================================
# リスト表示させない
# ========================================
Options -Indexes

# ========================================
# ファイル保護
# ========================================
<Files ".htaccess">
    Order Deny,Allow
    Deny from all
</Files>
<Files ".htpasswd">
    Order Deny,Allow
    Deny from all
</Files>

# ========================================
# アップロードファイル保護
# ========================================
# ログ・設定ファイル保護
<Files "*.log">
    Order Deny,Allow
    Deny from all
</Files>
<Files "*.ini">
    Order Deny,Allow
    Deny from all
</Files>
<Files "*.conf">
    Order Deny,Allow
    Deny from all
</Files>

# バックアップファイル保護
<Files "*.bak">
    Order Deny,Allow
    Deny from all
</Files>
<Files "*.backup">
    Order Deny,Allow
    Deny from all
</Files>
<Files "*.old">
    Order Deny,Allow
    Deny from all
</Files>

<Files "*.tmp">
    Order Deny,Allow
    Deny from all
</Files>

# ========================================
# 著名な攻撃への基礎対策
# ========================================
# SQLインジェクション対策
RewriteCond %{QUERY_STRING} (union|select|insert|delete|update|drop|create|alter|exec|script) [NC]
RewriteRule ^(.*)$ - [F,L]

# XSS対策
RewriteCond %{QUERY_STRING} (<script|<iframe|<object|<embed|javascript:|vbscript:|onload|onerror) [NC]
RewriteRule ^(.*)$ - [F,L]

# パストラバーサル対策
RewriteCond %{REQUEST_URI} (\.\.\/|\.\.\\|%2e%2e%2f|%2e%2e\\) [NC]
RewriteRule ^(.*)$ - [F,L]

# 不正なユーザーエージェント対策
RewriteCond %{HTTP_USER_AGENT} ^$ [OR]
RewriteCond %{HTTP_USER_AGENT} (sqlmap|nmap|nikto|w3af|acunetix|nessus|openvas) [NC]
RewriteRule ^(.*)$ - [F,L]

# ========================================
# セキュリティヘッダー強化
# ========================================
<IfModule mod_headers.c>
    # XSS Protection
    Header always set X-XSS-Protection "1; mode=block"
    
    # Content Type Options
    Header always set X-Content-Type-Options "nosniff"
    
    # Frame Options
    Header always set X-Frame-Options "SAMEORIGIN"
    
    # Referrer Policy
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
    
    # サーバー情報隠蔽
    Header unset Server
    Header unset X-Powered-By
</IfModule>



  

少し説明、付けておきますね。

リスト表示させない

ディレクトリの中身が丸見えだと、地味に危ない。見えなくしておくのが吉。
Options -Indexes

ファイル保護

設定とかログとか、大事なファイルは外から見えないようにガード。
<Files ~ "\.(env|git|htpasswd|htaccess|ini|log|sh|bak)$">
    Order Deny,Allow
    Deny from all
</Files>

アップロードファイル保護

もしもユーザーに変なファイルを上げられても、実行させなければとりあえずセーフ。
<FilesMatch "\.(php|cgi|pl|py|exe|sh)$">
    Order Deny,Allow
    Deny from all
</FilesMatch>

バックアップファイル保護

消し忘れたバックアップ、意外と多い。ここも一応ブロック。
<FilesMatch "\.(bak|old|save|orig)$">
    Order Deny,Allow
    Deny from all
</FilesMatch>

SQLインジェクション対策

URLに怪しいSQLキーワードが入ってたら強制シャットアウト。ざっくりだけど結構効く。
RewriteCond %{QUERY_STRING} (union|select|insert|delete|update|drop|create|alter|exec|script) [NC]
RewriteRule ^(.*)$ - [F,L]

XSS対策などHTTPヘッダー追加

サーバーやブラウザに一声かけておくだけで守れる部分は結構ある。
Header always set X-XSS-Protection "1; mode=block"
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header unset Server
Header unset X-Powered-By

ほんと、シンプルな基本だけど、ひとまず・・・

Google reCaptcha

フォームにはこれだね。いまは Version3(V3)。私はロボットじゃない とか バイクのある写真選べ とかなくなって使いやすくなった。閾値をセットして、アクセスがロボットかどうかを判断してくれる。完全、100%とは言えないだろうけど、最低限、ね。ありがとうございます。

1. API KEy の取得

https://developers.google.com/recaptcha?hl=ja
こちらで まずはキーを取得。サイトキー と シークレットキー
 

2.フロント側

{サイトkey) には取得したサイトキーをセット。

<script src="https://www.google.com/recaptcha/api.js?render={サイトkey)"></script>
<script>
grecaptcha.ready(function() {
    grecaptcha.execute('{サイトkey)', {action: 'submit'}).then(function(token) {
        var recaptchaResponse = document.getElementById('recaptchaResponse');
        recaptchaResponse.value = token;
    });
});
</script>

送信フォームにこれを追加しておく
recaptcha の値を格納するところ。

<input type="hidden" name="recaptcha_response" id="recaptchaResponse">
 

3.サーバー側

これは phpサイトでの一例。 $_val は送られてくる Recaptcha の値。$_sid はシークレットキー、ね。

public function ckRecaptcha($_val,$_sid) {
$_rt = null;
if(
(!empty($_val))
){
$recaptcha_secret = $_sid;

$recaptch_url = 'https://www.google.com/recaptcha/api/siteverify';
$recaptcha_params = [
    'secret' => $recaptcha_secret,
    'response' => $_val,
];
$recaptcha = json_decode(file_get_contents($recaptch_url . '?' . http_build_query($recaptcha_params)));
if(!(
(!empty($recaptcha))
&&(!empty($recaptcha->score))
)){
$_rt = false;
}else{
if ($recaptcha->score >= 0.6) {
$_rt = true;
} else {
$_rt = false;
}
}
}
return $_rt;
}

こういう関数を用意してチェック。でも実際は、サーバーの様々な理由から簡単に導入できず数日悩むこともあるんだよね・・・まぁ、それに泥臭く対応するのが仕事なんだけど。

今日はここまで。本当はもっと フロント側やったことあるので、また、ここに追記しておきます。
後日、
  • 仕組み(中身)
  • 土台(基盤)

でやったことも公開しておきます。お役に立てれば・・・
< 前の記事     一覧へ     後の記事 >
2025/05/31
THU
00:00:00

ブラウザ・OS 最新バージョン

毎日更新:2025-07-22 調査更新済
  • Android(stable) 5.0.1
  • Chrome Android(stable) 138.0.7204.157
  • Chrome iOS(stable) 138.0.7204.156
  • Chrome(beta) 139.0.7258.42
  • Chrome(dev) 140.0.7299.0
  • Chrome(stable) 138.0.7204.158
  • Edge(stable) 138.0.3351.95
  • Firefox(stable) 140.0.4
  • Opera(stable) 120.0.5543.93
  • Safari iOS(stable) 17.0
  • Safari(stable) 17.0
  • iOS(stable) 4

現在の貴方のIPアドレス

216.73.216.220

このサイトで書いている人

株式会社ツクルン

株式会社ツクルン

Webアドバイジング・クリエイター
池田南美夫
もうすぐ●●歳。ずっーと現役SE。日本にインターネットが上陸してから、ずっーと携わる。 ほんとは超アナログ人間のギター弾き、バンドマン。でも音楽活動とSE、案外似てる。