PHPでの変数名の決め方
- 前回
- ルール1:変数名の前には$をつける
- ルール2:$の次はアルファベットかアンダースコアから始める
- ルール3:使えるのは「aからz」「AからZ」「_」(厳密にはもっとあります。)
- ルール4:規約には従いましょう。
ルール1:変数名の前には$をつける
じゃぁ「$34」でいい?
ルール2:$の次はアルファベットかアンダースコアから始める
じゃぁ「$A-34」でいい?
ルール3:使えるのは「aからz」「AからZ」「_」(厳密にはもっとあります。)
じゃぁ「$A_34」でどうだ
PHP: 基本的な事 - Manual
ルール4:規約には従いましょう。
みんなてんでばらばらだったら他の人が見てさっぱり分からない・・・ただ、規約っていっぱいあるし・・・・。
なので基本的なマナーレベルは押さえましょう。
マナー1:大文字と小文字の違いだけの変数名を分けて使わない。
「$a_34」「$A_34」読む人も誤記なんだかわざとなんだか・・・分かりにくい。次に書く時だって・・・・間違いやすい。
マナー2:名前に明確な単語を選んで情報を詰め込む
「$A_34」は何に使うためにこの変数を作っているか不明です。
実は、自分の年齢をこの変数に入れたかった・・・のであれば「$myoldis34」みたいな。
マナー3:誤解されない名前にする
年齢は毎年変わります・・・今の年齢を表したければ「$nowmyold」な感じ。
マナー4:読みやすく単語の区切れが分かるように。
単語の区切り方は、Pascal形式とかCamelCaseとかスネーク形式とかいろいろあって規約ごとに違います。
ここは「_」でつなぐスネーク形式で「$now_my_old」な感じ。
超ざっくりPHPってこんなもの
PHPはWebページ作成するサーバサイドのプログラミング言語です。
PHPは「フリー」です。
無料のフリー
PHPは、タダで手に入ります。
ライセンス料、サポート料、アップグレード料もダタです。
※. 個人使用でない場合や別途ツールなんかを使う場合は調べてくださいね。
自由のフリー
PHPはオープンソースなので中身をだれでも参照できます。
ソースは見たくないけど機能の使い方は知りたいっていう時でも世の中の誰かが調べた情報がインターネットにたくさん散らばっています。
自由に使っていいんです!(ある程度のルールは守ってくださいね)
造るのに好きなものを自由に選んでいいんです!
OSはWindows、Mac OS、Linux、Slaris、Unixで使えます。特別な専用サーバを用意しなくても造れるんです!
Webサーバプログラムだって特別なものを用意しなくていいんです!
CGI規格をサポートしていれば、Apach、Microsift Internet InfomationServer ( IIS ) でもいいのです。
データベースもいろいろ選べます。
MySQL、Oracle、Microsoft SQL Server、Sybase、PostgreSQLといろいろあります。
ODBC規格のデータベースもサポート済みです。
LDAP:なんとなくわかった気がしている言葉をはっきりと
LDAPとは、ディレクトリサービスを提供するサーバへアクセスするときに使うプロトコルです。
正式名称 : Lightweight Directory Access Protocol
TCPポート番号の「389」(ウェルノウンポート)を使ってサーバへ接続します。
X.500という規格の1つであるDAPというプロトコルを軽量化(Lightweight)したものです。
DAPはとても重かったので軽くしたそうです。
例えば、オープンソースのLDAPであるOpenLDAP、Windowsでよく使われるActive DirectoryなどにLDAPは実装されています。
LDAPに対応してディレクトリサービスを提供するサーバをLDAPサーバといいます。
ディレクトリサービスとは、ネットワークの情報を一元管理し情報提供などを行うサービスです。
ネットワーク内のユーザ情報や機器情報を管理して、参照・更新などを行うサービスです。
ユーザ名から部署や電話番号を検索したり、プリンターの情報を参照できたりします。
例えば、名前解決してくれるDNSやオープンソースのLDAPであるOpenLDAP、Windowsでよく使われるActive Directoryなどがディレクトリサービスです。
第1回 認証統合の概要[Active Directory編]:Active DirectoryとLinuxの認証を統合しよう【2017年版】|gihyo.jp … 技術評論社
階層型にデータを管理するデータベースを使います。
リレーショナルデータベースとは違うのです。
ディレクトリサービスと設定によってはリレーショナルデータベースも使えます。
ディレクトリサービスのように更新より参照が多く組織などから情報を見つけていく場合は階層型のデータベースのが向いています。
Pythonのインターネットにアクセスできる外部モジュール「Requests」をインストールする
- インターネットにアクセスするライブラリは標準で「urllib」がありますが、「Requests」のほうが簡単らしいです。
- pipコマンドはPyPIからライブラリをインストールして設定までをしてくれるパッケージ管理システムです。
- pip3コマンを使ってRequestsをインストールします。
- 参考文献
MacにPythone3をインストールしたので、ライブラリをインストールします。
ponsuke-tarou.hatenablog.com
インターネットにアクセスするライブラリは標準で「urllib」がありますが、「Requests」のほうが簡単らしいです。
はじめてのPythonなので簡単な方を選びます。
pipコマンドはPyPIからライブラリをインストールして設定までをしてくれるパッケージ管理システムです。
Pythone3.4以降であれば標準ではいっています。
MacのPython3では「pip3」というコマンドになります。
$ pip3 --version pip 9.0.3 from /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages (python 3.6) $ pip3 --help Usage: pip <command> [options] Commands: install Install packages. download Download packages. uninstall Uninstall packages. freeze Output installed packages in requirements format. list List installed packages. show Show information about installed packages. check Verify installed packages have compatible dependencies. search Search PyPI for packages. wheel Build wheels from your requirements. hash Compute hashes of package archives. completion A helper command used for command completion. help Show help for commands. General Options: -h, --help Show help. --isolated Run pip in an isolated mode, ignoring environment variables and user configuration. -v, --verbose Give more output. Option is additive, and can be used up to 3 times. -V, --version Show version and exit. -q, --quiet Give less output. Option is additive, and can be used up to 3 times (corresponding to WARNING, ERROR, and CRITICAL logging levels). --log <path> Path to a verbose appending log. --proxy <proxy> Specify a proxy in the form [user:passwd@]proxy.server:port. --retries <retries> Maximum number of retries each connection should attempt (default 5 times). --timeout <sec> Set the socket timeout (default 15 seconds). --exists-action <action> Default action when a path already exists: (s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort. --trusted-host <hostname> Mark this host as trusted, even though it does not have valid or any HTTPS. --cert <path> Path to alternate CA bundle. --client-cert <path> Path to SSL client certificate, a single file containing the private key and the certificate in PEM format. --cache-dir <dir> Store the cache data in <dir>. --no-cache-dir Disable the cache. --disable-pip-version-check Don't periodically check PyPI to determine whether a new version of pip is available for download. Implied with --no-index.
pip3コマンを使ってRequestsをインストールします。
# Requestsをインストール $ pip3 install requests Collecting requests Downloading https://files.pythonhosted.org/packages/ff/17/5cbb026005115301a8fb2f9b0e3e8d32313142fe8b617070e7baad20554f/requests-2.20.1-py2.py3-none-any.whl (57kB) 100% |████████████████████████████████| 61kB 1.6MB/s Collecting idna<2.8,>=2.5 (from requests) Downloading https://files.pythonhosted.org/packages/4b/2a/0276479a4b3caeb8a8c1af2f8e4355746a97fab05a372e4a2c6a6b876165/idna-2.7-py2.py3-none-any.whl (58kB) 100% |████████████████████████████████| 61kB 6.2MB/s Collecting urllib3<1.25,>=1.21.1 (from requests) Downloading https://files.pythonhosted.org/packages/62/00/ee1d7de624db8ba7090d1226aebefab96a2c71cd5cfa7629d6ad3f61b79e/urllib3-1.24.1-py2.py3-none-any.whl (118kB) 100% |████████████████████████████████| 122kB 3.7MB/s Collecting chardet<3.1.0,>=3.0.2 (from requests) Downloading https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl (133kB) 100% |████████████████████████████████| 143kB 4.2MB/s Collecting certifi>=2017.4.17 (from requests) Downloading https://files.pythonhosted.org/packages/56/9d/1d02dd80bc4cd955f98980f28c5ee2200e1209292d5f9e9cc8d030d18655/certifi-2018.10.15-py2.py3-none-any.whl (146kB) 100% |████████████████████████████████| 153kB 3.0MB/s Installing collected packages: idna, urllib3, chardet, certifi, requests Successfully installed certifi-2018.10.15 chardet-3.0.4 idna-2.7 requests-2.20.1 urllib3-1.24.1 You are using pip version 9.0.3, however version 18.1 is available. You should consider upgrading via the 'pip install --upgrade pip' command. # インストールされたことを確認する $ pip3 list Package Version ---------- ---------- certifi 2018.10.15 chardet 3.0.4 idna 2.7 pip 18.1 requests 2.20.1 setuptools 39.0.1 urllib3 1.24.1
pip3コマンドのバージョンが古い場合はアップグレードします。
インターネットの通信を安全にするIPsec
- 前回の勉強内容
- 勉強のきっかけになった問題
- インターネットの通信で使われるプロトコルをIPといいます。
- IPsecは、IPでの暗号化技術を使って安全にインターネットを使うための通信プロトコルです。
- 次回の勉強内容
前回の勉強内容
勉強のきっかけになった問題
IPsecに関する記述のうち,適切なものはどれか。
インターネットの通信で使われるプロトコルをIPといいます。
- 正式:Internet Protocol = Internet(インターネット) + Protocol(手順)
プロトコルとは、パソコンなどの機械同士が通信するときのお約束ごとのことです。
インターネットの世界には危険がいっぱいです。
IPsecは、IPでの暗号化技術を使って安全にインターネットを使うための通信プロトコルです。
- 正式:Security Architecture for IP または IP Security Architecture = Security(安全) + Architecture(構造) + for IP(IPのための)
IPsecで「どんなプロトコルやアルゴリズムを使うよ」という合意をSAといいます。
- 正式 : Security Association = Security(安全) + Association(つながり)
共有鍵暗号方式をIPsecでは使っていて、そのアルゴリズムはいろいろ選べます。だから、SAでどんな物を使うかきっちり定義しておきます。
使う共通鍵を交換してSAの合意を取る鍵交換プロトコルが、IKEです。
- 正式 : Internet Key Exchange = Internet(インターネット) + Key(鍵) + Exchange(交換する)
IKEは、SAを合意するときも鍵を交換するときもISAKMP(Internet Security Association and Key Management Protocol / Internet SA と 鍵管理プロトコル)というプロトコルを使い、ISAKMPメッセージ専用のUDPの500番のポートを使います。
データはESPという入れ物に入れて暗号化して送ります。
- 正式 : Encapsulating Security Payload = Encapsulating(カプセル化している) Security(安全な) + Payload(データ伝送されるパケットのヘッダー部を除いたデータの本体)
暗号化する範囲の違いによって、トランスポート・モードとトンネル・モードに分かれます。
データが改ざんされていないことを確認できるようにMACというデータを付加します。
- 正式 : Message Authentication Code = Message(メッセージ) + Authentication(認証) + Code(コード)
- 日本語 : メッセージ認証コード
このやり方をメッセージダイジェストといいます。
SPI・MAC・通信のシーケンス番号をAHというパックにして通信する時パケットにくっつけます。
- 正式 : Authentication Header = Authentication(認証) + Header(先頭部)
次回の勉強内容
セキュリティを意識したプロトコル達
- 前回の勉強内容
- 勉強のきっかけになった問題
- IPsecは、IPでの暗号化技術を使った安全なインターネット用の通信プロトコルです。
- L2TPは、送信情報を運ぶトンネルのプロトコルです。
- RADIUSは、ネットワーク上でクライアントとサーバの認証を行うプロトコルです。
- SSHは、認証技術を利用して別のコンピュータと通信するプロトコルです。
- 次回の勉強内容
前回の勉強内容
勉強のきっかけになった問題
暗号化や認証機能を持ち,遠隔にあるコンピュータを操作する機能をもったものはどれか。
ア. IPsec イ. L2TP ウ. RADIUS エ. SSH
平成26年秋期問11 SSH|情報処理安全確保支援士.com
RADIUSは、ネットワーク上でクライアントとサーバの認証を行うプロトコルです。
- 正式 : Remote Authentication Dial In User Service
- 読み方:ラディウス、ラディアス
流れは、
- 不正なクライアントやサーバが使えないように、クライアントとサーバの間に共通暗号鍵を設定します。
- この共通暗号鍵を「Shared Secret」といいます。
- クライアントから送られてきたユーザの情報で、サーバは認証を行います。
- クライアントが送る情報を「Access-Requestメッセージ」といいます。
- サーバは、認証を行い結果をクライアントへ送信します。
サーバが送る応答 | パケットの種別 | 意味 |
---|---|---|
アクセス許可 | Access-Accept | 認証結果がOK |
アクセス拒否 | Access-Reject | 認証結果がNG |
アクセスチャレンジ | Access-Challenge | 不正アクセスを防ぐために 再度パスワードの入力などを要求 |
SSHは、認証技術を利用して別のコンピュータと通信するプロトコルです。
- 英語:(Secure:安全) + (Shell:コマンド入力を受け付けて解釈するプログラム)
Telnetも別のコンピュータと通信するプロトコルですが、暗号化はしていません。
残念なことに、暗号化していないのでのぞき見し放題です。
https://community.fs.com/blog/which-client-software-is-better-for-telnet-and-ssh.html
そこでSSH!通信経路が暗号化されているのでインターネットなどを経由しても安全に通信できます。
SSHのプロトコルには、「SSH1」と「SSH2」の2種類があります。
SSH1は、RSA公開鍵暗号方式を使います。
SSH2は、DSA公開鍵暗号方式を使います。が、RSA公開鍵暗号が使えるようになり「SSH2でRSA公開鍵暗号を使う」がおすすめです。
RSAは特許の問題から使用が制限されており、特許問題を回避するためにDSAを採用したSSH2が登場したという背景があるものの特許は2000年9月で失効し、SSH2でもRSAを利用して認証できるようになりました。
次回の勉強内容
根性で不正ログインを頑張るブルートフォース攻撃
前回の勉強内容
勉強のきっかけになった問題
共通鍵暗号の鍵を見つけ出す,ブルートフォース攻撃に該当するものはどれか。
- 1組の平文と暗号文が与えられたとき,全ての鍵候補を一つずつ試して鍵を見つけ出す。
- 平文と暗号文と鍵の関係を代数式に表して数学的に鍵を見つけ出す。
- 平文の一部分の情報と暗号文の一部分の情報との間の統計的相関を手掛かりに鍵を見つけ出す。
- 平文を一定量変化させたときの暗号文の変化から鍵を見つけ出す。
不正アクセスや不正ログインする攻撃はよくあります。
攻撃 | 手法 |
---|---|
ブルートフォース攻撃 | パスワードをどんどん変えて正解を探す |
リバースブルートフォース攻撃 | IDをどんどん変えて正解を探す |
パスワードリスト攻撃 | ヒントを仕入れてIDとパスワードを推測して正解を探す |
パスワードスプレー攻撃 | IDとパスワードをどんどん変えて正解を探す |
ブルートフォース攻撃は、ありとあらゆる文字列の組み合わせを片っ端から試してパスワードや鍵を見つける攻撃です。
- 別名:ブルートフォースアタック、総当たり攻撃
- 英語 : (brute force:力ずくの) + (attack: 攻撃)
辞書ツールやら考えられるすべての情報を使って文字列の組み合わせを全て試していく、根性の攻撃です。
パスワードの文字数や文字種が少ないと被害にあいやすいです。
独立行政法人情報処理推進機構セキュリティセンターが、パスワードに使用している文字の種類別に解読の所要時間をまとめたもの
ブルートフォースアタックとは?実験から分かる危険性と有効な4つの対策
リバースブルートフォース攻撃は、ありとあらゆる文字列の組み合わせを片っ端から試してIDを見つける攻撃です。
- 別名:リバースブルートフォースアタック、逆総当たり攻撃
- 英語 : (reverse:逆の) + (brute force:力ずくの) + (attack: 攻撃)
世の中には、規定回数パスワードを間違えるとロックされるアカウントロックというものがあります。
残念なことに、IDを変えていくのでアカウントロックされにくいです。
ブルートフォース攻撃の逆で、パスワードに固定文字列を使ってIDを変えながら試していきます。
パスワードリスト攻撃は、どっかで仕入れた情報をもとにIDとパスワードを推測して攻撃します。
- 別名:リスト型攻撃、パスワードリスト型攻撃、アカウントリスト攻撃、リストベース攻撃、リストベースアタック、リストアタック
いろんなサイトで同じようなIDやパスワードを使っていると被害にあいやすいです。
パスワードスプレー攻撃は、ブルートフォース攻撃とリバースブルートフォース攻撃をいい感じに合わせています。
- 別名:low-and-slow攻撃
決まった期間に決まった回数ログインに失敗するとアカウントロックがかかります。
だから、「パスワードを固定していろんなIDを試す」をひたすら繰り返します。
アカウントロックされたら別のIDでまた試します。
ついでに、不正を検知されないようにIPアドレスを変えたり、時間をずらして実行したりします。
次回の勉強内容
Webサイトでの認証技術であるベーシック認証とダイジェスト認証を知る。
- 前回の勉強内容
- 勉強のきっかけになった問題
- HTTPの認証機能を使用することで、Webサイトにアクセスできる権限を持っているかを確認します。
- ベーシック認証は、ユーザ名とパスワードの組みをコロン ":" でつなぎ、Base64でエンコードして送信します。
- ダイジェスト認証は、パスワードをハッシュ値にして送信します。
- 次回の勉強内容
前回の勉強内容
勉強のきっかけになった問題
HTTPの認証機能を利用するクライアント側の処理として,適切なものはどれか。
HTTPの認証機能を使用することで、Webサイトにアクセスできる権限を持っているかを確認します。
会員サイトなどのWebサイトを特定の人々だけ見れるようにするには認証機能を使用します。
認証機能を使用することでWebページを見られる人かを確認します。
ベーシック認証は、ユーザ名とパスワードの組みをコロン ":" でつなぎ、Base64でエンコードして送信します。
- 別名:基本認証
- 利点:多くのWebサーバが対応しています。
- 欠点:盗聴や改竄が簡単にできます。
認証の流れは、
1. クライアントがページをリクエストする
2. WebサーバがWWW-AuthenticateヘッダでHTTPステータスコード401を返す
- HTTPステータスコード:Webサーバがレスポンスの意味を表す3桁のコードです。
- 別名:レスポンスコード
- 401(Unauthorized):「認証が必要だよん」とWebサーバは言っている。
WWW-Authenticate ヘッダーは 401 Unauthorized 応答と共に送られます。
例
WWW-Authenticate: Basic realm="Access to the staging site", charset="UTF-8"
WWW-Authenticate - HTTP | MDN
3. クライアントがBase64エンコードしたユーザ名とパスワードをAuthorizationヘッダに指定して送る
例
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
Authorization - HTTP | MDN
4. Webサーバが認証する
ダイジェスト認証は、パスワードをハッシュ値にして送信します。
- 英語:digest authentication
- 別名:HTTPダイジェスト認証
- 利点:ベーシック認証で防げなかった漏洩やら改ざんができます。
- 欠点:対応していないブラウザがあります。
認証の流れは、
1. クライアントがページをリクエストする
2. WebサーバがWWW-AuthenticateヘッダでHTTPステータスコード401だけではなく「認証領域」や「認証方式」、「ランダムな文字列」を返す
- ここの
- 認証領域は、realm
- 認証方式は、Digest(ダイジェスト認証だよと知らせる)
- ランダムな文字列は、
- nonce(認証要求ごとに生成される一時的なデータでチャレンジともいう)
- opaque(ランダムに生成されるデータ)
- といいます。
3. クライアントがランダムな文字列を生成して、ユーザ名・パスワードと「2つのランダムな文字列」を使ってハッシュ文字列を生成する
4. クライアントは「2つのランダムな文字列」と「ハッシュ文字列」を送信する
MD5は、文字列から128ビットの値のハッシュ値を生成するハッシュ関数です。
- 正式:Message Digest 5
- 規約:RFC 1321
- 特徴:
- 同じ入力値は必ず同じ値になる
- 少しでも異なる入力値は全然違う値になる
- 不可逆な一方向関数を含むのでハッシュ値から効率よく入力値を割り出すことはできない
- 欠点:入力値がハッシュ値より長い場合、複数の異なる入力値なのに同じハッシュ値になってしまう「ハッシュ値の衝突」が起こる
# MD5でハッシュ値を生成する $ echo 'tarou' | md5 961ed3c18a02b9b87bcd3efa9eb2a0a9 # ちょっと違う文字だとぜんぜん違うハッシュ値が生成される $ echo 'taroo' | md5[f:id:ponsuke_tarou:20181005164602j:plain] e11337e5c8ce85a437712f57c63249e8 $ echo 'tarou' | md5 26223ea272f3f0e42cf872c01b9ba8ec
- 前回勉強したメールの認証:CRAM-MD5でも使っています。
次回の勉強内容
DDL と DLL の違い
DDLとは、テーブル構造を定義する言語です。
- 正式名称:Data Definition Language
- 別名:データ定義言語
- リレーショナルデータベースのテーブルを制御する言語。
「CREATE」「DROP」「ALTER」などが書いてあるやつです。
- テーブル全体の作成・変更・削除などを行う際に使用する。
仲間には、レコード単位の操作を行うDMLがあります。
- 正式名称:Data Manipulation Language
- 別名:データ操作言語
- リレーショナルデータベースのレコードを制御する言語。
- テーブル内のレコードの追加・検索・更新・削除などを行う際に使用する。
「SELECT」「INSERT」「UPDATE文」「DELETE」などが書いてあるやつです。
- データベースにおいてデータの検索・新規登録・更新・削除を行うための言語である。
DLLとは、プログラムを動かす時に使う部品です。
- 正式名称:Dynamic Link Library
- 別名:共有ライブラリ、シェアドライブラリ、動的リンクライブラリ
- 様々なプログラムから利用される汎用性の高い機能を収録した、部品化されたプログラムのこと。
- 単体で実行することはできず、実行可能ファイル(EXEファイルなど)が起動する際に自動的に連結されてメモリ上に展開される。
- 多くのプログラムが共通して必要とする機能が収められており、様々なプログラムの一部として取り込まれて実行される。
メール送信での認証技術に POP before SMTP と SMTP-AUTH
- 前回の勉強内容
- むかしむかし、SMTPには認証の仕組みがありませんでした。
- POP before SMTPは、メールを送信する前にPOP3認証を行って認証できたらメールを送信する仕組みです。
- SMTP-AUTHは、メールサーバがメール送信者をIDとパスワードで認証してからメールを送信する仕組みです。
- 次回の勉強内容
前回の勉強内容
むかしむかし、SMTPには認証の仕組みがありませんでした。
それに伴い、大量のメールを送り付ける「迷惑メール」が流行りました。
そこでメール送信時の認証技術として、「POP before SMTP」「SMTP-AUTH」ができました。
- 送信処理と転送処理を同一の仕組みで扱っている
- メールの投稿をするユーザを認証する仕組みがない
- 暗号化機能が標準で実装されていないため通信経路上を平文のメッセージが流れる
などの脆弱性があり、特に1,2の原因によって複数のメールサーバの第三者中継を利用した迷惑メールの温床となっていました。
平成18年秋期問74 SMTP-AUTH認証はどれか|応用情報技術者試験.com
POP before SMTPは、メールを送信する前にPOP3認証を行って認証できたらメールを送信する仕組みです。
SMTPに認証の仕組みはないけれど、メール受信で使うPOP3にはIDとパスワードによる認証の仕組みがあります。
SMTP-AUTHは、メールサーバがメール送信者をIDとパスワードで認証してからメールを送信する仕組みです。
SMTP-AUTHの特徴はどれか。
クライアントがSMTPサーバにアクセスするときにユーザ認証を行い、許可されたユーザだけから電子メールを受け付けます。
SMTP-AUTHにおける認証の動作を説明したものはどれか。
ア. SMTPサーバは,クライアントがアクセスしてきた場合に利用者認証を行い,認証が成功したとき電子メールを受け付ける。
平成26年秋期問37 SMTP-AUTHにおける認証の動作|応用情報技術者試験.com
SMTP-AUTHの特徴はどれか。
ウ. メールクライアントからメールサーバへの電子メール送信時に,ユーザアカウントとパスワードによる利用者認証を行う。
平成28年秋期問16 SMTP-AUTHの特徴はどれか|情報処理安全確保支援士.com
認証方法には種類があります。
認証方法 | 方法 | 説明 |
---|---|---|
PLAIN | 暗号化しないでユーザー名/パスワードをそのまま送る仕組み | パスワードが平文で流れているので危険な方式 |
LOGIN | 標準化されておらず独自の実装をしているメールサーバーもあって互換性が低い方式 | ユーザー名/パスワードはBASE64に変換される ユーザー名/パスワードを別々に送信したり一緒に送信したりする(やり方はそれぞれ) |
CRAM-MD5 | パスワード文字列がそのままネットワークを流れることがないように、暗号化が施される MD5を使用してチャレンジ-レスポンス認証を行い、パスワードそのものは暗号化された状態でも送信はしない |
流れ 1. サーバーとクライアントが共通に知っているパスワードを用意 2. サーバーは、クライアントに対し任意の文字列(Challenge文字列)を送る 3. クライアントはそのChallenge文字列と共通パスワードを使い、MD5で計算処理を行う 4. 結果をサーバーに返す 5. クライアントからの返答が傍受されても、ここからパスワードを復元するのは困難 6. サーバーは、自分でも同じ処理を行ない、結果が一致すれば相手が正しくパスワードを知っているとして認証する |
DIGEST-MD5 | CRAM-MD5の拡張版で、辞書攻撃や総当り攻撃などに対する耐性を高めたもの |
サブミッションポートを合わせて使います。
スパムメール対策として,サブミッションポート(ポート番号587)を導入する目的はどれか。
エ. SMTP-AUTHを使用して,メール送信者を認証する。
平成28年春期問44 サブミッションポートの導入目的|応用情報技術者試験.com
OP25Bでポート25番を使えないようにして、送信専用ポートとしてサブミッションポート587番を使います。
送信専用となったポート587番にアクセスしたユーザをSMTP-AUTHで認証します。
ponsuke-tarou.hatenablog.com
次回の勉強内容
スパムメール撲滅を目指す送信ドメイン認証技術
- 前回の勉強内容
- 勉強のきっかけになった問題
- メールアドレスのドメインを検証することでなりすましや改ざんを検知できるようにする技術を送信ドメイン認証技術といいます。
- IPアドレスを利用するタイプは、あらかじめDNSサーバにIPアドレスを公開しておいて、受信側がDNSでIPアドレスを検証します。
- 電子署名を利用するタイプは、あらかじめDNSサーバに公開鍵を公開しておいて、受信側がメールヘッダの電子署名をDNSで公開鍵を取得して検証します。
- DMARCは、送信ドメイン認証での「認証結果によるメール配信制御」「認証結果のレポート」を行うシステムです。
- 次回の勉強内容
前回の勉強内容
勉強のきっかけになった問題
スパムメールへの対策であるDKIM(DomainKeys Identified Mail)の説明はどれか。
- 送信側メールサーバにおいてディジタル署名を電子メールのヘッダに付与し,受信側メールサーバにおいてそのディジタル署名を公開鍵によって検証する仕組み << 正解
- 送信側メールサーバにおいて利用者が認証された場合,電子メールの送信が許可される仕組み
- 電子メールのヘッダや配送経路の情報から得られる送信元情報を用いて,メール送信元のIPアドレスを検証する仕組み
- ネットワーク機器において,内部ネットワークから外部のメールサーバのTCPポート番号25への直接の通信を禁止する仕組み
出典 : 平成25年 春期 情報セキュリティスペシャリスト試験午前Ⅱ 問16
メールアドレスのドメインを検証することでなりすましや改ざんを検知できるようにする技術を送信ドメイン認証技術といいます。
残念なことにメールは送信元を偽ることができちゃいます。
スパムメールは送信元を偽装していることが多く、メールのヘッダに書いてある「From」のメールアドレスは安易に信用できません。
そこで、ちゃんとした送信元かを確認できるようにするための送信ドメイン認証技術が造られました。
IPアドレスを利用するタイプは、あらかじめDNSサーバにIPアドレスを公開しておいて、受信側がDNSでIPアドレスを検証します。
- 流れ
認証方法によって、送信メールサーバのIPアドレスの取得元が異なります。
送信ドメイン認証 | IPアドレスの取得元 |
---|---|
SFP | エンベロープFromにあるメールアドレス |
Sender ID | メールヘッダのFromやSenderにあるメールアドレス |
SFPは、メールの「エンベロープFromにあるメールアドレス」から取得します。
- 英語:Sender Policy Framework
なりすましメール撲滅に向けたSPF(Sender Policy Framework)導入の手引き:IPA 独立行政法人 情報処理推進機構
SPF(Sender Policy Framework)の仕組みはどれか。
イ. 電子メールを受信するサーバが,電子メールの送信元のドメイン情報と,電子メールを送信したサーバのIPアドレスから,ドメインの詐称がないことを確認する。
平成30年春期問40 SPFの仕組みはどれか|基本情報技術者試験.com
「エンベロープFrom(英語 : envelope(封筒) from)」とは、配信処理用のメールアドレスのことです。
エンベロープFromは、実際の送信者メールアドレスであり、宛先にメールが届くとエンベロープFromは削除されます。
メールヘッダにあるFromは、設定で変更することができます。
迷惑メールなどはメールヘッダにあるFromを詐称していたりします。
「エンベロープFrom」は、メールが宛先に到着してSMTPが終わると消えます。
でもなくなると問題があったときの送信先に困っちゃうので、メールの「Return-Path」に出力されます。
なので、Return-Pathを確認することでエンベロープFromが確認できます。
例えば、三井住友銀行からもらったお知らせメールの場合はこんな感じ。
...ここでエンベロープFromが確認できます。... Return-Path: <51212-585086@envelope-from.smbc.co.jp> ... From: "三井住友銀行" <smbc_info@ra.smbc.co.jp> To: ponsukeのメアド Subject: <重要>【三井住友銀行】 三井住友銀行アプリ「プッシュ通知」の一部サービス終了のお知らせ ....
なので、「エンベロープFromにあるメールアドレス」のドメインから送信側メールサーバのIPアドレス取得して検証します。
Sender IDは、「メールヘッダのFromやSenderにあるメールアドレス」からします。
「メールヘッダのFromやSender」はメーラなどの表示用のメールアドレスです。
メールヘッダのFromやSenderは、配信処理には使用されず送信者以外のアドレスを使用することが可能です。
メールヘッダのFromやSenderにあるメールアドレスのことをPRA(Purported(~といわれている) Responsible Address)ともいいます。
Sender IDは、PRAのドメインと同じサーバから送信されているかどうかを検証します。
PRAでは、Resent-Sender / Resent-From / Received / Senderなどのから情報を取得します。
取得方法の詳細は、rfc4407の2. Determining the Purported Responsible Addressに記載されています。
電子署名を利用するタイプは、あらかじめDNSサーバに公開鍵を公開しておいて、受信側がメールヘッダの電子署名をDNSで公開鍵を取得して検証します。
- 流れ
DKIMは、送信側メールサーバで電子署名を電子メールのヘッダに付与して、受信側メールサーバで検証します。
- 読み方:ディーキム
電子署名を利用するタイプにIIM(Identified Internet Mail)とDomainKeysという認証方法がありました。
この認証方法が合体してDKIMができました。
正式名称は、DomainKeys Identified(認証する) Mailです。
送信側のメールサーバで、メールヘッダとボディから電子署名を作成して、DKIM-Signatureヘッダに追加します。
例えば、三井住友銀行からもらったお知らせメールの場合はこんな感じ。
...... DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ra.smbc.co.jp; s=smbcrmpc; t=1...; bh=Et...; h=From:To:Subject:Reply-To:Message-Id:Date:MIME-Version: Content-Type; b=dw8... From: "三井住友銀行" <smbc_info@ra.smbc.co.jp> To: ponsukeのメアド Subject: <重要>【三井住友銀行】 三井住友銀行アプリ「プッシュ通知」の一部サービス終了のお知らせ ....
スパムメールの対策であるDKIM(DomainKeys Identified Mail)の説明はどれか。
ア. 送信側メールサーバでディジタル署名を電子メールのヘッダに付与して,受信側メールサーバで検証する。
平成30年春期問12 DKIMの説明はどれか|情報処理安全確保支援士.com
DMARCは、送信ドメイン認証での「認証結果によるメール配信制御」「認証結果のレポート」を行うシステムです。
英語ではDomain-based Message Authentication, Reporting and Conformance(~との一致)、読み方は「ディーマーク」です。
TwoFive、なりすまし対策に有効なDMARCレポートを集計・可視化するサービス「DMARC / 25 Analyze」を提供開始 - クラウド Watch
「検証結果でそのメールをどう扱って欲しいか」を記述した情報の定義をSSP(Sender Signing Practice)といいます。
SSPは、DNSサーバに置いておきます。
次回の勉強内容
PKIは、世の中の安全を守っています。
- 前回の勉強内容
- 勉強のきっかけになった問題
- OCSPは、デジタル証明書をCRLを突き合わせて有効かを確認するためのプロトコルです。
- PKIは、暗号化技術と電子署名で世の中の安全を守る仕組みです。
- 認証局モデルでは信用関係の保証が重要です。
- 次回の勉強内容
前回の勉強内容
勉強のきっかけになった問題
PKIは、暗号化技術と電子署名で世の中の安全を守る仕組みです。
- 正式名称 : Public Key Infrastructure
- 日本語訳 : 公開鍵暗号基盤
PKIとは、公開鍵暗号を正しく発行し配布するシステム。証明局発行の鍵が含まれた証明書をリボジトリで集中管理・配布する。
PKIとは - 意味の解説|ITトレンドのIT用語集
公開鍵暗号技術と電子署名を使って、インターネット上で安全な通信ができるようにするための環境のことを言います。 なりすましやデータの盗聴や改竄を防ぐためのインフラとして近年注目が高まっています。
インターネット用語1分解説~PKIとは~ - JPNIC
データの暗号化とデジタル署名によってPKIは「守秘性」、「完全性」、「認証」、「否認防止」といったセキュリティサービスを提供します。 これらのセキュリティサービスによって、自分が知らぬ間に情報を書き換えられるような事態や、機密情報が盗聴されるといった脅威を防ぐことできます。 そしてPKIとビジネスで利用される様々なアプリケーションを組みあわせることにより、そのアプリケーションに対してセキュリティインフラを提供することができます。
PKIとは
暗号化技術はいろいろあります。
認証局モデルでは信用関係の保証が重要です。
- 受領したデータが改ざんされていないことを確認するには電子署名を確認します。
- 電子署名を複合するには送信者の公開鍵が必要です。
- 公開鍵を使うには公開鍵が本物か証明書を確認します。
- その証明書が信用できるか確認するには認証局が信頼できるかを確認する必要があります。
認証局の信用関係を作る方法には種類があります。
種類 | 説明 |
---|---|
単独 CA モデル | 1つの CA が全てのユーザに証明書を発行する方式です。 |
階層型モデル | 複数の CA を階層型(ツリー構造)に構成する方式です。 |
Web モデル | あらかじめクライアントのアプリケーションにルート CA の一覧を埋め込む方式です。Web ブラウザで用いられています。 |
メッシュモデル | 複数の CA を相互認証により接続する方式です。 |
ブリッジ CA モデル | 複数の CA がブリッジ CA を介して接続する方式です。 |
次回の勉強内容
さるがSQL*Plusって何?って思ったのでインストールしてみた。
SQL*Plusは、OracleのDB用のCUIクライアントツールです。
SQL*Plusは、Oracle Databaseのインストール時にインストールされる対話型のバッチ問合せツールです。SQL*Plusでは、コマンドライン・ユーザー・インタフェースを使用できます。
また、SQL*Plus Instant Clientもあります。これは、OCI Instant Client対応のプラットフォームで使用できるスタンドアロン・コマンドライン・インタフェースです。SQL*Plus Instant Clientは使用可能なすべてのOracle Databaseに接続されますが、専用のOracle Databaseをインストールする必要はありません。
SQL*Plusのクイック・スタート
SQL*Plus とは SQL を実行するためのインターフェイスユーティリティである。
インスタンスの起動とマニュアル操作によるインタラクティブな SQL の実行が主であるが shell などのスクリプト言語と サイレントモード を併用することで簡単なバッチ処理にも使用できる(※)。
www.shift-the-oracle.com
sqlplusはoracleに対して処理を指示するための最も基本的なCUIのSQLクライアントツールです。 実質oracle databaseがインストールされている環境にはほぼすべてsqlplusもインストールされているため以下のような様々な用途で使用されています。
WalkingAlone sqlplusとは
何となく分かるようなわからないのでインストールします。
インストールしてみた。
- インストールする環境:Windows10 Pro 64bit
1. Oracle Technology Network(OTN)からパッケージをダウンロードします。
- ダウンロードサイト : Instant Client for Microsoft Windows (x64) 64-bit
- 以下のzipを全部ダウンロードします。
- 接続先がOracle Database 18c (Version 18.3.0.0.0)の場合
2. ダウンロードしたものをすべて解凍して1つのフォルダにまとめます。
3. 解凍したフォルダを `C:\app\oracle\instantclient_xx_x` に配置します。
# 接続先がOracle Database 18c (Version 18.3.0.0.0)の場合 $ find /c/app/oracle/ -type d /c/app/oracle/ /c/app/oracle/instantclient_18_3 /c/app/oracle/instantclient_18_3/help /c/app/oracle/instantclient_18_3/help/ja /c/app/oracle/instantclient_18_3/help/ja/img /c/app/oracle/instantclient_18_3/help/ja/img_text /c/app/oracle/instantclient_18_3/help/us /c/app/oracle/instantclient_18_3/help/us/img /c/app/oracle/instantclient_18_3/help/us/img_text /c/app/oracle/instantclient_18_3/sdk /c/app/oracle/instantclient_18_3/sdk/admin /c/app/oracle/instantclient_18_3/sdk/demo /c/app/oracle/instantclient_18_3/sdk/include /c/app/oracle/instantclient_18_3/sdk/lib /c/app/oracle/instantclient_18_3/sdk/lib/bc /c/app/oracle/instantclient_18_3/sdk/lib/msvc /c/app/oracle/instantclient_18_3/sdk/lib/msvc/vc14 /c/app/oracle/instantclient_18_3/vc14
4. Instant Clientファイルを含むディレクトリをシステム環境変数PATHに追加します。
# 接続先がOracle Database 18c (Version 18.3.0.0.0)の場合 $ printenv | grep -i oracle SQL_PLUS=C:\app\oracle\instantclient_18_3 # 何のパスかすぐわからなくなるので環境変数を1つ作ってそれをPATHに設定しました。 PATH=<省略>/c/app/oracle/instantclient_18_3:/c/ProgramData/Oracle/Java/javapath:<省略> ORIGINAL_PATH=<省略>/c/app/oracle/instantclient_18_3:/c/ProgramData/Oracle/Java/javapath:<省略>
5. ユーザ環境変数にTNS_ADMINとNLS_LANGを設定します。
# 接続先がOracle Database 18c (Version 18.3.0.0.0)の場合 TNS_ADMIN=C:\app\oracle\instantclient_18_3 NLS_LANG=Japanese_Japan.AL32UTF8
6. ORACLE ODBCドライバをインストールします。
管理者権限でプロンプトやGitBashなどを起動します。
# 接続先がOracle Database 18c (Version 18.3.0.0.0)の場合 $ cd $SQL_PLUS # 作った環境変数です。 $ odbc_install JA Oracle ODBC Driver is installed successfully.
7. SQL*Plusを起動してみます。
$ sqlplus SQL*Plus: Release 18.0.0.0.0 - Production on 水 9月 5 00:50:15 2018 Version 18.3.0.0.0 Copyright (c) 1982, 2018, Oracle. All rights reserved. ユーザー名を入力してください:
バージョン違いの実行記録
Windows10 + Oracle Database 12c (12.2.0.1.0)のInstant Client 64bit
- Oracle Technology Network(OTN)からパッケージをダウンロードします。
# ダウンロードしたものをすべて解凍して1つのフォルダにまとめて配置します。 $ cd /c/apps/oracle $ unzip ~/Downloads/instantclient-basic-windows.x64-12.2.0.1.0.zip Archive: /c/Users/ponsuke/Downloads/instantclient-basic-windows.x64-12.2.0.1.0.zip creating: instantclient_12_2/ inflating: instantclient_12_2/uidrvci.sym inflating: instantclient_12_2/oci.sym inflating: instantclient_12_2/oraocci12d.sym inflating: instantclient_12_2/oraons.dll inflating: instantclient_12_2/genezi.sym inflating: instantclient_12_2/ociw32.dll inflating: instantclient_12_2/oraocci12d.dll inflating: instantclient_12_2/oci.dll inflating: instantclient_12_2/ociw32.sym inflating: instantclient_12_2/adrci.exe inflating: instantclient_12_2/oramysql12.sym inflating: instantclient_12_2/adrci.sym inflating: instantclient_12_2/xstreams.jar inflating: instantclient_12_2/oraociei12.dll inflating: instantclient_12_2/ocijdbc12.dll inflating: instantclient_12_2/orasql12.sym inflating: instantclient_12_2/oraocci12.sym inflating: instantclient_12_2/orannzsbb12.dll inflating: instantclient_12_2/ocijdbc12.sym inflating: instantclient_12_2/oraociei12.sym inflating: instantclient_12_2/genezi.exe inflating: instantclient_12_2/ojdbc8.jar inflating: instantclient_12_2/orannzsbb12.sym inflating: instantclient_12_2/uidrvci.exe inflating: instantclient_12_2/oraocci12.dll creating: instantclient_12_2/vc14/ inflating: instantclient_12_2/vc14/oraocci12d.sym inflating: instantclient_12_2/vc14/oraocci12d.dll inflating: instantclient_12_2/vc14/oraocci12.dll inflating: instantclient_12_2/vc14/oraocci12.sym inflating: instantclient_12_2/orasql12.dll inflating: instantclient_12_2/oramysql12.dll inflating: instantclient_12_2/BASIC_README $ unzip ~/Downloads/instantclient-sqlplus-windows.x64-12.2.0.1.0.zip Archive: /c/Users/ponsuke/Downloads/instantclient-sqlplus-windows.x64-12.2.0.1.0.zip creating: instantclient_12_2/ inflating: instantclient_12_2/sqlplus.exe inflating: instantclient_12_2/SQLPLUS_README inflating: instantclient_12_2/glogin.sql inflating: instantclient_12_2/orasqlplusic12.dll inflating: instantclient_12_2/sqlplus.sym $ unzip ~/Downloads/instantclient-sdk-windows.x64-12.2.0.1.0.zip Archive: /c/Users/ponsuke/Downloads/instantclient-sdk-windows.x64-12.2.0.1.0.zip creating: instantclient_12_2/sdk/ creating: instantclient_12_2/sdk/include/ inflating: instantclient_12_2/sdk/include/oci8dp.h inflating: instantclient_12_2/sdk/include/occiCommon.h inflating: instantclient_12_2/sdk/include/occiControl.h inflating: instantclient_12_2/sdk/include/oci1.h inflating: instantclient_12_2/sdk/include/ociap.h inflating: instantclient_12_2/sdk/include/orl.h inflating: instantclient_12_2/sdk/include/oratypes.h inflating: instantclient_12_2/sdk/include/nzt.h inflating: instantclient_12_2/sdk/include/xa.h inflating: instantclient_12_2/sdk/include/odci.h inflating: instantclient_12_2/sdk/include/occi.h inflating: instantclient_12_2/sdk/include/ociapr.h inflating: instantclient_12_2/sdk/include/ldap.h inflating: instantclient_12_2/sdk/include/ocixstream.h inflating: instantclient_12_2/sdk/include/ocixmldb.h inflating: instantclient_12_2/sdk/include/oro.h inflating: instantclient_12_2/sdk/include/ocixml.h inflating: instantclient_12_2/sdk/include/oci.h inflating: instantclient_12_2/sdk/include/occiAQ.h inflating: instantclient_12_2/sdk/include/ocidef.h inflating: instantclient_12_2/sdk/include/ociextp.h inflating: instantclient_12_2/sdk/include/orid.h inflating: instantclient_12_2/sdk/include/ort.h inflating: instantclient_12_2/sdk/include/ocidem.h inflating: instantclient_12_2/sdk/include/ocikpr.h inflating: instantclient_12_2/sdk/include/occiObjects.h inflating: instantclient_12_2/sdk/include/ocidfn.h inflating: instantclient_12_2/sdk/include/ori.h inflating: instantclient_12_2/sdk/include/occiData.h inflating: instantclient_12_2/sdk/include/nzerror.h creating: instantclient_12_2/sdk/lib/ creating: instantclient_12_2/sdk/lib/msvc/ inflating: instantclient_12_2/sdk/lib/msvc/oci.lib inflating: instantclient_12_2/sdk/lib/msvc/oramysql12.lib creating: instantclient_12_2/sdk/lib/msvc/vc14/ inflating: instantclient_12_2/sdk/lib/msvc/vc14/oraocci12d.lib inflating: instantclient_12_2/sdk/lib/msvc/vc14/oraocci12.lib inflating: instantclient_12_2/sdk/lib/msvc/oraocci12.lib inflating: instantclient_12_2/sdk/lib/msvc/oraocci12d.lib inflating: instantclient_12_2/sdk/lib/msvc/ociw32.lib creating: instantclient_12_2/sdk/lib/bc/ inflating: instantclient_12_2/sdk/lib/bc/oci.lib extracting: instantclient_12_2/sdk/ottclasses.zip inflating: instantclient_12_2/sdk/SDK_README inflating: instantclient_12_2/sdk/ott.bat creating: instantclient_12_2/sdk/admin/ inflating: instantclient_12_2/sdk/admin/oraaccess.xsd creating: instantclient_12_2/sdk/demo/ inflating: instantclient_12_2/sdk/demo/bcmake.bat inflating: instantclient_12_2/sdk/demo/make.bat inflating: instantclient_12_2/sdk/demo/cdemo81.c inflating: instantclient_12_2/sdk/demo/occidemod.sql inflating: instantclient_12_2/sdk/demo/occiobj.typ inflating: instantclient_12_2/sdk/demo/occidml.cpp inflating: instantclient_12_2/sdk/demo/occiobj.cpp inflating: instantclient_12_2/sdk/demo/oraaccess.xml inflating: instantclient_12_2/sdk/demo/occidemo.sql $ unzip ~/Downloads/instantclient-jdbc-windows.x64-12.2.0.1.0.zip Archive: /c/Users/ponsuke/Downloads/instantclient-jdbc-windows.x64-12.2.0.1.0.zip inflating: instantclient_12_2/JDBC_README inflating: instantclient_12_2/orai18n-mapping.jar inflating: instantclient_12_2/heteroxa12.sym inflating: instantclient_12_2/heteroxa12.dll inflating: instantclient_12_2/orai18n.jar $ unzip ~/Downloads/instantclient-odbc-windows.x64-12.2.0.1.0-2.zip Archive: /c/Users/ponsuke/Downloads/instantclient-odbc-windows.x64-12.2.0.1.0-2.zip creating: instantclient_12_2/help/ creating: instantclient_12_2/help/ja/ inflating: instantclient_12_2/help/ja/blafdoc.css inflating: instantclient_12_2/help/ja/cpyr.htm creating: instantclient_12_2/help/ja/img/ inflating: instantclient_12_2/help/ja/img/odbcdrvarch.gif inflating: instantclient_12_2/help/ja/img/odbcmodel.gif inflating: instantclient_12_2/help/ja/img/setup_app.gif inflating: instantclient_12_2/help/ja/img/setup_ora.gif inflating: instantclient_12_2/help/ja/img/setup_ssmig.gif inflating: instantclient_12_2/help/ja/img/setup_work.gif creating: instantclient_12_2/help/ja/img_text/ inflating: instantclient_12_2/help/ja/img_text/odbcdrvarch.htm inflating: instantclient_12_2/help/ja/img_text/odbcmodel.htm inflating: instantclient_12_2/help/ja/img_text/setup_app.htm inflating: instantclient_12_2/help/ja/img_text/setup_ora.htm inflating: instantclient_12_2/help/ja/img_text/setup_ssmig.htm inflating: instantclient_12_2/help/ja/img_text/setup_work.htm inflating: instantclient_12_2/help/ja/map.xml inflating: instantclient_12_2/help/ja/oracle.gif inflating: instantclient_12_2/help/ja/sqora.htm inflating: instantclient_12_2/help/ja/toc.htm creating: instantclient_12_2/help/us/ inflating: instantclient_12_2/help/us/blafdoc.css inflating: instantclient_12_2/help/us/cpyr.htm creating: instantclient_12_2/help/us/img/ inflating: instantclient_12_2/help/us/img/odbcdrvarch.gif inflating: instantclient_12_2/help/us/img/odbcmodel.gif inflating: instantclient_12_2/help/us/img/setup_app.gif inflating: instantclient_12_2/help/us/img/setup_ora.gif inflating: instantclient_12_2/help/us/img/setup_ssmig.gif inflating: instantclient_12_2/help/us/img/setup_work.gif creating: instantclient_12_2/help/us/img_text/ inflating: instantclient_12_2/help/us/img_text/odbcdrvarch.htm inflating: instantclient_12_2/help/us/img_text/odbcmodel.htm inflating: instantclient_12_2/help/us/img_text/setup_app.htm inflating: instantclient_12_2/help/us/img_text/setup_ora.htm inflating: instantclient_12_2/help/us/img_text/setup_ssmig.htm inflating: instantclient_12_2/help/us/img_text/setup_work.htm inflating: instantclient_12_2/help/us/map.xml inflating: instantclient_12_2/help/us/oracle.gif inflating: instantclient_12_2/help/us/sqora.htm inflating: instantclient_12_2/help/us/toc.htm inflating: instantclient_12_2/ODBC_IC_Readme_Win.html inflating: instantclient_12_2/odbc_install.exe inflating: instantclient_12_2/odbc_uninstall.exe inflating: instantclient_12_2/sqora32.dll inflating: instantclient_12_2/sqoras32.dll inflating: instantclient_12_2/sqresja.dll inflating: instantclient_12_2/sqresus.dll $ find /c/apps/oracle/instantclient_12_2/ -type d /c/apps/oracle/instantclient_12_2/ /c/apps/oracle/instantclient_12_2/help /c/apps/oracle/instantclient_12_2/help/ja /c/apps/oracle/instantclient_12_2/help/ja/img /c/apps/oracle/instantclient_12_2/help/ja/img_text /c/apps/oracle/instantclient_12_2/help/us /c/apps/oracle/instantclient_12_2/help/us/img /c/apps/oracle/instantclient_12_2/help/us/img_text /c/apps/oracle/instantclient_12_2/sdk /c/apps/oracle/instantclient_12_2/sdk/admin /c/apps/oracle/instantclient_12_2/sdk/demo /c/apps/oracle/instantclient_12_2/sdk/include /c/apps/oracle/instantclient_12_2/sdk/lib /c/apps/oracle/instantclient_12_2/sdk/lib/bc /c/apps/oracle/instantclient_12_2/sdk/lib/msvc /c/apps/oracle/instantclient_12_2/sdk/lib/msvc/vc14 /c/apps/oracle/instantclient_12_2/vc14 # Instant Clientファイルを含むディレクトリをシステム環境変数PATHに追加します。 $ printenv | grep -i oracle ORACLE_INSTANT_CLIENT=C:\apps\oracle\instantclient_12_2 PATH=<省略>/c/apps/oracle/instantclient_12_2:<省略> ORIGINAL_PATH=<省略>/c/apps/composer:/c/apps/oracle/instantclient_12_2:<省略> # ユーザ環境変数にTNS_ADMINとNLS_LANGを設定します。 $ printenv | grep -e TNS_ADMIN -e NLS_LANG NLS_LANG=Japanese_Japan.AL32UTF8 TNS_ADMIN=C:\apps\oracle\instantclient_12_2 # ORACLE ODBCドライバをインストールします。 $ cd $ORACLE_INSTANT_CLIENT $ odbc_install JA Oracle ODBC Driver is installed successfully. # SQL*Plusを起動してみます。 $ sqlplus {ユーザ名}/{パスワード}@{データベース}:1521/{サービス名} SQL*Plus: Release 12.2.0.1.0 Production on 火 1月 28 10:18:28 2020 Copyright (c) 1982, 2016, Oracle. All rights reserved. 最終正常ログイン時間: 水 10月 02 2019 11:27:17 +09:00 Oracle Database 12c Standard Edition Release 12.2.0.1.0 - 64bit Production に接続されました。 SQL>
Windows10 + Oracle Database 12c (12.2.0.1.0)のInstant Client 32bit
- Instant Client for Windows 32-bitからパッケージをダウンロードします。
# ダウンロードしたものをすべて解凍して1つのフォルダにまとめて配置します。 $ find ~/Downloads/ -name '*.zip' | xargs -n1 unzip -d /c/app/oracle/ Archive: /c/Users/m-uki/Downloads/instantclient-basiclite-nt-12.2.0.1.0.zip creating: /c/app/oracle/instantclient_12_2/ inflating: /c/app/oracle/instantclient_12_2/oraocci12.sym inflating: /c/app/oracle/instantclient_12_2/oraociicus12.dll inflating: /c/app/oracle/instantclient_12_2/uidrvci.sym inflating: /c/app/oracle/instantclient_12_2/ocijdbc12.dll inflating: /c/app/oracle/instantclient_12_2/xstreams.jar inflating: /c/app/oracle/instantclient_12_2/orasql12.sym inflating: /c/app/oracle/instantclient_12_2/oraocci12d.dll inflating: /c/app/oracle/instantclient_12_2/genezi.exe inflating: /c/app/oracle/instantclient_12_2/ojdbc8.jar inflating: /c/app/oracle/instantclient_12_2/adrci.exe inflating: /c/app/oracle/instantclient_12_2/BASIC_LITE_README inflating: /c/app/oracle/instantclient_12_2/oraocci12d.sym inflating: /c/app/oracle/instantclient_12_2/orasql12.dll inflating: /c/app/oracle/instantclient_12_2/oraociicus12.sym inflating: /c/app/oracle/instantclient_12_2/oraocci12.dll inflating: /c/app/oracle/instantclient_12_2/ocijdbc12.sym inflating: /c/app/oracle/instantclient_12_2/orannzsbb12.dll inflating: /c/app/oracle/instantclient_12_2/ociw32.sym inflating: /c/app/oracle/instantclient_12_2/adrci.sym creating: /c/app/oracle/instantclient_12_2/vc14/ inflating: /c/app/oracle/instantclient_12_2/vc14/oraocci12d.sym inflating: /c/app/oracle/instantclient_12_2/vc14/oraocci12d.dll inflating: /c/app/oracle/instantclient_12_2/vc14/oraocci12.dll inflating: /c/app/oracle/instantclient_12_2/vc14/oraocci12.sym inflating: /c/app/oracle/instantclient_12_2/oci.dll inflating: /c/app/oracle/instantclient_12_2/oraons.dll inflating: /c/app/oracle/instantclient_12_2/genezi.sym inflating: /c/app/oracle/instantclient_12_2/ociw32.dll inflating: /c/app/oracle/instantclient_12_2/oci.sym inflating: /c/app/oracle/instantclient_12_2/uidrvci.exe inflating: /c/app/oracle/instantclient_12_2/orannzsbb12.sym Archive: /c/Users/m-uki/Downloads/instantclient-jdbc-nt-12.2.0.1.0.zip inflating: /c/app/oracle/instantclient_12_2/orai18n-mapping.jar inflating: /c/app/oracle/instantclient_12_2/JDBC_README inflating: /c/app/oracle/instantclient_12_2/heteroxa12.dll inflating: /c/app/oracle/instantclient_12_2/heteroxa12.sym inflating: /c/app/oracle/instantclient_12_2/orai18n.jar Archive: /c/Users/m-uki/Downloads/instantclient-odbc-nt-12.2.0.1.0-2.zip creating: /c/app/oracle/instantclient_12_2/help/ creating: /c/app/oracle/instantclient_12_2/help/ja/ inflating: /c/app/oracle/instantclient_12_2/help/ja/blafdoc.css inflating: /c/app/oracle/instantclient_12_2/help/ja/cpyr.htm creating: /c/app/oracle/instantclient_12_2/help/ja/img/ inflating: /c/app/oracle/instantclient_12_2/help/ja/img/odbcdrvarch.gif inflating: /c/app/oracle/instantclient_12_2/help/ja/img/odbcmodel.gif inflating: /c/app/oracle/instantclient_12_2/help/ja/img/setup_app.gif inflating: /c/app/oracle/instantclient_12_2/help/ja/img/setup_ora.gif inflating: /c/app/oracle/instantclient_12_2/help/ja/img/setup_ssmig.gif inflating: /c/app/oracle/instantclient_12_2/help/ja/img/setup_work.gif creating: /c/app/oracle/instantclient_12_2/help/ja/img_text/ inflating: /c/app/oracle/instantclient_12_2/help/ja/img_text/odbcdrvarch.htm inflating: /c/app/oracle/instantclient_12_2/help/ja/img_text/odbcmodel.htm inflating: /c/app/oracle/instantclient_12_2/help/ja/img_text/setup_app.htm inflating: /c/app/oracle/instantclient_12_2/help/ja/img_text/setup_ora.htm inflating: /c/app/oracle/instantclient_12_2/help/ja/img_text/setup_ssmig.htm inflating: /c/app/oracle/instantclient_12_2/help/ja/img_text/setup_work.htm inflating: /c/app/oracle/instantclient_12_2/help/ja/map.xml inflating: /c/app/oracle/instantclient_12_2/help/ja/oracle.gif inflating: /c/app/oracle/instantclient_12_2/help/ja/sqora.htm inflating: /c/app/oracle/instantclient_12_2/help/ja/toc.htm creating: /c/app/oracle/instantclient_12_2/help/us/ inflating: /c/app/oracle/instantclient_12_2/help/us/blafdoc.css inflating: /c/app/oracle/instantclient_12_2/help/us/cpyr.htm creating: /c/app/oracle/instantclient_12_2/help/us/img/ inflating: /c/app/oracle/instantclient_12_2/help/us/img/odbcdrvarch.gif inflating: /c/app/oracle/instantclient_12_2/help/us/img/odbcmodel.gif inflating: /c/app/oracle/instantclient_12_2/help/us/img/setup_app.gif inflating: /c/app/oracle/instantclient_12_2/help/us/img/setup_ora.gif inflating: /c/app/oracle/instantclient_12_2/help/us/img/setup_ssmig.gif inflating: /c/app/oracle/instantclient_12_2/help/us/img/setup_work.gif creating: /c/app/oracle/instantclient_12_2/help/us/img_text/ inflating: /c/app/oracle/instantclient_12_2/help/us/img_text/odbcdrvarch.htm inflating: /c/app/oracle/instantclient_12_2/help/us/img_text/odbcmodel.htm inflating: /c/app/oracle/instantclient_12_2/help/us/img_text/setup_app.htm inflating: /c/app/oracle/instantclient_12_2/help/us/img_text/setup_ora.htm inflating: /c/app/oracle/instantclient_12_2/help/us/img_text/setup_ssmig.htm inflating: /c/app/oracle/instantclient_12_2/help/us/img_text/setup_work.htm inflating: /c/app/oracle/instantclient_12_2/help/us/map.xml inflating: /c/app/oracle/instantclient_12_2/help/us/oracle.gif inflating: /c/app/oracle/instantclient_12_2/help/us/sqora.htm inflating: /c/app/oracle/instantclient_12_2/help/us/toc.htm inflating: /c/app/oracle/instantclient_12_2/ODBC_IC_Readme_Win.html inflating: /c/app/oracle/instantclient_12_2/odbc_install.exe inflating: /c/app/oracle/instantclient_12_2/odbc_uninstall.exe inflating: /c/app/oracle/instantclient_12_2/sqora32.dll inflating: /c/app/oracle/instantclient_12_2/sqoras32.dll inflating: /c/app/oracle/instantclient_12_2/sqresja.dll inflating: /c/app/oracle/instantclient_12_2/sqresus.dll Archive: /c/Users/m-uki/Downloads/instantclient-sdk-nt-12.2.0.1.0.zip creating: /c/app/oracle/instantclient_12_2/sdk/ creating: /c/app/oracle/instantclient_12_2/sdk/admin/ inflating: /c/app/oracle/instantclient_12_2/sdk/admin/oraaccess.xsd inflating: /c/app/oracle/instantclient_12_2/sdk/ott.bat creating: /c/app/oracle/instantclient_12_2/sdk/demo/ inflating: /c/app/oracle/instantclient_12_2/sdk/demo/occidml.cpp inflating: /c/app/oracle/instantclient_12_2/sdk/demo/occiobj.typ inflating: /c/app/oracle/instantclient_12_2/sdk/demo/occiobj.cpp inflating: /c/app/oracle/instantclient_12_2/sdk/demo/cdemo81.c inflating: /c/app/oracle/instantclient_12_2/sdk/demo/occidemod.sql inflating: /c/app/oracle/instantclient_12_2/sdk/demo/make.bat inflating: /c/app/oracle/instantclient_12_2/sdk/demo/bcmake.bat inflating: /c/app/oracle/instantclient_12_2/sdk/demo/occidemo.sql inflating: /c/app/oracle/instantclient_12_2/sdk/demo/oraaccess.xml inflating: /c/app/oracle/instantclient_12_2/sdk/SDK_README creating: /c/app/oracle/instantclient_12_2/sdk/lib/ creating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/ inflating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/oramysql12.lib creating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/vc14/ inflating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/vc14/oraocci12d.lib inflating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/vc14/oraocci12.lib inflating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/ociw32.lib inflating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/oraocci12d.lib inflating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/oraocci12.lib inflating: /c/app/oracle/instantclient_12_2/sdk/lib/msvc/oci.lib creating: /c/app/oracle/instantclient_12_2/sdk/lib/bc/ inflating: /c/app/oracle/instantclient_12_2/sdk/lib/bc/oci.lib creating: /c/app/oracle/instantclient_12_2/sdk/include/ inflating: /c/app/oracle/instantclient_12_2/sdk/include/ociapr.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/occiCommon.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/ori.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/oci8dp.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/ldap.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/ocixstream.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/odci.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/ort.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/occi.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/occiObjects.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/ocixml.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/occiData.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/oci1.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/oci.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/xa.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/oratypes.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/nzerror.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/occiControl.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/ocidem.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/occiAQ.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/oro.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/ocidef.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/orid.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/ocixmldb.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/ociextp.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/nzt.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/ocikpr.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/orl.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/ocidfn.h inflating: /c/app/oracle/instantclient_12_2/sdk/include/ociap.h extracting: /c/app/oracle/instantclient_12_2/sdk/ottclasses.zip Archive: /c/Users/m-uki/Downloads/instantclient-sqlplus-nt-12.2.0.1.0.zip inflating: /c/app/oracle/instantclient_12_2/sqlplus.exe inflating: /c/app/oracle/instantclient_12_2/SQLPLUS_README inflating: /c/app/oracle/instantclient_12_2/glogin.sql inflating: /c/app/oracle/instantclient_12_2/orasqlplusic12.dll inflating: /c/app/oracle/instantclient_12_2/sqlplus.sym $ find /c/app/oracle/instantclient_12_2/ -type d /c/app/oracle/instantclient_12_2/ /c/app/oracle/instantclient_12_2/help /c/app/oracle/instantclient_12_2/help/ja /c/app/oracle/instantclient_12_2/help/ja/img /c/app/oracle/instantclient_12_2/help/ja/img_text /c/app/oracle/instantclient_12_2/help/us /c/app/oracle/instantclient_12_2/help/us/img /c/app/oracle/instantclient_12_2/help/us/img_text /c/app/oracle/instantclient_12_2/sdk /c/app/oracle/instantclient_12_2/sdk/admin /c/app/oracle/instantclient_12_2/sdk/demo /c/app/oracle/instantclient_12_2/sdk/include /c/app/oracle/instantclient_12_2/sdk/lib /c/app/oracle/instantclient_12_2/sdk/lib/bc /c/app/oracle/instantclient_12_2/sdk/lib/msvc /c/app/oracle/instantclient_12_2/sdk/lib/msvc/vc14 /c/app/oracle/instantclient_12_2/vc14 # Instant Clientファイルを含むディレクトリをシステム環境変数PATHに追加します。 # ユーザ環境変数にTNS_ADMINとNLS_LANGを設定します。 $ printenv | grep -i -e instant -e NLS_LANG NLS_LANG=Japanese_Japan.AL32UTF8 TNS_ADMIN=C:\app\oracle\instantclient_12_2 PATH=<省略>/c/app/oracle/instantclient_12_2 # SQL*Plusを起動してみます。 $ sqlplus SQL*Plus: Release 12.2.0.1.0 Production on 火 1月 28 21:42:39 2020 Copyright (c) 1982, 2017, Oracle. All rights reserved. ユーザー名を入力してください:
Ubuntu18 + Oracle Database 12c (12.2.0.1.0)のInstant Client 64bit
IPヘッダにあるプロトコル番号でプロトコルを識別できます。
- 前回の勉強内容
- 勉強のきっかけになった問題
- IPv4は、32 ビット (4 バイト) を4つに「.」で区切って表すIPです。
- ICMPは、IPにおいて制御や調査に用いられるプロトコルです。
- プロトコル番号は、IPにおいてプロトコル毎に割り振られた番号です。
- ICMPフレームの部分は、データ本体であるIPペイロードに入っています。
- 次回の勉強内容
前回の勉強内容
勉強のきっかけになった問題
IPv4において,IPパケットで送られているデータが,ICMPメッセージであることを識別できるヘッダ情報はどれか。
IPv4は、32 ビット (4 バイト) を4つに「.」で区切って表すIPです。
IPv6は、IPv4よりたくさん割り当てられるように128 ビット (16 バイト)で表すIPです。
IPv6アドレスは『128bit』で構成されます。これは2^128通りのアドレス数を保有することになります。
IPv4とIPv6の違いについて | Netassist Blog
ICMPは、IPにおいて制御や調査に用いられるプロトコルです。
- 正式名称:Internet Control Message Protocol
IPプロトコルの「エラー通知」や「制御メッセージ」を転送するためのプロトコルです。TCP/IPが実装されたコンピュータ間で、通信状態を確認するために使用されます。 ICMPはインターネット層(OSI参照モデルのネットワーク層)で動作するプロトコルです。
TCP/IP - ICMPとは
※. ベースの図は、以下のサイト様より拝借いたしました。
TCP/IPをはじめから
ICMP Flood攻撃 と Smurf攻撃は、ICMPのpingを使った攻撃です。
ping の正体は、ICMP の中で一番有名な使われ方である『Ping 要求【Echo Request】』と『Ping 応答【Echo Reply】』で、これは宛先 IP アドレスを 指定して Ping 要求を送り、その宛先まで到達できれば送信元へ Ping 応答を返します。
【図解】ICMPとは 〜Pingの仕組みやエラー通知によるIP通信の補助〜 | SEの道標
ICMP Flood攻撃は、pingコマンドを用いて大量の要求パケットを発信することによって、攻撃対象のサーバに至るまでの回線を過負荷にしてアクセスを妨害します。
- 英語 : ICMP Flood(洪水)
攻撃対象となるサーバに対してなるべくサイズが大きくなるようにした「ICMP echo request(ping)」を大量に送り続けることで、攻撃対象および攻撃対象が属するネットワークのリソースを枯渇させることを目的とする攻撃です。
情報セキュリティスペシャリスト平成29年春期 午前Ⅱ 問18
Smurf攻撃は、IPアドレスを詐称してICMPの応答パケットを大量に送り付けます。
Smurf攻撃(スマーフアタック)は、ネットワークの疎通確認に使用されるICMP echo request(ping)の仕組みを悪用して、相手のコンピュータやネットワークに大量のパケットを送りつける反射型のDoS攻撃です。
攻撃者は、以下の手順で攻撃対象のサービスを妨害します。
①送信元IPアドレスを攻撃対象のコンピュータに偽装したICMP echo requestを攻撃対象が属するネットワークにブロードキャストで大量に送りつける
②ICMP echo requestを受け取ったネットワーク内の端末が一斉に攻撃対象にecho replyパケットで応答する
③大量の応答パケットの発生により攻撃対象のコンピュータおよびネットワークが過負荷状態になり正常なサービスが阻害される
情報セキュリティスペシャリスト平成26年秋期 午前Ⅱ 問12
プロトコル番号は、IPにおいてプロトコル毎に割り振られた番号です。
プロトコル番号とは、IP(Internet Protocol)で通信する際に、上位層のプロトコルがなんであるかを識別するための番号。IPデータグラムのヘッダ部に8ビットの値として記載されるもので、0から255までのいずれかとなる。
プロトコル番号とは - IT用語辞典 e-Words
プロトコル番号は、上位層のプロトコルを識別するための番号であり、IPヘッダに 8 ビット情報であります。例えばプロトコル番号が 6 の場合はTCP、17 の場合はUDPとなります。プロトコル番号の枠は0~255です。
IPプロトコル番号一覧
プロトコル番号がわかるとプロトコルに何を使っているかがわかります。
IANAのプロトコル番号の一部はこんな感じです。
Decimal | Keyword | Protocol |
---|---|---|
1 | ICMP | Internet Control Message |
4 | IPv4 | IPv4 encapsulation |
6 | TCP | Transmission Control |
17 | UDP | User Datagram |
41 | IPv6 | IPv6 encapsulation |
ICMPのプロトコル番号は「1」です。
プロトコル番号は、Internet Protocol(IP)の宛先情報を含めているIPヘッダーに入っています。
ICMPフレームの部分は、データ本体であるIPペイロードに入っています。
ICMPフレーム部分でタイプ番号とそのコード番号がわかります。
ICMPのタイプ一覧
Type | 意味 |
---|---|
0 | エコー応答(Ping要求 / Echo Request) |
3 | 宛先到達不能 |
4 | 始点抑制 |
5 | 最適経路への変更指示 |
8 | エコー要求(Ping応答 / Echo Reply) |
9 | ルータ通知 |
10 | ルータ要求 |
11 | TTL超過によるパケット破棄の報告 |
12 | パケットパラメータにおけるエラー |
13 | タイムスタンプ |
14 | タイムスタンプ応答 |
15 | インフォメーション要求 |
16 | インフォメーション応答 |
17 | アドレスマスク要求 |
18 | アドレスマスク応答 |
第12回 TCP/IPプロトコルを支えるICMPメッセージ (1/3):基礎から学ぶWindowsネットワーク - @IT
次回の勉強内容
Spring MVC で簡単そうなエコーアプリを作って基本を学ぶ
- 前回は、プロジェクトに Spring MVC を設定したので簡単なアプリを作ってみます。
- 環境
- ここで作るエコーアプリはこの本のSpring MVCの章にあるものです。
- トップ画面を作ります。
- 入力画面を作成します。
- 入力画面の入力値を出力画面に表示する処理を作成します。
- Bean Validationを使用した入力チェックを作成します。
- この本を読みながらやりました
前回は、プロジェクトに Spring MVC を設定したので簡単なアプリを作ってみます。
ここで作るエコーアプリはこの本のSpring MVCの章にあるものです。
トップ画面から遷移した入力画面で値を入力して出力画面に表示します。
www.shoeisha.co.jp
トップ画面を作ります。
Controllerを作ります。
package example.app; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /** トップ画面用のController. */ @Controller public class WelcomeController { /** * トップ画面の表示リクエストをハンドリングするためのメソッド. * RequestMappingアノテーションに"/"を指定することで、"/"というパスに対するリクエストがこのメソッドにマッピングされる. * @return トップ画面のView名. */ @RequestMapping("/") public String home() { // トップ画面に表示するView名として"index"を返却すると「/src/main/webapp/index.jsp」が呼び出される。 return "index"; } }
Viewを作成します。
以前、ViewResolverを設定しました。これにより、/WEB-INFディレクトリ配下に格納されているJSPファイルがViewとして扱われます。
index.jspを「/src/main/webapp/index.jsp」へ移動します。
以前、作ったindex.jspを表示できるようにControllerの@RequestMappingに合わせた場所へ移動します。
ponsuke-tarou.hatenablog.com
index.jspにエコーアプリケーションの入力画面を表示するリクエストを送信するリンクを追加します。
「c: 」は、以前プロジェクトにSpringを設定する中でJSPで使えるように設定しました。
<html> <body> <h2>Hello World!</h2> <ul> <!-- JSTL(JSP Standerd Tag Library)の「c:url」を使用して {アプリケーションのコンテキストパス} + "/echo"へのリンクを追加しています. --> <li><a href="<c:url value='/echo' />">エコーアプリケーションへ</a></li> </ul> </body> </html>
リンクが追加されたことを画面を表示して確認します。
入力画面を作成します。
HTMLのform要素内の入力値を保持するためのフォームクラスを作成します。
package example.app; import java.io.Serializable; /** * HTMLの<form>要素内で取り扱う入力値を保持するフォームクラス. */ public class EchoForm implements Serializable { /** serialVersionUID. */ private static final long serialVersionUID = -3147370534900886671L; /** 入力値を保持するプロパティ定義. */ private String text; public String getText() { return text; } public void setText(String text) { this.text = text; } }
Controllerを作成して表示リスクエストをハンドリングするためのメソッドを実装します。
package example.app; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; /** * 入力画面のController. * RequestMappingアノテーションで指定する"echo"により"/echo"というパスのリクエストがこのControllerにマッピングされます. */ @Controller @RequestMapping("echo") public class EchoController { /** * 表示リスクエストをハンドリングするためのメソッド. * RequestMappingアノテーションでRequestMethod.GETを指定することで"GET /echo"というリクエストがこのメソッドにマッピングされます. * @param model * @return 入力画面を表示するJSPのView名. */ @RequestMapping(method = RequestMethod.GET) public String viewInput(Model model) { // フォームオブジェクトを生成してModelに追加します。 EchoForm form = new EchoForm(); // 属性名を省略しているため、クラス名の"echoForm"という属性名で追加されます。 // Modelに追加したオブジェクトは、HttpServletRequestにエクスポートされる仕組みとなっているため // JSPからは、リクエストスコープのオブジェクトとして参照できます。 model.addAttribute(form); return "echo/input"; } }
Controllerのメソッドの返却値"echo/input"に合わせて「/WEB-INF/echo/input.jsp」で入力画面のViewを作成します。
<html> <body> <h2>入力画面</h2> <!-- Spring MVCから提供されている「form:form」要素を使用して、HTMLのフォームを作成すします. modelAttribute属性にフォームオブジェクトの属性名を指定します. 「form:form」要素にはmethod/action属性が指定でき、省略すると method属性は"post"、action属性は画面表示時URLのアプリケーションのコンテキストパス以降の値 となります. ここのaction属性は、"{App名}/echo"となります. --> <form:form modelAttribute="echoForm"> <div>テキストを入力してください :</div> <div> <!-- Spring MVCから提供されている「form:input」要素を使用して、テキストフィールドを作成します. path属性に指定したechoForm(modelAttribute属性で指定)のプロパティが保持する値が初期値として表示されます. --> <form:input path="text" /> </div> <div> <!-- Spring MVCから提供されている「form:button」要素を使用して、HTMLフォームの送信ボタンを作成します。 --> <form:button>送信</form:button> </div> </form:form> </body> </html>
トップ画面のリンクを押下して入力画面を表示してみます。
入力画面の入力値を出力画面に表示する処理を作成します。
入力値送信リクエストをハンドリングするためのメソッドをController(EchoController.java)に追加します。
/** * 入力画面の送信リクエストをハンドリンクするためのメソッド. * RequestMappingアノテーションでRequestMethod.POSTを指定することで"POST /echo"というリクエストがこのメソッドにマッピングされます. * @param form 引数にフォームクラスを指定することでリクエストパラメータの値(入力値)をフォームオブジェクトに格納して受け取れます. * また、フォームオブジェクトはModelにも自動的に追加される仕組みとなっているため、明示的にModelに追加する必要はありません. * @return 出力画面を表示するJSPのView名. */ @RequestMapping(method = RequestMethod.POST) public String echo(EchoForm form) { return "echo/output"; }
Controllerのメソッドの返却値"echo/output"に合わせて「/WEB-INF/echo/output.jsp」で出力画面のViewを作成します。
<html> <body> <h2>出力画面</h2> <div>入力したテキストは・・・</div> <div> <!-- JSTL(JSP Standerd Tag Library)の「c:out」を使用してフォームオブジェクト(echoForm)のプロパティ(text)値をHTMLに出力します. 「c:out」を使用することで、XSS(クロスサイトスクリプティング)攻撃で使用される特殊な文字を単なる文字としてHTMLに出力できます. --> 「<span><c:out value="${echoForm.text}" /></span>」 </div> <div>です。</div> <br> <div> <!-- トップ画面を表示するリクエスト(GET /)を送信するリンクです. --> <a href="<c:url value='/' />">トップ画面へ戻る</a> </div> </body> </html>
出力画面を表示してみます。
Bean Validationを使用した入力チェックを作成します。
Spring MVCでは、Bean Validationの仕組みを利用してフォームオブジェクトのプロパティに入力チェックルールを指定します。
フォームオブジェクト(EchoForm.java)にBean Validationの制約アノテーションを追加します。
Hibernate Validationは、前回pom.xmlで設定しました。
/** * 入力値を保持するプロパティ定義. * Hibernate Validationが提供するNotEmptyアノテーションを付加することで入力必須チェックを行います. * Bean Validationが提供するSizeアノテーションを付加することで最大文字数のチェックを行います. */ @NotEmpty @Size(max = 10) private String text;
Springのプロパティでは未入力時にデフォルトで空文字が設定されるため、必須チェックは @NotNull ではなく @NotEmpty を使用します。
Spring以外のプロパティ値に対しては Bean Validation が提供する @java.validation.constraints.NotNull で必須チェックが行えます。
Controllerの送信リクエストをハンドリンクするためのメソッド(EchoController#echo)でSpring MVCの入力チェック機能を有効化してエラーのハンドリング処理を追加します。
/** * 入力画面の送信リクエストをハンドリンクするためのメソッド. * RequestMappingアノテーションでRequestMethod.POSTを指定することで"POST /echo"というリクエストがこのメソッドにマッピングされます. * @param form 引数にフォームクラスを指定することでリクエストパラメータの値(入力値)をフォームオブジェクトに格納して受け取れます. * また、フォームオブジェクトはModelにも自動的に追加される仕組みとなっているため、明示的にModelに追加する必要はありません. * <<入力チェック>> * パラメータのフォームオブジェクトに Validアノテーションを付与することで、入力チェックを実施してその結果を BindingResult に格納できます. * @param result BindingResultは入力チェックするフォームオブジェクトの直後に指定します. * BindingResult もModelに自動的に追加されるため、明示的にModelに追加する必要はありません. * @return 出力画面を表示するJSPのView名. */ @RequestMapping(method = RequestMethod.POST) public String echo(@Valid EchoForm form, BindingResult result) { // BindingResult#hasErrorsを呼び出すことで入力チェックのエラー判定を行います。 if (result.hasErrors()) { // エラーの場合は、入力画面のView名を返却し、入力画面にエラー情報を表示します。 return "echo/input"; } return "echo/output"; }
View(input.jsp)にエラー情報を表示するパーツを追加します。
<form:input path="text" /> <!-- Spring MVCが提供する「form:errors」要素を使用して、入力チェックのエラー情報を表示します. path属性に指定されたプロパティのエラー情報が表示されます。 --> <form:errors path="text" /> </div>
エラーになったときの入力画面を表示してみます。