4.9K Views
December 15, 18
スライド概要
PHPカンファレンス2018 講演資料
安全なWebアプリケーションの作り方2018 EG セキュアソリューションズ株式会社 徳丸 浩
アジェンダ • 最近のウェブセキュリティを取り巻く話題 • OWASP Top 10 – 2017を巡る話題 – XXEとSSRF – 安全でないデシリアライゼーション • 割賦販売法改正・施行 • 安全なWebアプリケーションの作り方 改訂 – PDFのFormCalcによるコンテンツハイジャック 2
徳丸浩の自己紹介 • 経歴 – 1985年 京セラ株式会社入社 – 1995年 京セラコミュニケーションシステム株式会社(KCCS)に出向・転籍 – 2008年 KCCS退職、HASHコンサルティング株式会社(現社名:EGセキュアソリューショ ンズ株式会社)設立 • 経験したこと – 京セラ入社当時はCAD、計算幾何学、数値シミュレーションなどを担当 – その後、企業向けパッケージソフトの企画・開発・事業化を担当 – 1999年から、携帯電話向けインフラ、プラットフォームの企画・開発を担当 Webアプリケーションのセキュリティ問題に直面、研究、社内展開、寄稿などを開始 – 2004年にKCCS社内ベンチャーとしてWebアプリケーションセキュリティ事業を立上げ • 現在 – EGセキュアソリューションズ株式会社 代表 https://www.eg-secure.co.jp/ – 独立行政法人情報処理推進機構 非常勤研究員 https://www.ipa.go.jp/security/ – 著書「体系的に学ぶ 安全なWebアプリケーションの作り方」(2011年3月) 同 第2版が 2018年6月21日発売 「徳丸浩のWebセキュリティ教室 」(2015年10月) – 技術士(情報工学部門) 3
OWASP Top 10 – 2017を巡る話題 4
5
OWASP Top 10 – 2017 の内容 項番 内容 A1 インジェクション A2 A3 A4 A5 A6 認証の不備 機微な情報の露出 XML外部エンティティ参照(XXE) アクセス制御の不備 不適切なセキュリティ設定 A7 クロスサイトスクリプティング(XSS) A8 安全でないデシリアライゼーション A9 既知の脆弱性のあるコンポーネントの使用 A10 不十分なロギングとモニタリング New 6
XML外部実体参照(XXE) 7
外部実体参照とは
XMLの実体(entity)はXMLの文書型定義中で以下のように宣言する。
宣言した実体は、XML文書内で、&greeting; &external-file;という形
(実体参照)で参照できる。
<?xml version="1.0" encoding="utf8"?>
<!DOCTYPE foo [
<!ENTITY greeting "こんにちは">
<!ENTITY externalfile SYSTEM "external.txt">
]>
<foo>
<hello>&greeting;</hello>
<ext>&externalfile;</ext>
</foo>
<foo>
<hello>こんにちは</hello>
<ext>Hello World</ext>
</foo>
8
こんなプログラムが脆弱 <?php $doc = new DOMDocument(); XMLを外部から受け取り解析している $doc->load($_FILES['user']['tmp_name']); $name = $doc->getElementsByTagName('name')->item(0)->textContent; $addr = $doc->getElementsByTagName('address')->item(0)->textContent; ?><body> 以下の内容で登録しました<br> 氏名: <?php echo htmlspecialchars($name); ?><br> 住所: <?php echo htmlspecialchars($addr); ?><br> </body> 9
攻撃手法と影響 スクリプト:http://example.jp/4e/4e-020.html 正常なXMLファイルをアップロードしてみる <?xml version="1.0" encoding="utf8"?> <user> <name>安全太郎</name> <address>東京都港区</address> </user> 10
外部実体参照によるファイルアクセス
URL:http://example.jp/4e/4e-020.html
/etc /hostsを外部参照で指定したXMLファイルをアップロードしてみる。
<?xml version="1.0" encoding="utf8"?>
<!DOCTYPE foo [
<!ENTITY hosts SYSTEM "/etc/hosts">
]>
<user>
<name>安全太郎</name>
<address>&hosts;</address>
</user>
11
SSRF(Server side request foregery)攻撃 公開サーバー 203.0.113.2 内部のサーバー 192.168.0.5 SSRF アクセス 直接アクセス不可 12
EC2インスタンスからクレデンシャル取得
$ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/testrole
{
"Code" : "Success",
"LastUpdated" : "2018-12-14T04:18:31Z",
"Type" : "AWS-HMAC",
"AccessKeyId" : "ASIAR6MQXXXXXXXXXXXX",
"SecretAccessKey" : "fksJ2MS/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"Token" :
"FQoGZXIvYXdzEL7//////////wEaDMvvWcaPXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXX=",
"Expiration" : "2018-12-14T10:54:27Z"
}
DEMO:XXEによるSSRF攻撃でやってみよう
13
SSRF攻撃用のXML
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE foo [
<!ENTITY credential SYSTEM "http://169.254.1
69.254/latest/meta-data/iam/security-credent
ials/test-role">
]>
<user>
<name>徳丸浩</name>
<address>&credential;</address>
</user>
14
実行結果 15
脆弱性が生まれる原因と対策 原因 XMLの外部実体参照を使うと、XML中に外部のファイルを流し 込むことができることはXMLがもともと持つ機能。従って、 XXEはXMLの機能を悪用するものであり、プログラムにコー ディング上のバグがあるというものではない。 共通対策 • XMLの代わりにJSONを用いる 外部から与えられる信頼できないXMLを解析しないことが重要。 外部とのデータ交換にはXMLではなくJSONを使用する事で脆 弱性が発生しないようにできる。ただし、SOAPのようにプロ トコルでXMLを使用している場合はこの対策は使えない。 16
XXE脆弱性の対策 • libxml2のバージョン2.9以降を用いる libxml2のバージョン2.9以降はデフォルトで外部実体参照を停止する設定 になっているため、XXEに対して脆弱ではない。 ただし、PHP側で外部実体参照を許可する設定にしている場合は例外。 $doc = new DOMDocument(); // ↓ 外部実体参照を許可…XXE脆弱 $doc->substituteEntities = true; $doc->load($_FILES['user']['tmp_name']); ※PHP側で外部実体参照を許可する脆弱な例 • libxml_disable_entity_loader(true)を呼び出す PHPバージョン5.2.11以降にはlibxml_disable_entity_loaderという関数 が用意されており、下記のように呼び出す事で、libxml2やPHP側の処理内 容にかかわらず、外部実体参照を禁止できる。 libxml_disable_entity_loader(true); // 外部実体読込み禁止 17
安全でないデシリアライゼーション(CWE-502)とは • クッキー等からシリアライズデータを送り込み、任意のオブ ジェクトをメモリ内に生成 • オブジェクトが破棄されるタイミングでデストラクタが実行 される • オブジェクトを巧妙に組み合わせることにより、攻撃を実行 18
安全でないデシリアライゼーションによる任意コード実行 Foo Bar class Foo { private $func; public function __destruct() { call_user_func($this->func); } } class Bar { private $func; private $args; public function exec() { call_user_func_array($this->func, $this->args); } } 19
安全でないデシリアライゼーションによる任意コード実行
:Foo
func:
:配列
0:
1: 'exec'
class Foo {
private $func;
public function __destruct() {
call_user_func($this->func);
}
}
:Bar
func = 'system'
args = ['whoami']
class Bar {
private $func;
private $args;
public function exec() {
call_user_func_array(
$this->func, $this->args);
}
}
1.
2.
3.
4.
Fooオブジェクトのデストラクタが呼ばれる
call_user_func($this->func) が呼ばれる
Barオブジェクトのexecメソッドが呼ばれる
Barオブジェクトのexecメソッド内で、call_user_func_array('system', ['whoami']) が呼
ばれる
5. system('whoami') が呼ばれる
20
Welcart 1.9.3 のオブジェクトインジェク ション脆弱性 21
Welcart 1.9.4 をリリースしました【脆弱性の修正】 Welcart 1.9.4 をリリースしました。オブジェクトインジェクション 脆弱性の修正などを行いました。詳細は以下の通りです。 アップグレードを行う場合は、Welcartを停止してからアップグレー ドを行ってください。 【変更点】 • オブジェクトインジェクション脆弱性の修正 フロントにて、オブジェクトインジェクションと思われる脆弱性 が認められました。 過去のすべてのバージョンが対象となります。1.9.4にアップグ レードしてください。 放置しますと、サイトに任意のファイルの埋め込まれる可能性が あります。 脆弱性に関する修正の差分はこちら https://www.welcart.com/community/archives/83947より引用 22
Welcartフォーラムよりインシデント報告 https://www.welcart.com/community/forums/forum/バグ報告 より引用 23
Welcart 1.9.3 と 1.9.4の差分 典型的な オブジェクトインジェクション脆弱性 https://plugins.trac.wordpress.org/changeset?sfp_email=&sfph_mail=&reponame=&new=1728429% 40usc-e-shop&old=1728428%40usc-e-shop&sfp_email=&sfph_mail= より引用 24
攻撃に利用できるクラス: All-in-one Event Calendar より class Ai1ec_Shutdown_Controller { protected $_preserve; protected $_restorables; protected $_callbacks; public function __destruct() { // replace globals from our internal store $restore = array(); foreach ( $this->_preserve as $name => $class ) { // 略 } // execute callbacks foreach ( $this->_callbacks as $callback ) { call_user_func( $callback ); } // 後略 攻撃に利用可能 } // 後略 } 25
攻撃に利用できるクラス: ManageWP Worker より
class MWP_WordPress_HookProxy
{
private $callback;
private $args;
// 省略
public function hook()
{
call_user_func_array($this->callback, $this->args);
}
}
攻撃に利用可能
Demo
26
安全でないデシリアライゼーションの対策 • シリアライズ形式ではなくJSON 形式によりデータ を受け渡す • クッキーやhidden パラメータではなくセッション 変数など書き換えできない形でシリアライズ形式の データを受け渡す • HMACなどの改ざん検知の仕組みを導入してデータ が改ざんされていないことを確認する 27
デモ • WordPress + Welcart + All-in-one Event Calendar + ManageWP Worker (WordPressプラグイン)の環境 • Welcart の 安全でないデシリアライゼーションを用いてリ モートコード実行 • WebShell設置 • 上記をNetBeas上でトレースします 28
割賦販売法改正とクレジットカード情報 「非保持」についての動向 29
改正割賦販売法 第三十五条の十六 クレジットカード番号等取扱業者 (次の各号のいずれかに該当する者をいう。以下同 じ。)は、経済産業省令で定める基準に従い、その取 り扱うクレジットカード番号等(包括信用購入あつせ ん業者又は二月払購入あつせんを業とする者(以下 「クレジットカード等購入あつせん業者」という。) が、その業務上利用者に付与する第二条第三項第一号 の番号、記号その他の符号をいう。以下同じ。)の漏 えい、滅失又は毀損の防止その他のクレジットカード 番号等の適切な管理のために必要な措置を講じなけれ ばならない。 ※ 2018年6月1日施行 http://elaws.e-gov.go.jp/search/elawsSearch/elaws_search/lsg0500/detail? lawId=336AC0000000159 より引用 30
経産省:クレジットカード取引におけるセキュリティ対策の強化に向けた実行計画2018(「実行計画 2018」)を取りまとめました~国際水準のクレジットカード決済環境の整備を進めます~ 前略 クレジット取引セキュリティ協議会の「実行計画」は、割賦販売法 に規定するセキュリティ対策の実務上の指針と位置付けられており、 「実行計画」に掲げる措置又はそれと同等以上の措置を講じている 場合には、セキュリティ対策に係る法的基準を満たしていると認め られます。したがって、クレジット取引関連事業者は、「実行計 画」を指針とした取組を着実に進めていく必要があります。 2.「実行計画2018」の主な改訂事項 (1)クレジットカード情報の適切な保護について • カード情報の非保持化又は同等/相当を推進します。 – 通販(メールオーダー・テレフォンオーダー)加盟店における 非保持化又は同等/相当の具体的方策をとりまとめました。 – 対面加盟店における非保持化同等/相当の追加的方策をとりま とめました。 http://www.meti.go.jp/press/2017/03/20180301005/20180301005.html より引用 31
加盟店におけるカード情報の非保持化の推進について 本協議会は、加盟店におけるカード情報保護のための第 一の対策として非保持化を基本とした取組を推進する。 非保持化はPCI DSS準拠とイコールではないものの、 カード情報保護という観点では同等の効果があるものと認 められるため、実行計画においては、PCI DSS準拠に並ぶ 措置として整理する。 略 特に、EC加盟店の中には、自社サイトにカード情報を 含む決済情報等のログが蓄積される等のシステム的課題を 認知できていないケースもあることから、これら加盟店に 対する注意喚起を行い、さらに、カード情報を保持しない システム(カード情報非通過型)への移行を強く推奨して いくものである。 https://www.j-credit.or.jp/security/pdf/plan_2018.pdf より引用 32
https://www.j-credit.or.jp/security/pdf/plan_2018.pdf より引用 33
https://www.j-credit.or.jp/security/pdf/plan_2018.pdf より引用 34
伊織ネットショップからのカード情報漏えい事件 35
今治タオルの伊織、延べ2145人分のクレカ情報流出 今治タオルの販売を手掛ける伊織は、同社の通販サイト「伊織ネット ショップ」が不正アクセスを受けたと2018年10月24日に発表した。延べ 2145人分のクレジットカード情報が流出した可能性がある。クレジット カード決済時に偽の入力画面を表示するよう、第三者が同サイトを改ざん した。 18年5月8日~8月22日の期間に伊織ネットショップで商品を注文した顧客の クレジットカード情報が流出し、不正利用された可能性がある。同社は 8月 22日夕方に改ざんを確認し、クレジットカード決済機能を停止した。アク セスログを調査したところ、8月19日午後に第三者による侵入と一部ページ の改ざんがあった。 改ざんされたファイルに残された日付が5月8日であったことから、同日以 降にクレジットカードを利用した顧客について流出の可能性があると判断 した。クレジットカード番号のほか、会員名、有効期限、セキュリティー コードも流出した恐れがある。同社は第三者機関の調査結果を踏まえて発 表に至った。 https://www.nikkei.com/article/DGXMZO36954590W8A021C1000000/ より引用 36
https://www.i-ori.jp/wordpress/iori-press-release/20181024-1-37812.html より引用 37
https://www.i-ori.jp/wordpress/iori-press-release/20181024-1-37812.html より引用 38
Demo: 安全でないデシリアライゼー ションにより偽決済画面を作る ※ 伊織の事件とは侵入手口は異なります 39
【教訓】 カード情報をサーバーに保存し ていなくても、脆弱性があれば カード情報は盗まれる 40
安全なWebアプリケーションの作り方 改訂 41
主な改定内容(増えたもの) • • • • CORS クリックジャッキング ファイルアップロード(PDFのFormCalc) 構造化データの読み込みにまつわる問題 – 安全でないデシリアライゼーション、XXE • • • • • キャッシュからの情報漏えい Web APIにまつわる問題 JavaScriptの問題 脆弱性診断入門 OWASP Top 10 -2017 完全ほぼ対応 42
徳丸本の読み方 1章はざっと 2章で実習環境のセットアップ 3章はできればちゃんと手を動かして進める 4章は4.1節と4.2節を読んだ後4.3節から後は最初の 1ページくらいをざっと読む – その後、必要な節を手を動かしながら読んでいく 5章は読み物的にざっと読んでから、当該機能を実装 する際に詳しく読み返す 6章は読み物的によんでいただければ… 7章はぜひ手を動かして診断体験をしてみて下さい 8章と9章は読み物的に… 43
PDFのFormCalcによるコンテンツハイジャック 44
PDFのFormCalcによるコンテンツハイジャックの概要 • PDFドキュメントにFormCalcというスクリプトを埋 め込むことができる • Adobe Acrobat Readerに実装されたFormCalcには URL関数という機能があり、HTTPリクエストを呼び 出し、結果を受け取ることができる • FormCalcのURL関数を用いた仕掛けを組み込んだ PDFファイルをアップロードすることにより、正規 ユーザに成りすましを行う攻撃手法が考案されてい る • 主な攻撃対象はIEユーザ 45
FormCalcを組み込んだ罠を設置 攻撃対象サイト example.jp 罠を設置 罠サイト trap.example.com アップロード FormCalcを組み 込んだPDFファイル 罠ページ HTML+JavaScript PDF (FormCalc) 46
FormCalcを組み込んだ罠の閲覧(攻撃) 攻撃対象サイト example.jp 秘密情報 ログイン画面 罠サイト trap.example.com GET /31/31-022.php HTTP/1.1 Accept: */* User-Agent: Mozilla/3.0 (compatible; Spider 1.0; Windows) Cookie: PHPSESSID=4aage527dbubc9d088ekf68rj0 Host: example.jp ① クッキーつきリクエスト ② 秘密情報 罠ページ HTML+JavaScript ⓪ 元々example.jpに ログインしている ③ 秘密情報が罠ページに渡る PDF (FormCalc) 47
FormCalc コンテンツハイジャック攻撃の様子 48
FormCalcの問題は「アプリケーションの脆弱性」なのか? • 「脆弱なサンプル」に狭義のバグはない • Adobe Readerの「セキュリティ上好ましくない仕 様」が原因と考えられる • したがって、Adobe Readerの仕様が見なされるべ きものだが… • 現実に攻撃ができる以上、アプリ側でもなんらかの 対処が求められる – PDFのアップロードを禁止する – IE(等攻撃が成功するブラウザ)を禁止する – Acrobat Reader Pluginを無効化するようユーザーに要請 する – アプリ側でなんとか頑張る 49
FormCalcによるコンテンツハイジャックの対策 • 以下の両方を実施 – PDF ファイルはブラウザ内で開かずダウンロードを強制 する – PDF をobject要素やembed要素では開けない仕組みを実 装する • 後者を実現するにはどうすればいい? – 複数の方法が考えられるが… – サンドボックス・ドメインを用いる方法 – 例えばPOSTリクエストに限定する方法がある • POSTは嫌ですか?…実は僕も嫌なんですが… – 凝った方法を採用してももちろん良いが、Adobe Reader のイケテナイ仕様への対処に手間をかけても… 50
一方、画像によるXSSは記述を削除 • IE7以前では、Content-Typeが正しくても、マジッ クバイトがContent-Typeとマッチしていないと HTMLとして認識される「仕様」だった https://blog.tokumaru.org/2007/12/image-xss-summary.html • IE8以降は、X-Content-Type-Options: nosniff で対処 可能 • さすがにIE7はもういいだろう、と削除を決断 *2:MS07-057を適用していないとHTMLと解釈される 51
JSONPのコールバック関数名によるXSS(Web APIの例) <?php $callback = $_GET['callback']; // クエリ文字列からコールバック関数名を得る $json = json_encode(array('time' => date('G:i'))); echo "$callback($json);"; // コールバック関数の形でそのまま出力 callback=<script>alert(1)</script> 52
JSONPのコールバック関数名によるXSS の原因と対策 • 原因 – JSONPのMIMEタイプはtext/javascript (application/javascript)なのに、 text/htmlとしている – コールバック関数名の文字種チェックをしていない • 対策 – MIMEタイプをtext/javascriptとする Content-Type: text/javascript; charset=UTF-8 – コールバック関数名の文字種を英数字とアンダースコア に限定する 53
Dom Based XSS (JavaScriptの問題の例)
脆弱な例: フラグメント識別子を表示するだけのスクリプト
<body>
<script>
window.addEventListener("hashchange", chghash, false);
window.addEventListener("load", chghash, false);
function chghash() {
var hash = decodeURIComponent(window.location.hash.slice(1));
var color = document.getElementById("color");
color.innerHTML = hash;
}
</script>
<a href="#赤">赤</a>
<a href="#緑">緑</a>
<a href="#青">青</a>
<p id="color"></p>
</body>
54
DOM Based XSSの攻撃例 • Script要素による攻撃は有効にならない <script>alert(1)</script> など • img 要素のonerror属性などは攻撃に使える <img src=# onerror=alert(1)> • 上記を含むHTMLをinnerHTMLに挿入すると、JavaScriptが実 行される • document.writeであれば、script要素でも攻撃可能 55
対策: Dom Based XSS • • • • 『DOM Based XSS』に関するレポート に詳しい document.writeやinnerHTMLの使用を避ける DOM操作APIを用いる or 適切なエスケープ処理 jQueryを用いる場合は html()メソッドではなく、text()メソッドを用いる function chghash() { var hash = window.location.hash; var color = document.getElementById("color"); // 脆弱 // color.innerHTML = // decodeURIComponent(window.location.hash.slice(1)); // 対策 color.textContent = decodeURIComponent(window.location.hash.slice(1)); } 56
One more thing… 60
徳丸試験について 61
ウェブ・セキュリティ試験(通称:徳丸試験)を2019年12月より開始 一般社団法人BOSS-CON JAPAN(代表理事:吉政忠志、所在:東京都世田 谷区、以下「BOSS-CON JAPAN」)は、BOSS-CON JAPAN内組織である PHP技術者認定機構が国内Webセキュリティ第一人者である徳丸浩氏が代 表を務めるEGセキュアソリューションズ株式会社の支援を受け、ウェブ・ セキュリティ試験(通称:徳丸試験)を2019年12月より開始することを発 表いたしました。なお、本試験問題はEGセキュアソリューションズ株式会 社が作成いたします。 ■ウェブ・セキュリティ試験実施の背景 全世界で稼働しているWebサイトは5億サイトになりました。企業にとって も重要な位置づけになるため、サイバー攻撃の対象となるケースも増え、 攻撃手法も複雑かつ巧妙になってきています。よってウェブ・セキュリ ティに対する対策は以前よりまして緊密且つ迅速に施さなければなりませ ん。ユーザ、開発者に対してより一層のウェブ・セキュリティに対する意 識と知見を高めるべく、本試験を実施いたします。本試験の主教材はウェ ブ・セキュリティの名著として知られる徳丸浩氏による「体系的に学ぶ 安 全なWebアプリケーションの作り方 第2版」を採用し、本書を基本的な出題 範囲として基礎的な知見を問う試験と実務知識を問う試験を実施いたしま す。 https://www.phpexam.jp/news/tokumarushiken/ より引用 62
ウェブ・セキュリティ試験概要 試験名称:ウェブ・セキュリティ試験(仮称) 通称名:徳丸試験 試験グレード: ・ウェブ・セキュリティ基礎試験(2019年12月) ・ウェブ・セキュリティ実務知識試験(実施時期未定) 試験開始:2019年12月 運営団体:一般社団法人BOSS-CON JAPAN PHP技術者認定機構 受験料金:1万円(外税) ※学生および教職員は50%オフでの受験が可能になります。 試験センター:全国のオデッセイコミュニケーションズCBTテストセンター 設問数40問 合格:70%正解 主教材:「体系的に学ぶ 安全なWebアプリケーションの作り方 第2版」 (SBクリエイティブ) https://www.phpexam.jp/news/tokumarushiken/ より引用 63
まとめ • 最近のウェブセキュリティを取り巻く話題 • OWASP Top 10 – 2017や徳丸本改版を巡る話題 – PDFのFormCalcによるコンテンツハイジャック – XXEとSSRF – 安全でないデシリアライゼーション • 割賦販売法改正・施行 • 安全なWebアプリケーションの作り方 第2版を読もう • そして、「徳丸試験」を受けて理解度を確認しよう 64