Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
純生 野田
2,227 views
MTで学ぶセキュアプログラミング@MT Tokyo
MT東京 8月 テーマセキュリティのセッション
Technology
◦
Read more
4
Save
Share
Embed
Embed presentation
Download
Download to read offline
1
/ 88
2
/ 88
3
/ 88
4
/ 88
5
/ 88
6
/ 88
7
/ 88
8
/ 88
9
/ 88
10
/ 88
11
/ 88
12
/ 88
13
/ 88
14
/ 88
15
/ 88
16
/ 88
17
/ 88
18
/ 88
19
/ 88
20
/ 88
21
/ 88
22
/ 88
23
/ 88
24
/ 88
25
/ 88
26
/ 88
27
/ 88
28
/ 88
29
/ 88
30
/ 88
31
/ 88
32
/ 88
33
/ 88
34
/ 88
35
/ 88
36
/ 88
37
/ 88
38
/ 88
39
/ 88
40
/ 88
41
/ 88
42
/ 88
43
/ 88
44
/ 88
45
/ 88
46
/ 88
47
/ 88
48
/ 88
49
/ 88
50
/ 88
51
/ 88
52
/ 88
53
/ 88
54
/ 88
55
/ 88
56
/ 88
57
/ 88
58
/ 88
59
/ 88
60
/ 88
61
/ 88
62
/ 88
63
/ 88
64
/ 88
65
/ 88
66
/ 88
67
/ 88
68
/ 88
69
/ 88
70
/ 88
71
/ 88
72
/ 88
73
/ 88
74
/ 88
75
/ 88
76
/ 88
77
/ 88
78
/ 88
79
/ 88
80
/ 88
81
/ 88
82
/ 88
83
/ 88
84
/ 88
85
/ 88
86
/ 88
87
/ 88
88
/ 88
More Related Content
PDF
MT meets PHP
by
純生 野田
PDF
MT meets PHP - PHP conference Kansai 2013
by
純生 野田
PDF
Inside Movable Type
by
純生 野田
PDF
やはりお前らのMTMLは間違っている!
by
純生 野田
PDF
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
by
leverages_event
PDF
WordPressと外部APIとの連携
by
Hidekazu Ishikawa
PDF
WordPressで提供するWeb API
by
Yuko Toriyama
PPT
Gen-Template-for-Perl
by
nasneg
MT meets PHP
by
純生 野田
MT meets PHP - PHP conference Kansai 2013
by
純生 野田
Inside Movable Type
by
純生 野田
やはりお前らのMTMLは間違っている!
by
純生 野田
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
by
leverages_event
WordPressと外部APIとの連携
by
Hidekazu Ishikawa
WordPressで提供するWeb API
by
Yuko Toriyama
Gen-Template-for-Perl
by
nasneg
What's hot
PDF
プロになるためのJavaScript入門読書会 レジュメ
by
Norito Agetsuma
PDF
WordBeach @kurudrive
by
Hidekazu Ishikawa
KEY
3ヶ月でリア充大学生がFBアプリをリリースするまで @macrocro
by
Yuuki Kuroda
PDF
jQuery Mobile 1.2 最新情報 & Tips
by
yoshikawa_t
PDF
jQuery Mobile 1.3 最新情報
by
yoshikawa_t
PDF
Jqm20120210
by
cmtomoda
PPTX
Alpine.jsハンズオン
by
AyakaNishiyama
ODP
Ci tutorial
by
Kazuaki Ueda
PDF
jQuery Mobile 最新情報 & Tips
by
yoshikawa_t
PDF
ロールオーバーのいろいろなやり方
by
silvers ofsilvers
PDF
behatで始めるBDD
by
Tsutomu Chikuba
PPTX
ブログメディアにおけるData APIの活用について
by
Hatsuhito UENO
PDF
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
by
codeal
PDF
MTDDC Meetup Tokyo 2011:もっとディープにMovable Type
by
Yujiro Araki
PDF
40分濃縮 PHP classの教室
by
Yusuke Ando
KEY
Mojoliciousをウェブ制作現場で使ってみてる
by
jamadam
PDF
Php apocalypse
by
Kiichi Kajiura
PDF
deviseを利用した認証について@Minamirb
by
Jun Fukaya
プロになるためのJavaScript入門読書会 レジュメ
by
Norito Agetsuma
WordBeach @kurudrive
by
Hidekazu Ishikawa
3ヶ月でリア充大学生がFBアプリをリリースするまで @macrocro
by
Yuuki Kuroda
jQuery Mobile 1.2 最新情報 & Tips
by
yoshikawa_t
jQuery Mobile 1.3 最新情報
by
yoshikawa_t
Jqm20120210
by
cmtomoda
Alpine.jsハンズオン
by
AyakaNishiyama
Ci tutorial
by
Kazuaki Ueda
jQuery Mobile 最新情報 & Tips
by
yoshikawa_t
ロールオーバーのいろいろなやり方
by
silvers ofsilvers
behatで始めるBDD
by
Tsutomu Chikuba
ブログメディアにおけるData APIの活用について
by
Hatsuhito UENO
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
by
codeal
MTDDC Meetup Tokyo 2011:もっとディープにMovable Type
by
Yujiro Araki
40分濃縮 PHP classの教室
by
Yusuke Ando
Mojoliciousをウェブ制作現場で使ってみてる
by
jamadam
Php apocalypse
by
Kiichi Kajiura
deviseを利用した認証について@Minamirb
by
Jun Fukaya
Similar to MTで学ぶセキュアプログラミング@MT Tokyo
PPTX
プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~
by
Takeuchi Yuichi
PDF
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
by
Hiroshi Tokumaru
PDF
20080521-Ruby-on-Rails-Security
by
Koji SHIMADA
PDF
Movable TypeのWebアプリケーションフレームワークの基本
by
Hajime Fujimoto
PDF
へろくしーの挫折
by
Yuichiro Ebihara
PDF
安全なWebアプリ構築1回
by
Project Samurai
PDF
Movable Type 6 Overview - New York Perl Mongers Tech Talk
by
Yuji Takayama
PPTX
Webサイトをめぐるセキュリティ状況と効果的な防御方法(WordPress編)
by
Hiroshi Tokumaru
プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~
by
Takeuchi Yuichi
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
by
Hiroshi Tokumaru
20080521-Ruby-on-Rails-Security
by
Koji SHIMADA
Movable TypeのWebアプリケーションフレームワークの基本
by
Hajime Fujimoto
へろくしーの挫折
by
Yuichiro Ebihara
安全なWebアプリ構築1回
by
Project Samurai
Movable Type 6 Overview - New York Perl Mongers Tech Talk
by
Yuji Takayama
Webサイトをめぐるセキュリティ状況と効果的な防御方法(WordPress編)
by
Hiroshi Tokumaru
More from 純生 野田
PDF
アクセシビリティで企業価値を高める、小さな会社の戦い方
by
純生 野田
PDF
PowerCMS X
by
純生 野田
PDF
次世代版 PowerCMS 開発プロジェクトのご紹介
by
純生 野田
PDF
PowerCMS Conference
by
純生 野田
PDF
PowerCMS X
by
純生 野田
PDF
アルファサード株式会社はなぜ アクセシビリティに取り組むのか
by
純生 野田
PDF
YAPC::Kansai 2017 - macOSネイティブアプリ作成におけるPerlの活用
by
純生 野田
PDF
About PowerCMS4.3
by
純生 野田
PDF
オーサリングツールとしてのCMSとWebアクセシビリティ
by
純生 野田
PDF
Color Testerはどうやって文字の色を拾っているのか?
by
純生 野田
PDF
The Next PowerCMS
by
純生 野田
PDF
The Next PowerCMS
by
純生 野田
PDF
ウェブアクセシビリティチェックツール開発者の頭ん中
by
純生 野田
PDF
PowerCMS 8341 のご紹介
by
純生 野田
PDF
Something Different for the Best Web Solution!
by
純生 野田
PDF
SEOの本質から考える PowerCMSを活用した 検索エンジン最適化
by
純生 野田
PDF
MTのダイナミック処理(PHP)を高速化する@サーバーサイドスクリプティング
by
純生 野田
PDF
Mt seminar hiroshima_public
by
純生 野田
PDF
Mac OSにおけるShellコマンドの活⽤用 (Xojo 勉強会)
by
純生 野田
PDF
Power cms3+azure
by
純生 野田
アクセシビリティで企業価値を高める、小さな会社の戦い方
by
純生 野田
PowerCMS X
by
純生 野田
次世代版 PowerCMS 開発プロジェクトのご紹介
by
純生 野田
PowerCMS Conference
by
純生 野田
PowerCMS X
by
純生 野田
アルファサード株式会社はなぜ アクセシビリティに取り組むのか
by
純生 野田
YAPC::Kansai 2017 - macOSネイティブアプリ作成におけるPerlの活用
by
純生 野田
About PowerCMS4.3
by
純生 野田
オーサリングツールとしてのCMSとWebアクセシビリティ
by
純生 野田
Color Testerはどうやって文字の色を拾っているのか?
by
純生 野田
The Next PowerCMS
by
純生 野田
The Next PowerCMS
by
純生 野田
ウェブアクセシビリティチェックツール開発者の頭ん中
by
純生 野田
PowerCMS 8341 のご紹介
by
純生 野田
Something Different for the Best Web Solution!
by
純生 野田
SEOの本質から考える PowerCMSを活用した 検索エンジン最適化
by
純生 野田
MTのダイナミック処理(PHP)を高速化する@サーバーサイドスクリプティング
by
純生 野田
Mt seminar hiroshima_public
by
純生 野田
Mac OSにおけるShellコマンドの活⽤用 (Xojo 勉強会)
by
純生 野田
Power cms3+azure
by
純生 野田
MTで学ぶセキュアプログラミング@MT Tokyo
1.
MTで学ぶセキュアプログラミング MT Tokyo 2014
August junnama@alfasado.jp
5.
何のために? •サイトの改ざんを防ぐために •クライアントのセキュリティ要件を 満たすために •被害リスクをできるだけ少なくする ために
6.
何のために、誰が? •セキュリティコンサルタントが •プログラマが •デザイナが
•ディレクターが
7.
何を? •MTMLテンプレートを •Movable Typeそのものを
•MTプラグインを •MTベースのウェブサイトを
8.
イントロダクション <Tweet禁⽌止>
9.
⼤大⼈人の事情につき削除
10.
本題 </Tweet禁⽌止>
11.
例例 : PHPを出⼒力力するテンプレート
12.
PHPを出⼒力力するテンプレート
14.
これは果たして脆弱性か?
15.
何をされたくないか •情報の漏漏洩(権限のない情報 へのアクセス) •権限昇格=権限を越えた操作 •情報の書き換え、削除
16.
性善説か? 性悪説か?
17.
攻撃するのは誰? •悪意の第三者による外部から のアタック •内部犯⾏行行(元社員、コミュニ ティユーザー) •内部(犯⾏行行ではないが)誘発=> 正規のユーザーに踏ませる
18.
そこまで許可した覚えはない。 いや、だって、できるんだ から。。。 Vs.
19.
この場合、どちらが悪いのか? はともかく、セキュリティ監査 では、アウト。 基本、性悪説に基づく。
20.
<MTEntryBody replace=”<?”,””>
21.
完璧に防げるか? (程度度問題→やらないより、まし)
22.
AllowPHPScript 0 PowerCMS(DynamicMTMLでは)...
23.
<MTStripPHP> <MTEntryBody> </MTStripPHP> PowerCMS(DynamicMTMLでは)...
24.
function strip_php( $source
) {! $tokens = token_get_all( $source );! $res = '';! $inphp = FALSE;! foreach ( $tokens as $token ) {! if ( is_string( $token ) ) {! $token = array( '', $token );! }! list( $id, $str ) = $token;! if (! $inphp ) {! if ( $id === T_OPEN_TAG or $id == T_OPEN $inphp = TRUE;! } else {! $res .= $str;! }! 厳密には、PHPはPHPで評価する
25.
<MTEntryBody replace=”<?”,””> でも、やらないより遥かにまし
26.
主なもの •XSS = Cross
Site Scripting •CSRF = Cross site request forgeries •SQL (OS Command) Injection •Directory traversal
27.
例例 : 検索索結果テンプレート
28.
例例 : 検索索結果テンプレート
29.
例例 : 検索索結果テンプレート
30.
例例 : 検索索結果テンプレート
31.
例例 : 検索索結果テンプレート sub
load_core_tags {! require MT::Template::Context;! return {! function => {! SearchString => &_hdlr_search_string,! ...! ! sub _hdlr_search_string! { $_[0]->stash('search_string') || '' } package MT::Template::Context::Search;!
32.
例例 : 検索索結果テンプレート sub
prepare_context {! my $app = shift;! my $q = $app->param;! ...! if ( my $str = $app->{search_string} ) {! $ctx->stash(! 'search_string', encode_html($str) );! } package MT::App::Search;! コード中でエスケープしてる
33.
あまり宜しくない!(きっぱり)
34.
例例 : 検索索結果テンプレート ...! ! sub
context_script {! my ( $ctx, $args, $cond ) = @_;! ! my $search_string! = decode_html($ctx->stash('search_string') package MT::Template::Context::Search;! わざわざ戻してんのかよ!
35.
•どこでエスケープ済みなのか、 わからなくなるぞ? •エンコード済みのクエリを渡さ れたらおかしくならんか?
38.
統⼀一されていないので、 責任が曖昧(忘れちゃう)
39.
わからなくなるから...
40.
わからなくなるから...
43.
⼊入⼒力力値のエスケープは、 テンプレート出⼒力力時に統⼀一
44.
次
45.
$q = $_GET[‘search’];! $sql
= “SELECT FROM mt_entry WHERE! mt_entry.entry_title LIKE % ${q}%” 例例 : PHPによる実装
46.
APIやORマッパを使え
47.
my $app =
MT->instance;! my $q = $app->param(‘search’);! my @entries = MT- >model(‘entry’)! ->load( {! title => { like => $q }, ! } ) 例例 : Perlによる実装
48.
$app = $ctx- >stash(‘bootstrapper’);! $q
= $app->param(‘search’);! $entries = $app->! load(‘entry’,! array( ‘title’ => ! array( ‘like’ => $q ))); 例例 : PHP(DynamicMTML)による実装
49.
var q =
jQuery('#search').value;! var params = {! search: q,! searchFields: "title,body",! };! api.listEntries(siteId, params, function(response) {! if (response.error) {! return;! }! 例例 : JavaScriptによる実装
50.
何かあったらメーカーのせいw
51.
ユーザーの⼊入⼒力力を信⽤用しない! そもそも
52.
次
53.
applications:! cms:! menus:! page:page_foo:! label: Foo! order: 1000! mode:
page_foo! permission: manage_pages! view:! - blog! - website! 例例 : Pluginでのメソッドの拡張
54.
例例 : Pluginでのメソッドの拡張 methods:! page_foo:
$Foo::Foo::CMS:: page_foo! package Foo::CMS! ! sub page_foo {! my $app = shift;! # Do Something! <= え?! }!
55.
例例 : Pluginでのメソッドの拡張 短縮URLでもメールで送り つけてやれ! やっちゃえ!(*)
56.
脱線 : 管理理画⾯面にBasic認証かけても、正規 ユーザー攻撃タイプには意味がないよね。
57.
新規作成 編集 削除 例例 : Pluginで独⾃自オブジェクト
58.
え?
59.
sub save {
my $app = shift; my $q = $app-‐‑‒>param; my $type = $q-‐‑‒>param('_̲type'); my $save_̲mode = 'save_̲' . $type; if ( my $hdlrs = $app-‐‑‒>handlers_̲for_̲mode($save_̲mode) ) { return $app-‐‑‒>forward($save_̲mode);} my $id = $q-‐‑‒>param('id'); $app-‐‑‒>validate_̲magic() or return; my $author = $app-‐‑‒>user; my $perms = $app-‐‑‒>permissions; if ( !$author-‐‑‒>is_̲superuser ) { if ( ( $type ne 'author' ) && ( $type ne 'template' ) ){ return return $app-‐‑‒>permission_̲denied() if !$perms && $id; } $app-‐‑‒>run_̲callbacks( 'cms_̲save_̲permission_̲filter.' . $type, $app, $id ) || return $app-‐‑‒>permission_̲denied(); } #以下、保存 MT::CMS::Common::save(⼀一部省省略略) magic_̲tokenを チェック save_̲fooメソッドが定義され ているときはそちらへforward システム管理理者の場 合、ここはスルー コールバックcms_̲save_̲permission_̲filter.fooが1以外を返すと権限エラー
60.
対策
61.
程度度問題=読み出されるだけより、改ざ んされるほうが い・や・だ。 ちょっと脱線。何故ここだけ対策を? セキュリティにおいて、「程度度問題」 はいつもつきまとう。
62.
但し、前提は事情に よって変わる 例例えば、個⼈人情報。 流流出も改ざんもどっちもどっち
63.
改めて対策
64.
package MT::App::CMS; ホワイトリストではなくブラックリスト なので、不不要なものは塞塞いでおく
65.
GETリクエストは弾く(気休めだが) package Foo::CMS! ! sub page_foo
{! my $app = shift;! if ( $app->request_method ne “POST” ) { ! return $app->permission_denied();! }! #Do Something! } POSTしか受け付けない
66.
⼀一時トークンのチェック package Foo::CMS! ! sub page_foo
{! my $app = shift;! if $app->validate_magic! or return $app->permission_denied();! }! #Do Something! } magic_̲tokenパラメタをチェック
67.
⼀一時トークンのチェック •magic_̲token=アクティブユーザーの session情報 •saveやdelete等の操作ではチェックを! •(但し)magic_̲tokenが無効もしくは空の 時、ID/Password⼊入⼒力力画⾯面を表⽰示
•この時↑deleteメソッド以外ではパラメ タが引き継がれる
68.
⼀一時トークンのチェック •magic_̲token=アクティブユーザーの session情報 •saveやdelete等の操作ではチェックを! •(但し)magic_̲tokenが無効もしくは空の 時、ID/Password⼊入⼒力力画⾯面を表⽰示
•この時↑deleteメソッド以外ではパラメ タが引き継がれる
69.
でも
70.
CSRFとしては、不不⼗十分ではないか? mt.cgi?_̲_̲mode=save&_̲type=foo&title=Title... クリックしちゃだめー! 悪意のURL
71.
改善案 if $app->validate_magic(! { with_confirm! =>
{ message =>! ʻ‘FooをBarしようとしています。 宜しいですか?ʼ’,! icon => ‘CAUTION’! } } )! or return $app->trans_error...! }!
72.
改善案(簡易易指定) if $app->validate_magic! ( ʻ‘FooをBarしようとしています。宜しいですか?ʼ’
)! or return $app->trans_error...! }!
73.
改善案(次に何が起こるのかを明⽰示する) FooをBarしようとして います。宜しいですか?
74.
これからはセキュリティだっ て、UX重視だろ!
75.
話しを戻します
76.
package Foo::CMS! ! sub page_foo
{! my $app = shift;! my $perms = $app->permissions! or return $app->permission_denied();! return $app->permission_denied()! unless $perms! ->can_do('edit_all_pages');! #Do Something! } ちゃんと権限をチェック +更更新が必要なものは権限をチェック
77.
例例題
78.
sub some_̲action{
my $app= shift; require MT::Page; my $blog = app-‐‑‒>blog; my $page = MT::Page-‐‑‒>load( $app-‐‑‒>param( 'id' ) ); if (! $page ) { return $app-‐‑‒>translate( 'Invalid Page ID:[_̲1].', $app-‐‑‒>param( 'id' ) ); } my $perm = $app-‐‑‒>user-‐‑‒>is_̲superuser; if (! $perm ) { $perm = $app-‐‑‒>user-‐‑‒>permissions( $blog-‐‑‒>id )-‐‑‒>can_̲administer_̲website $perm = $app-‐‑‒>user-‐‑‒>permissions( $blog-‐‑‒>id )-‐‑‒>can_̲administer_̲blog unless $perm; $perm = $app-‐‑‒>user-‐‑‒>permissions( $blog-‐‑‒>id )-‐‑‒>can_̲manage_̲pages unless $perm; } if (! $perm ) { return $app-‐‑‒>translate( 'Permission denied.' ); } # この後、$pageへの処理理}
79.
1.パラメタidに数字以外のものが渡された場合 2.パラメタidにpageオブジェクトではなく entryオブジェクトのidが渡された場合 3.パラメタidが空の場合
4.パラメタidに現在のblogに属さないentry/ pageのidが渡された場合 考えておかなければならないケース
80.
sub some_̲action{
my $app= shift; require MT::Page; my $blog = app-‐‑‒>blog; my $page = MT::Page-‐‑‒>load( $app-‐‑‒>param( 'id' ) ); if (! $page ) { return $app-‐‑‒>translate( 'Invalid Page ID:[_̲1].', $app-‐‑‒>param( 'id' ) ); } my $perm = $app-‐‑‒>user-‐‑‒>is_̲superuser; if (! $perm ) { $perm = $app-‐‑‒>user-‐‑‒>permissions( $blog-‐‑‒>id )-‐‑‒>can_̲administer_̲website $perm = $app-‐‑‒>user-‐‑‒>permissions( $blog-‐‑‒>id )-‐‑‒>can_̲administer_̲blog unless $perm; $perm = $app-‐‑‒>user-‐‑‒>permissions( $blog-‐‑‒>id )-‐‑‒>can_̲manage_̲pages unless $perm; } if (! $perm ) { return $app-‐‑‒>translate( 'Permission denied.' ); } # この後、$pageへの処理理} mt.cgi?_̲_̲mode=some_̲action&id= <script>alert('do')</script> id=1&blog_̲id=3 ↑ id:1のpageのblog_̲id が3である保証は? idが空だったら?もしくはEntryのIDが渡されたら? てか、テンプレート エンジン使え!
81.
添削後
82.
sub some_̲action {
my $app = shift; $app-‐‑‒>validate_̲magic( ʻ‘FooをBarしてもよろしいですか?ʼ’ ) or return $app-‐‑‒>trans_̲error( 'Permission denied.' ); require MT::Page; my $page; if (! $app-‐‑‒>param( 'id' ) || (! $page = MT::Page-‐‑‒>load( $app-‐‑‒>param( 'id' ) ) ) { return $app-‐‑‒>trans_̲error( 'Invalid Page ID:'[_̲1]'', MT::Util::encode_̲html( $app-‐‑‒>param( 'id' ) ) ); } if ( $page-‐‑‒>class ne 'page' ) { return $app-‐‑‒>trans_̲error( 'Invalid Class:'[_̲1]'', $page-‐‑‒>class ); } # permission check case 1 if ( $app-‐‑‒>blog-‐‑‒>id != $page-‐‑‒>blog_̲id ) { return $app-‐‑‒>trans_̲error( 'Invalid BlogID:'[_̲1]'', MT::Util::encode_̲html( $app-‐‑‒>blog-‐‑‒>id ) ); } # 続く 操作を伴う場合最初にmagic_̲tokenをチェック 渡された値をそのまま表⽰示する場合、エスケープ Entryでないかチェック 違うブログIDに属するもので ないかチェック(※) ※システムスコープやウェブサイトスコープの場合はあり得るケース てか、テンプレート エンジン使え!
83.
if (! $app-‐‑‒>can_̲do( 'manage_̲pages' ) ) { return $app-‐‑‒>trans_̲error( 'Permission denied.' ); } # or case 2 my $perm = $app-‐‑‒>user-‐‑‒>is_̲superuser; if (! $perm ) { $perm = $app-‐‑‒>user-‐‑‒>permissions( $page-‐‑‒>blog_̲id )-‐‑‒> can_̲administer_̲website; $perm = $app-‐‑‒>user-‐‑‒>permissions( $page-‐‑‒>blog_̲id )-‐‑‒> can_̲administer_̲blog unless $perm; $perm = $app-‐‑‒>user-‐‑‒>permissions( $page-‐‑‒>blog_̲id )-‐‑‒> can_̲manage_̲pages unless $perm; } if (! $perm ) { return $app-‐‑‒>trans_̲error( 'Permission denied.' ); } if (! $app-‐‑‒>run_̲callbacks( 'cms_̲save_̲permission_̲filter.page' $app, $page ) { return $app-‐‑‒>trans_̲error( 'Permission denied.' ); } # Do Something.} $blog-‐‑‒>idではなく$page-‐‑‒>blog_̲idでチェック コールバックをすり 抜けないようにする
84.
⼀一気に難易易度度あがりましたが...
85.
結論論
86.
まとめ •セキュアプログラミングは性悪説 •それでも程度度問題。何をやられない ようにするか。何を優先するか(何 は、あきらめるか) •セキュリティにもUXの視点が必要
87.
まとめ •ユーザーの⼊入⼒力力を信⽤用しない •エスケープは出⼒力力時に統⼀一する •SQLを⾃自前で書くな。API使え
•正規ユーザー攻撃型改ざん対策のた めに、⼀一時トークンを使う
88.
ありがとうございました。
Download