[PS11]ネットワーク第6回
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

[PS11]ネットワーク第6回

on

  • 565 views

HTTPとセッション管理

HTTPとセッション管理

Statistics

Views

Total Views
565
Views on SlideShare
565
Embed Views
0

Actions

Likes
0
Downloads
0
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

[PS11]ネットワーク第6回 Presentation Transcript

  • 1. Webセキュリティの基礎
  • 2. Herokuプロジェクトを使用してセッ ション管理の仕組みを実践
  • 3.  index.jspのbodyタグの中を以下に書き換える <form action="/confirm" method="POST"> 氏名<input type="text" name="name"><br> メールアドレス<input type="text" name="mail"><br> 性別<input type="radio" name="gender" value="女">女 <input type="radio" name="gender" value="男">男<br> <input type="submit" name="submit" value="送信"> </form>
  • 4.  index.jspと同じ階層に『confirm.jsp』を新規ファイルで作成し、 以下の内容を記述 <%@ page contentType="text/html;charset=UTF-8" %> <html> <head> <title>確認</title> </head> <body> <form action="/ok" method="post"> 氏名:<%=request.getParameter("name")%><br> メールアドレス:<%=request.getParameter("mail")%><br> 性別:<%=request.getParameter("gender")%><br> <input type="hidden" name="name" value="<%=request.getParameter("name")%>"> <input type="hidden" name="mail" value="<%=request.getParameter("mail")%>"> <input type="hidden" name="gender" value="<%=request.getParameter("gender")%>"> <input type="submit" value="登録"> </form> </body> </html>
  • 5.  index.jspと同じ階層に『ok.jsp』を新規ファイルで作 成し、以下の内容を記述 <%@ page contentType="text/html;charset=UTF-8" %> <html> <head> <title>登録完了</title> </head> <body> 氏名:<%=request.getParameter("name")%><br> メールアドレス: <%=request.getParameter("mail")%><br> 性別:<%=request.getParameter("gender")%><br> 登録されました。 </body> </html>
  • 6.  『src/com.example』パッケージの中に『ConfirmServlet.java』を新規作成し、 以下を記述する public class ConfirmServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.getRequestDispatcher("/confirm.jsp").forward(req, resp); } }
  • 7.  『src/com.example』パッケージの中に『OKServlet.java』を新規作成し、以下 を記述する public class OKServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.getRequestDispatcher("/ok.jsp").forward(req, resp); } }
  • 8.  web.xmlにマッピングを追加(<web-app>タグの中に記述) <servlet> <servlet-name>confirm</servlet-name> <servlet-class>com.example.ConfirmServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>confirm</servlet-name> <url-pattern>/confirm</url-pattern> </servlet-mapping> <servlet> <servlet-name>ok</servlet-name> <servlet-class>com.example.OKServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ok</servlet-name> <url-pattern>/ok</url-pattern> </servlet-mapping>
  • 9.  http://localhost:8080/ にアクセス し、項目を入力してボタンをク リック
  • 10. ステータスライン レスポンスヘッダ ヘッダ名 : ヘッダ値 ・ ・ 空行(CRLF) レスポンスボディ(HTMLなど)
  • 11. HTTP/1.1 200 OK Server: Jetty(7.6.0.v20120127) Connection: keep-alive Content-Length: 692 Content-type:text/plain
  • 12. 番号 意味 200 OK(成功) 302 Found (リダイレクト) 304 Not Modified (キャッシュを参照) 400 Bad Request (Clientからのリクエスト不備) 403 Forbidden (アクセス禁止) 404 Not Found (ページが存在しない) 500 Internal Server Error (サーバエラー) 503 Service Unavailable (サーバが過負荷状態)
  • 13.  Content-Length  ボディのバイト数  Content-Type  MIMEタイプというリソースの種類を 指定  セミコロン(;)を付けてcharset=UTF-8と 記述すれば、UTF-8という文字エン コーディングであることを示す MIMEタイプ 意味 text/plain テキスト text/html HTML文書 application/xml XML文書 text/css CSS文書 image/gif GIF画像 image/jpeg JPEG画像 image/png PNG画像 application/json JSON(Javascript Object Notation)
  • 14. リクエストライン(メソッド URI プロトコル) リクエストヘッダ ヘッダ名 : ヘッダ値 ・ ・ 空行(CRLF) メッセージボディ(POSTの場合はここにクエリが入る)
  • 15.  http://httpserverex.herokuapp.co m/ (各個人のHerokuアプリケー ションのURL)にアクセスするテ キストボックスに日本語で入力 して送信ボタンを押す
  • 16. POST /hello HTTP/1.1 Host: httpserverex.herokuapp.com Connection: keep-alive Content-Length: 77 Content-Type: application/x-www-form-urlencoded Referer: http://httpserverex.herokuapp.com/Cookie: JSESSIONID=1ut4gy3t4kqu1mncf3ykldj5a メッセージボディ input=%E3%81%82%E3%81%84%E3%81%88%E3%81%86%E3%81%8A&submit=% E9%80%81%E4%BF%A1
  • 17.  Content-Length  ボディのバイト数  Content-Type  送信する値のMIMEタイプ特にformで 指定がなければ『application/x-wwwform-urlencoded』になる  名前=値を『&』でつないだデータ形 式
  • 18.  特殊記号や日本語などURLに使 用できない文字をURL上に記述 する場合に用いる  対象の文字をバイト単位で 『%xx』という形式で表す。(xx は16進数※UTF8の場合)  URL エンコード/デコードフォー ム  http://home.kendomo.net/board/decode / ※半角スペースは『%20』になる が、Content-Typeが『application/xwww-form-urlencoded』の場合 は、特別扱いして『+(半角)』にな る
  • 19.  リンク元のURLを示すヘッダ Refererヘッダはセキュリティの 役に立つこともあれば、問題に なることもある  メリット:Refererヘッダは、ア プリケーションが意図した遷移 を経ていることを確認すること ができるが、アクセスしている 本人によってツールやブラウザ のプラグインで改変、削除され ることもある  デメリット:URLに秘密情報を 含んでいる場合は、セキュリ ティ上問題になる
  • 20.  RFC2616より  GETメソッドは参照(リソースの取得) のみに用いる  GETメソッドは副作用がないことが期 待される  秘密情報の送信にはPOSTメソッドを用 いること
  • 21.  リソース(コンテンツ)の取得以 外のこと →サーバ側でのデータの追加・更 新・削除が起きる作用のこと  典型的な例:物品の購入、利用 者の登録・削除などの処理  更新系の画面ではPOSTメソッド を使わなければならない
  • 22.  GETメソッドは、URLにクエリー の文字列の形でパラメータを渡 すが、ブラウザやサーバが処理 出来るURLの長さには上限があ る。  データ量が多い場合は、POSTメ ソッドを使う方が安全
  • 23.  GETメソッドの場合は、以下の 可能性があるため  URL上に指定されたパラメータが Referer経由で外部に漏洩する  URL上に指定されたパラメータがアク セスログに残る
  • 24.  以下が1つでも当てはまる場合 にPOSTメソッドを使うべき  データ更新など副作用に伴うリクエス トの場合  秘密情報を送信する場合  送信するデータの総量が多い場合
  • 25.  先ほど作った入力フォームの確 認ボタンをクリックした後に、 ブラウザバックで戻って、ソー スを確認する  Chromeの場合は、HTMLの中の 要素を変更出来るので、hidden 項目のvalueを変更して、ボタン をクリックすると、次画面で入 力された値と変更されているこ とがわかる
  • 26.  HTTPは、クライアントの現在の 状態を覚えておく設計になって いる  この性質をHTTPのステートレス 性と言う  ラベル表示では、現在の状態を 覚えておくのが出来ないため、 通常はhiddenパラメータに値を 覚えさせておく
  • 27.  ブラウザのプラグインやプロキ シツールなどで本来変更があっ てはならない値が変更されてい た  このhiddenパラメータの処理す る部分に脆弱性がある  つまり、攻撃対象となる
  • 28. 客:登録したいんだけど 店員:氏名、メールアドレス、性別(男または女)をお願いします 客:氏名は山田太郎、メールアドレスはtarou@example.jp、性別は男です 店員:復唱します。氏名は山田太郎、メールアドレスはtarou@example.jp、 性別は男、確認お願いします。 客:氏名は山田花子、メールアドレスはhanako@example.com、性別は女で す。登録よろしくお願いします。 店員:氏名は山田花子、メールアドレスはhanako@example.com、 性別は女で登録しました。
  • 29.  利用者自身からは書き換えが可 能だが、情報漏えいや第三者か らの書き換えに対しては堅牢で ある  hiddenパラメータと比較する対 象には、クッキーやセッション 変数がある  クッキーやセッション変数の欠 点として、セッションIDの固定 攻撃に弱いことがあげられる  特に、ログイン前の状態でかつ 地域性型ドメインを使っている 場合には、クッキーモンスター 問題の影響により、セッション 変数の漏洩に対する効果的な対 策がない  利用者自身によって書き換えら れては困る認証や認可に関する 情報はセッション変数に保存す べきだが、それ以外はhiddenパ ラメータを使用する
  • 30.  ECサイトの『買い物カゴに入れ る』  アプリケーションの状態を覚え ておくことを『セッション管 理』と言う
  • 31.  セッション管理をHTTPで実現す る目的の仕組み  サーバ側からブラウザに対し て、『名前=変数』の組を覚え ておくように指示する
  • 32.  安全なWebアプリケーションの 作り方-脆弱性が生まれる原理と 対策の実践- 徳丸浩著