20170711(Tue)
今日したこと
ShoppingSite
詰まったところ
・値渡しのロジック?
カートロジックはsessionを使ったけど
フォワード先で怒られてしまう
デバッグを使いこなして原因を探すことを勧められた
Product product = (Product)session.getAttribute("Product");
ここで、"Product"はStringだったから型キャストできませんって怒られてて、
HttpSession session = request.getSession();
Product product = new Product();
product.setName(ringo);
session.setAttribute("Product", product);
これしたらちゃんとできるようになった
助けてもらったところだから微妙や〜
言葉で説明できるようになったらいいかな
1回目のplan完成まではもうちょっとだ
20170710(Mon)
今日したこと
ShoppingSite
Eclipseでしていたpushをターミナル作業に変更する
進行状況をgithubにpush
画像の指定→絶対パスを調べる
shoppingカートへ選んだ商品を追加する
< form >で飛ばす(ロジックを作るためJavaに飛ばしてからjsp)
サーブレットは、WebブラウザからURLや、Webページの中のリンクにURLを指定して呼び出す。
そのURLは、Eclipseのプロジェクト名とサーブレットの@WebServletというアノテーションと関連付く。
URLで指定して呼び出す場合
http://サーバホスト名:ポート番号/Eclipseプロジェクト名/@WebServletアノテーション
※ポート番号は省略可。省略した場合はポート番号は80となる。
Webページの中のリンクから呼び出す場合
<a href="Eclipseプロジェクト名/@WebServletアノテーション">Click Here</a>
フォームから呼び出す場合
<form action="Eclipseプロジェクト名/@WebServletアノテーション" method=post>
ターミナルからGitHubへEclipseのプロジェクトをpush
・前回、リモートからクローンしたリポジトリをeclipseで開く
静的プロジェクトができるので、プロジェクトのプロパティからプロジェクト・ファセットでJavaと動的Webプロジェクトにチェックを入れると動的Webプロジェクトになる
・色々作っていく
・ターミナルに行って、リモートと連携してる?ディレクトリに移動
・中を見ると
WebContent build memo1.txt src
ってなってたので、WebContent src の二つをaddする
git add WebContent
git add src
次にコメントをつけてコミット(コメントって何にしたらいいのかわからない)
git commit -m "20170710"
最後にリモートにpush
git push リモート名 ブランチ名
これでeclipseからチーム・プロジェクト共有ってしないで
ターミナルで全てできるようになる
まだできていないところ
20170707(Fri)
今日したこと
ShoppingSite
ログインロジックビュー
メイン
ログアウトロジックビュー
進行状況をgithubにpush
商品一覧ページの作成
MYSQLとEclipseの連携(文字化けするけどブラウザに表示されるとこまでは進んだ)
質問
・githubの現在の状況がよくわからない(前回クローンしてからローカルとリモートの関係性がめちゃくちゃでわからない)
・eclipseからのpushをターミナルからと言われたけど、現在ターミナルからpushしたことのあるものはvimで作ったテキストのみでよくわからない
・クローンしたあと、eclipseに取り込んだ内容をブラウザで試せない(動的webプロジェクトではなくなってしまっている。ただ外部JARを足せばいいだけかもしれないけど)
・商品画像をネットから拾ってローカルに保存してからリンクを貼ったけど、実際amazonとかのページはどこから画像を持ってくるのか(後画像でないのなんで)
GitHub GitItで学んだものメモ
Git
オープンソースソフトウェア
変更を記録してくれる
バージョン管理システムとして知られる
ターミナルでいつでも使うことができる
Gitの設定
git --version
git config --global user.name "ほにゃらら"
git config --global user.email "メールアドレス"
Repositories
プロジェクトのこと
自分のプロジェクトをGitに伝えることで、そのフォルダの中のすべての変更を追跡してもらえる(バージョン管理システム)
以下例
mkdir フォルダ名
cd hello-world
git init
git status
ファイルの追加/保存/確認
git add ファイル名
git commit -m "コメント"
git diff
git add.
GitHubのアカウントを作り、Gitにユーザー名を追加
git config --global user.username ユーザ名
・GitHubに作成した名前と全く同じ名前
・大文字小文字は区別されるので注意
REMOTE
GitHubに何かをおくとそれはGitHubのサーバー上に存在していることになる(リモートリポジトリ)
自分のローカル(コンピュータのこと)の変更をpushすることでプロジェクトを最新状態に保てる
リモートにある変更をpullしてそれぞれのコンピュータに取り込みプロジェクトを最新の状態にする
お互いのコンピュータにアクセスすることなくプロジェクトメンバー同士がコードや情報を共有できる
リモートリポジトリを作る
ローカルにあるバージョンをリモートのバージョンと同期するため、空っぽのリモートリポジトリをGitHubに作る
・new repository
・ローカルリポジトリと一致する名前をつけ、短い説明をつける
・publicを選択
・readmeはプロジェクトに関する説明、どう使うか、どう貢献するかを書くもの
・.gitignoreはGitに追跡しないでほしいものの一覧(パスワードファイルなど)
・licenseファイルはプロジェクトに対するライセンスを定義する
・create repository
ローカルとリモートをつなぐ
httpsボタンを選択し、 GitHubサーバ上におけるリポジトリのアドレスをコピーする
ターミナルでGitリポジトリとして初期化したフォルダの中から、GitHubサーバ上にあるリモートバージョンの場所をGitに知らせる(別の名前をつけ複数のリモートを設定することもできる。メインのリモートサーバに対しては通常originと名付ける)
git remote add origin コピーしたURL
作業内容をリモートにPushする
Gitのブランチという仕組みは、プロジェクトの別々の箇所に対して別々のタイミングで作業できるようにするためのもの
最初のブランチはデフォルトではmasterという名前である
git push origin master
fork
リポジトリをフォークするとそのリポジトリのコピーを自分のGitHubアカウントの下に作ることになり、それはremoteリポジトリの一つとして使える
あるプロジェクトの自分自身のバージョンを作るために使用したり、元のプロジェクトに対してバグ修正や機能追加を送り返してあげるために使用する
clone(コピー)
リポジトリのコピーを自分のコンピュータ上に持ってくることができる
クローンすると新しいフォルダが作られる
別のGitリポジトリのフォルダの中にリポジトリをクローンしないように注意する
git clone コピーしたURL
ブランチ
Gitリポジトリは必要に応じてブランチを使い、隔離された作業環境を作れる
プロジェクトで作業するとき、または他人と作業するとき、ブランチを作って変更を保存する
メインのブランチを安全に保ち作業できる
作業が終わり、準備が整ったら、ブランチをmasterにマージする
ブランチを作る
ブランチを作るとGitは今いるブランチのものをすべてコピーして、新しく作ったブランチに持ってきてくれる
git status
ブランチ名は大文字小文字区別あり
git branch ブランチにつける名前
git checkout ブランチの名前
ソーシャルコーディング
他の人と共同作業が簡単にできるところがGitHubのいいところのひとつ
コラボレーターというのはGitHubのユーザでかつ誰かのリポジトリにアクセスし、編集することが許された権限を持つ人たちのこと
プロジェクトにコラボレーターを追加するにはGitHubのリポジトリページに行き、Settingをクリックする
その後Collaboratorsタブを選択、追加したいユーザ名を入力しAddをクリックする
Pull
誰かと一緒に作業していて、ファイルを最新に保ちたいという状況になったとき、pullすることで変更を取り込める
git pull リモートの名前 ブランチの名前
git fetch --dry--run
なにも変更がなければ、Already up-to-date、何か変更があればGitがそれをローカルにマージしてくれる
Pull Request
フォークしたリポジトリに変更や改善を加えたら、それらの変更を元のリポジトリのメンテナーに対して変更を元のリポジトリにpullしてほしいというrequestを送る
ローカルでマージする
git merge ブランチの名前
git checkout ブランチの名前
git branch -d ブランチの名前
git push リモートの名前 --delete ブランチの名前
git pull リモートの名前 ブランチの名前
注意点
プロジェクト名が複数単語から作られる場合ハイフンをいれる
例 shopping-site
またmysqlに接続できなくなったので対処をメモ
mysql -u root -p
から
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
で
で調べて
findコマンド使ってmysql.serverファイル探し
それでmysqlの起動はできたけど接続ができない
エラー文がこれと同じだったので、ここみて
sockファイルがないとのことだったので
sudo touch mysql.sock
でファイルを作る
sudo mysql.server restart
でmysqlを再起動
でもっかいmysql -u root -pでパスワードうって成功
最初の工程いらなかったかな
exitするたび入れなくなってて困る
なんか設定でもおかしいのかな
独習Javaサーバサイド編第2版 第10章まとめ
クロスサイトスクリプティング(XSS:CrossSiteScripting)脆弱性
エスケープ処理の不備などが原因でエンドユーザからの入力などによって生成されるページで、不正なスクリプトを混入/実行されてしまうセキュリティーホールのこと
対策
アプリケーションによって生成されるすべての値に対してHTMLエスケープ処理を施す(< > &のようなHTML予約文字を< > &のような無害な文字に置き換えること)
Functionタグライブラリのfn:escapeXml関数を利用する
SQLインジェクション
SQL命令に不正なパラメータを引き渡すことで本来開発者が意図していなかったSQL命令が生成/実行されてしまう脆弱性のこと
結果的に公開されるはずでなかった機密情報が漏洩したり重要なデータが削除されてしまう可能性がある
対策
SQLエスケープで、文字列の終了を表す'を"に置き換えることで、予約文字'を無効化する
JDBCを利用している場合、PreparedStatementオブジェクトのプレースホルだ機能を利用すると、内部的にこのようなエスケープを実行してくれる
クロスサイトリクエストフォージェリ(CDRF:Cross-Site Request Forgeries)
サイト攻撃用のスクリプトを仕込んでおくことで、アクセスしてきたユーザに意図せぬ操作を強制させる攻撃
あるサービスに勝手に登録されてしまったり、掲示板やブログに勝手に書き込みされてしまったり、ショッピングサイトで自動的に物品を購入されてしまったりする可能性がある
対策
HTTP GET要求でランダムな文字列(トークン)を生成、入力フォームに隠しフィールドとして埋め込む
トークンとはリクエストが正しいページから送信されたものか確認する一種の証明書
HTTP POSTによるリクエスト処理時にアプリケーション側で保持しているトークンと、リクエスト情報として送信されるトークンとを比較し、一致していれば処理を行う
トークンがない、一致しないときは処理を中断
トークンはランダムに生成されるので類推ができないはず、結果フォーム以外からのデータ送信を防げる
このような手法をワンタイムトークン方式という
パストラバーサル
本来想定していたパスを遡って自由にファイルを読み書きされてしまう脆弱性のこと
対策
リクエスト情報として直接ファイルのパスを受けわたさないこと
どうしてもなときはホワイトリスト(操作を許可する対象のリスト)を作るなどして、ファイル名をチェックするようにする
Cookieクラスの設定パラメータ
(1)ドメインsetDomain)/パス(setPath)
クッキーが有効となるドメイン(インターネット上にあるコンピュータやネットワークを識別する名前)/パスを指定
(2)SSL接続(setSecure)
このパラメータがtrueの場合、暗号化通信の環境でのみクッキーを送信する
(3)HTTP経由(setHttpOnly)
このパラメータをtrueに設定することでJavaScriptからクッキーにアクセスできなくなる
HTTPクッキーともいう
デフォルトはfalse
セッションハイジャック
なんらかの方法でセッションIDを盗聴することでセッションそのものを乗っ取ること
個人情報を盗まれたりなりすましによる不正な操作などの被害に直結する可能性がある
セッション関連のパラメータに適切な値を設定しておくことが大切
ファイルアップロード攻撃
不正なファイルをアップロードすることで任意のスクリプトを実行可能にできてしまう攻撃
HTTP経由でアクセスできるフォルダにファイルをアップロードさせないことで、仮に不正なファイルがアップロードされたとしてもHTTP経由で実行されてしまうことは最低限防げる
ファイルのアップロード時にファイルの種類を制限する
入力値の検証
セキュリティ対策の最初の一歩
入力時に不正な値を最大限ふるいにかけておくことで問題があった場合にもその被害を食い止められる
多重制御がセキュリティ対策の基本
検証の対象は原則リクエスト情報の全て
独習Javaサーバサイド編第2版 第9章まとめ
外部ライブラリの利用方法
Javaは標準では提供されていない機能を、外部ライブラリを追加することで簡単に実現できる
.jarファイルとその配置先
たとえばJSTLなどは外部ファイルの一種
外部ライブラリを利用するには必要な.jarファイルをアプリケーションに配置しておく必要がある
.jarとはJavaARchiveの略でライブラリの動作に必要なファイルをまとめたアーカイブ(複数のファイルをひとつのファイルにまとめること、まとめたもの。通常圧縮処理を施す)である
.jarファイルの配置先はJSP&サーブレットの場合基本的に/WEB-INF/libである
クラスローダ
クラスを管理するための基本的なエンジン
すべてのJavaアプリケーションはクラスを使用する際必ずクラスローダを介してクラスを利用する
複数のアプリケーション間でバージョンの異なる同名のクラスが必要になった場合(バージョン間で上位/下位の互換性はない場合)に対応するためTomcatのようなJSP&サーブレットコンテナでは、クラスライブラリの独立性を高めるため複数のクラスローダに階層構造をもたせている
より上位のクラスローダが優先的にクラスを呼び出す
電子メールを送信する
CommonsEmailはJavaアプリケーションから電子メールを送信するためのライブラリ
利用にはCommonsEmail本体とCommonsEmailの実行時に必要なJavaEmailをインストールしておくこと
.jarファイルを導入した後は必ずアプリケーションを再起動する必要がある
Apache Commonsプロジェクト
CommonsはTomcatやStrutsなどを輩出したことでも有名なApacheのトッププロジェクトで主にサーバサイドで利用することを目的とした拡張クラスライブラリを開発/提供している
アプリケーションにAjax機能を組み込むーDWR
Ajax技術とはブラウザ上でデスクトップアプリケーションのようなリッチな表現を可能にする技術
AjaxとはJavaScriptを利用してサーバ側と非同期通信を行い、受け取った結果をDOM(DocumentObjectModel)などの技術をつかってページに反映する仕組みのこと
従来、ユーザはサーバ処理を要求するたびにその応答を待つ必要があった(同期通信)
Ajax技術でエンドユーザはサーバ処理の間も手元の操作を継続できる(非同期通信)
また、ページ全体ではなく、実際に変更されたページの断片だけを部分的に更新するので画面のちらつきも最小限におさえられる
問題点もいくつかあり、そのためにDWRが用いられる(JavaScliptのコーディングを最小限におさえるライブラリ)
JSP&サーブレットアプリケーションとの親和性が高く、標準的なJavaBeansをAjax/非Ajaxの双方でほぼそのまま再利用できる
DWRライブラリの機能
クライアント/サーバ間の橋渡しをするためのブリッジ機能を提供するライブラリ
クライアントサイドスクリプトから、サーバサイドのJavaBeansクラスを透過的(クライアント/サーバ間で互いの通信を意識する必要がない)に呼び出せる
プロキシクラスとはDWRによって動的に生成されるJavaBeansアクセス用のJavaScriptクラスのこと
クライアント/サーバ間の通信をアプリケーションの代わりに受け持つ
PDF帳票を生成するーiText
PDF(Portable Document Format)は、無償のクライアントアプリケーションであるAdobe Readerで参照可能なドキュメント形式
改ざん防止やコピー、印刷の禁止などのセキュリティ設定が充実している、オリジナルのレイアウトを正確に再現できるといった特性から文書閲覧フォーマットのデファクトスタンダードとして急速に普及したPDFをJSP&サーブレットアプリケーションで生成するライブラリがiTextである(オープンソース)
iTextライブラリを利用するにはiText本体と、実行時に必要になるBouncyCastleライブラリが必要(セキュリティ機能を利用する場合)