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
kwatch
PDF, PPTX
34,383 views
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
SQLインジェクションを・・・駆逐してやる!! この世から・・・一匹残らず!! (PHPカンファレンス2015)
Technology
◦
Read more
90
Save
Share
Embed
Embed presentation
Download
Download as PDF, PPTX
1
/ 58
2
/ 58
Most read
3
/ 58
4
/ 58
5
/ 58
6
/ 58
7
/ 58
8
/ 58
9
/ 58
10
/ 58
11
/ 58
Most read
12
/ 58
Most read
13
/ 58
14
/ 58
15
/ 58
16
/ 58
17
/ 58
18
/ 58
19
/ 58
20
/ 58
21
/ 58
22
/ 58
23
/ 58
24
/ 58
25
/ 58
26
/ 58
27
/ 58
28
/ 58
29
/ 58
30
/ 58
31
/ 58
32
/ 58
33
/ 58
34
/ 58
35
/ 58
36
/ 58
37
/ 58
38
/ 58
39
/ 58
40
/ 58
41
/ 58
42
/ 58
43
/ 58
44
/ 58
45
/ 58
46
/ 58
47
/ 58
48
/ 58
49
/ 58
50
/ 58
51
/ 58
52
/ 58
53
/ 58
54
/ 58
55
/ 58
56
/ 58
57
/ 58
58
/ 58
More Related Content
PDF
イミュータブルデータモデル(入門編)
by
Yoshitaka Kawashima
KEY
やはりお前らのMVCは間違っている
by
Koichi Tanaka
PDF
実践!Elasticsearch + Sudachi を用いた全文検索エンジン
by
S. T.
PDF
怖くないSpring Bootのオートコンフィグレーション
by
土岐 孝平
PDF
例外設計における大罪
by
Takuto Wada
PDF
イミュータブルデータモデルの極意
by
Yoshitaka Kawashima
PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
by
Y Watanabe
PDF
XSS再入門
by
Hiroshi Tokumaru
イミュータブルデータモデル(入門編)
by
Yoshitaka Kawashima
やはりお前らのMVCは間違っている
by
Koichi Tanaka
実践!Elasticsearch + Sudachi を用いた全文検索エンジン
by
S. T.
怖くないSpring Bootのオートコンフィグレーション
by
土岐 孝平
例外設計における大罪
by
Takuto Wada
イミュータブルデータモデルの極意
by
Yoshitaka Kawashima
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
by
Y Watanabe
XSS再入門
by
Hiroshi Tokumaru
What's hot
PDF
PlaySQLAlchemy: SQLAlchemy入門
by
泰 増田
PDF
フロー効率性とリソース効率性、再入門 #devlove #devkan
by
Itsuki Kuroda
PPTX
SPAセキュリティ入門~PHP Conference Japan 2021
by
Hiroshi Tokumaru
PDF
Where狙いのキー、order by狙いのキー
by
yoku0825
PDF
What's new in Spring Boot 2.6 ?
by
土岐 孝平
PDF
SQL大量発行処理をいかにして高速化するか
by
Shogo Wakayama
PDF
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
by
Takahiko Ito
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
by
Koichiro Matsuoka
PDF
PostgreSQLアンチパターン
by
Soudai Sone
PDF
関数プログラミング入門
by
Hideyuki Tanaka
PPTX
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
by
SEGADevTech
PDF
とある診断員と色々厄介な脆弱性達
by
zaki4649
PDF
これからSpringを使う開発者が知っておくべきこと
by
土岐 孝平
PDF
オブジェクト指向の設計と実装の学び方のコツ
by
増田 亨
PDF
テスト文字列に「うんこ」と入れるな
by
Kentaro Matsui
PPTX
さくっと理解するSpring bootの仕組み
by
Takeshi Ogawa
PDF
SAT/SMTソルバの仕組み
by
Masahiro Sakai
PDF
文字コードに起因する脆弱性とその対策(増補版)
by
Hiroshi Tokumaru
PDF
それはYAGNIか? それとも思考停止か?
by
Yoshitaka Kawashima
PDF
(修正)機械学習デザインパターン(ML Design Patterns)の解説
by
Hironori Washizaki
PlaySQLAlchemy: SQLAlchemy入門
by
泰 増田
フロー効率性とリソース効率性、再入門 #devlove #devkan
by
Itsuki Kuroda
SPAセキュリティ入門~PHP Conference Japan 2021
by
Hiroshi Tokumaru
Where狙いのキー、order by狙いのキー
by
yoku0825
What's new in Spring Boot 2.6 ?
by
土岐 孝平
SQL大量発行処理をいかにして高速化するか
by
Shogo Wakayama
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
by
Takahiko Ito
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
by
Koichiro Matsuoka
PostgreSQLアンチパターン
by
Soudai Sone
関数プログラミング入門
by
Hideyuki Tanaka
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
by
SEGADevTech
とある診断員と色々厄介な脆弱性達
by
zaki4649
これからSpringを使う開発者が知っておくべきこと
by
土岐 孝平
オブジェクト指向の設計と実装の学び方のコツ
by
増田 亨
テスト文字列に「うんこ」と入れるな
by
Kentaro Matsui
さくっと理解するSpring bootの仕組み
by
Takeshi Ogawa
SAT/SMTソルバの仕組み
by
Masahiro Sakai
文字コードに起因する脆弱性とその対策(増補版)
by
Hiroshi Tokumaru
それはYAGNIか? それとも思考停止か?
by
Yoshitaka Kawashima
(修正)機械学習デザインパターン(ML Design Patterns)の解説
by
Hironori Washizaki
Viewers also liked
PDF
CODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato Kinugawa
by
CODE BLUE
PDF
バグハンターの哀しみ
by
Masato Kinugawa
PDF
20120830 DBリファクタリング読書会第三回
by
都元ダイスケ Miyamoto
PDF
Lars George HBase Seminar with O'REILLY Oct.12 2012
by
Cloudera Japan
PDF
並列データベースシステムの概念と原理
by
Makoto Yui
PPTX
Writing Yarn Applications Hadoop Summit 2012
by
Hortonworks
PPTX
Future of HCatalog - Hadoop Summit 2012
by
Hortonworks
PDF
【17-E-3】 オンライン機械学習で実現する大規模データ処理
by
Developers Summit
ODP
Data analytics with hadoop hive on multiple data centers
by
Hirotaka Niisato
PDF
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
by
Satoshi Yamada
PDF
Database smells
by
Mikiya Okuno
PDF
Cloudera Manager4.0とNameNode-HAセミナー資料
by
Cloudera Japan
PDF
あなたの知らないPostgreSQL監視の世界
by
Yoshinori Nakanishi
KEY
Hadoop Summit 2012 - Hadoop and Vertica: The Data Analytics Platform at Twitter
by
Bill Graham
PPTX
SQLチューニング入門 入門編
by
Miki Shimogai
PPTX
ならば(その弐)
by
Tomoaki Hiramoto
PDF
Datalogからsqlへの トランスレータを書いた話
by
Yuki Takeichi
PPTX
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
by
Miki Shimogai
CODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato Kinugawa
by
CODE BLUE
バグハンターの哀しみ
by
Masato Kinugawa
20120830 DBリファクタリング読書会第三回
by
都元ダイスケ Miyamoto
Lars George HBase Seminar with O'REILLY Oct.12 2012
by
Cloudera Japan
並列データベースシステムの概念と原理
by
Makoto Yui
Writing Yarn Applications Hadoop Summit 2012
by
Hortonworks
Future of HCatalog - Hadoop Summit 2012
by
Hortonworks
【17-E-3】 オンライン機械学習で実現する大規模データ処理
by
Developers Summit
Data analytics with hadoop hive on multiple data centers
by
Hirotaka Niisato
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
by
Satoshi Yamada
Database smells
by
Mikiya Okuno
Cloudera Manager4.0とNameNode-HAセミナー資料
by
Cloudera Japan
あなたの知らないPostgreSQL監視の世界
by
Yoshinori Nakanishi
Hadoop Summit 2012 - Hadoop and Vertica: The Data Analytics Platform at Twitter
by
Bill Graham
SQLチューニング入門 入門編
by
Miki Shimogai
ならば(その弐)
by
Tomoaki Hiramoto
Datalogからsqlへの トランスレータを書いた話
by
Yuki Takeichi
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
by
Miki Shimogai
Similar to 【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
PPTX
Phpcon2015
by
Hiroshi Tokumaru
PDF
Wtm
by
Soudai Sone
PPT
第7回社内勉強会「Code Sucks - 人の振り見て我が振り直せ」
by
Hiromu Shioya
PDF
Webセキュリティ勉強会SQLインジェクション
by
Yutaro Ikeda
PDF
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
by
Hiroshi Tokumaru
PDF
PDOでデータベース接続と SQLインジェクション対策
by
iPride Co., Ltd.
PDF
【10人限定】1日でマスター!word pressのための「php:mysql講座」
by
光利 吉田
PDF
SQL勉強会 初級編
by
Kazuma Hidaka
PDF
「Html sql」で図書館hpにアクセスしてみよう
by
Kentaro Matsui
PPT
Online schema change_for_mysql_casual
by
Naritoshi Hayashi
PDF
PerlとSQLのいろいろ
by
Takuya Tsuchida
PPTX
Sql learning2
by
Sadayoshi Ikushima
PDF
はじめてのSql文
by
GIG inc.
PDF
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
by
Masahiro Nagano
PDF
System2
by
Jun Chiba
PDF
Perl暦およそ10年(?)の僕がデータベースを使えるようになるまでの昔話
by
azuma satoshi
PPT
Online schema change in mysql casual #1(2010/12/11)
by
Naritoshi Hayashi
PPT
Online schema change in mysql casual #1(2010/12/11)
by
Naritoshi Hayashi
PDF
Sql基礎の基礎
by
Satomi Tsujita
PDF
今日こそわかる、安全なWebアプリの作り方2010
by
Hiroshi Tokumaru
Phpcon2015
by
Hiroshi Tokumaru
Wtm
by
Soudai Sone
第7回社内勉強会「Code Sucks - 人の振り見て我が振り直せ」
by
Hiromu Shioya
Webセキュリティ勉強会SQLインジェクション
by
Yutaro Ikeda
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
by
Hiroshi Tokumaru
PDOでデータベース接続と SQLインジェクション対策
by
iPride Co., Ltd.
【10人限定】1日でマスター!word pressのための「php:mysql講座」
by
光利 吉田
SQL勉強会 初級編
by
Kazuma Hidaka
「Html sql」で図書館hpにアクセスしてみよう
by
Kentaro Matsui
Online schema change_for_mysql_casual
by
Naritoshi Hayashi
PerlとSQLのいろいろ
by
Takuya Tsuchida
Sql learning2
by
Sadayoshi Ikushima
はじめてのSql文
by
GIG inc.
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
by
Masahiro Nagano
System2
by
Jun Chiba
Perl暦およそ10年(?)の僕がデータベースを使えるようになるまでの昔話
by
azuma satoshi
Online schema change in mysql casual #1(2010/12/11)
by
Naritoshi Hayashi
Online schema change in mysql casual #1(2010/12/11)
by
Naritoshi Hayashi
Sql基礎の基礎
by
Satomi Tsujita
今日こそわかる、安全なWebアプリの作り方2010
by
Hiroshi Tokumaru
More from kwatch
PDF
How to make the fastest Router in Python
by
kwatch
PDF
Migr8.rb チュートリアル
by
kwatch
PDF
なんでもID
by
kwatch
PDF
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
by
kwatch
PDF
O/Rマッパーによるトラブルを未然に防ぐ
by
kwatch
PDF
正規表現リテラルは本当に必要なのか?
by
kwatch
PDF
【公開終了】Python4PHPer - PHPユーザのためのPython入門 (Python2.5)
by
kwatch
PDF
DBスキーマもバージョン管理したい!
by
kwatch
PDF
PHPとJavaScriptにおけるオブジェクト指向を比較する
by
kwatch
PDF
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
by
kwatch
PDF
Fantastic DSL in Python
by
kwatch
PDF
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策
by
kwatch
PDF
PHP5.5新機能「ジェネレータ」初心者入門
by
kwatch
PDF
Pretty Good Branch Strategy for Git/Mercurial
by
kwatch
PDF
Oktest - a new style testing library for Python -
by
kwatch
PDF
文字列結合のベンチマークをいろんな処理系でやってみた
by
kwatch
PDF
I have something to say about the buzz word "From Java to Ruby"
by
kwatch
PDF
Cより速いRubyプログラム
by
kwatch
PDF
Javaより速いLL用テンプレートエンジン
by
kwatch
PDF
Underlaying Technology of Modern O/R Mapper
by
kwatch
How to make the fastest Router in Python
by
kwatch
Migr8.rb チュートリアル
by
kwatch
なんでもID
by
kwatch
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
by
kwatch
O/Rマッパーによるトラブルを未然に防ぐ
by
kwatch
正規表現リテラルは本当に必要なのか?
by
kwatch
【公開終了】Python4PHPer - PHPユーザのためのPython入門 (Python2.5)
by
kwatch
DBスキーマもバージョン管理したい!
by
kwatch
PHPとJavaScriptにおけるオブジェクト指向を比較する
by
kwatch
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
by
kwatch
Fantastic DSL in Python
by
kwatch
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策
by
kwatch
PHP5.5新機能「ジェネレータ」初心者入門
by
kwatch
Pretty Good Branch Strategy for Git/Mercurial
by
kwatch
Oktest - a new style testing library for Python -
by
kwatch
文字列結合のベンチマークをいろんな処理系でやってみた
by
kwatch
I have something to say about the buzz word "From Java to Ruby"
by
kwatch
Cより速いRubyプログラム
by
kwatch
Javaより速いLL用テンプレートエンジン
by
kwatch
Underlaying Technology of Modern O/R Mapper
by
kwatch
Recently uploaded
PDF
PCCC25(設立25年記念PCクラスタシンポジウム):東京大学情報基盤センター テーマ1/2/3「Society5.0の実現を目指す『計算・データ・学習...
by
PC Cluster Consortium
PDF
visionOS TC「新しいマイホームで過ごすApple Vision Proとの新生活」
by
Sugiyama Yugo
PDF
第25回FA設備技術勉強会_自宅で勉強するROS・フィジカルAIアイテム.pdf
by
TomohiroKusu
PPTX
DrupalCon Nara 2025の記録 .
by
iPride Co., Ltd.
PDF
安価な ロジック・アナライザを アナライズ(?),Analyze report of some cheap logic analyzers
by
たけおか しょうぞう
PDF
基礎から学ぶ PostgreSQL の性能監視 (PostgreSQL Conference Japan 2025 発表資料)
by
NTT DATA Technology & Innovation
PCCC25(設立25年記念PCクラスタシンポジウム):東京大学情報基盤センター テーマ1/2/3「Society5.0の実現を目指す『計算・データ・学習...
by
PC Cluster Consortium
visionOS TC「新しいマイホームで過ごすApple Vision Proとの新生活」
by
Sugiyama Yugo
第25回FA設備技術勉強会_自宅で勉強するROS・フィジカルAIアイテム.pdf
by
TomohiroKusu
DrupalCon Nara 2025の記録 .
by
iPride Co., Ltd.
安価な ロジック・アナライザを アナライズ(?),Analyze report of some cheap logic analyzers
by
たけおか しょうぞう
基礎から学ぶ PostgreSQL の性能監視 (PostgreSQL Conference Japan 2025 発表資料)
by
NTT DATA Technology & Innovation
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
1.
徳丸先生に怒られない 動的SQLの 安全な組み立て方 Makoto Kuwata http://www.kuwata-lab.com/ PHP Conference
2015 ver 1.1.0
2.
copyright 2015 kuwata-lab.com
all rights reserved.© 本発表の作成には徳丸先生は関わって おりません。 内容の責任はすべて発表者にあるので、 ご意見がありましたら先生にではなく 発表者までお願いします。 !! CAUTION !!
3.
copyright 2015 kuwata-lab.com
all rights reserved.© 発表の背景:裁判と損害賠償 引用: http://blog.tokumaru.org/2015/01/sql.html SQLインジェクション脆弱性が原因でクレジット カード情報が漏洩した事件につき、ショップ側が 開発会社を相手取り損害賠償請求の裁判を起こし、 ショップ側が勝訴 結果、3131万9568円の損害を認定し、その3割を 控除して、2262万3697円の損害賠償をY社に 命じた
4.
copyright 2015 kuwata-lab.com
all rights reserved.© 発表の背景:ばく大な金額 引用: http://www.ipa.go.jp/files/000013778.pdf (SQLiによる推計される被害額について) 推計すると、約 4,800 万円∼1 億円程度を要する ものと考えられる。
5.
copyright 2015 kuwata-lab.com
all rights reserved.© 発表の目的 SQL Injection が起きる真の原因を考える 「プレースホルダを使ってないから」では考察不足 SQL Injection を起こさない方法を考える 「プレースホルダを使え」では対策不足
6.
copyright 2015 kuwata-lab.com
all rights reserved.© アジェンダ 考察:なぜSQL Injectionが発生するのか? 対策:SQLテンプレート 対策:SQL構文木 まとめ
7.
copyright 2015 kuwata-lab.com
all rights reserved.© 前提知識 SQL Injection が何か、知ってること (以降では SQL Injection を SQLi と省略) プレースホルダやバインド変数について 知ってること 「:id」や「?」がプレースホルダ、渡す値がバインド変数 PHPのコードが読めること PHPカンファレンスなので :)
8.
なぜSQL Injection が 発生するのか?
9.
copyright 2015 kuwata-lab.com
all rights reserved.© SQL Injection 対策 エスケープしろ!プレースホルダを使え! http://www.ipa.go.jp/files/000017320.pdf
10.
copyright 2015 kuwata-lab.com
all rights reserved.© なぜSQL Injectionが発生するのか? プレースホルダを使ってないから?
11.
copyright 2015 kuwata-lab.com
all rights reserved.© プレースホルダを使っててもSQLi $sql = "select * from users" . " where deleted_at is null"; $vars = []; if ($max_age) { $sql .= " and age <= :max_age"; $vars['max_age'] = $max_age; } if ($min_age) { $sql .= " and age >= ".$min_age; $vars['min_age'] = $min_age; } プレースホルダを 使っている ただの文字列 連結! SQLi!
12.
copyright 2015 kuwata-lab.com
all rights reserved.© なぜSQL Injectionが発生するのか? プレースホルダを使ってないから? 実情は、プレースホルダつきの安全なSQLを組み立てて いる最中に SQL Injection が入り込んでいる これこそが真の原因 文字列連結でSQLを組み立ててるから
13.
copyright 2015 kuwata-lab.com
all rights reserved.© 変数の埋め込みも文字列連結と同じ // これと $sql .= " and age >= ".$min_age; // これは同じ $sql .= " and age >= $min_age"; 変数の埋め込みも 文字列連結と同じ
14.
copyright 2015 kuwata-lab.com
all rights reserved.© なぜ文字列結合でSQLを作るのか? プレースホルダではできないことがあるから 要素数が動的に変わる in (....) 、order by でのカラム名指定 真の原因その2 // SQLを文字列で渡せてしまえるんだから、 // SQLを文字列結合で組み立ててしまうのは当然のこと $st = pdo->prepare("select * from users"); SQLを文字列で指定できてしまうから
15.
copyright 2015 kuwata-lab.com
all rights reserved.© SQL Injection を防ぐには? 文字列連結ではない方法で動的SQLを 組み立てればよい 方法:SQLテンプレート or SQL構文木 (詳細は後述) SQL文字列ではない方法でSQLを 指定できるようにすればよい 方法:SQL ID or SQL構文木 (詳細は後述)
16.
copyright 2015 kuwata-lab.com
all rights reserved.© SQL Injection が発生する本当の原因は、 ライブラリや API のインターフェースに 欠陥があるからである。 間違いを誘発するものを使い続ける限り、 SQL Injection がなくなることはない。 Let's Tweet!
17.
copyright 2015 kuwata-lab.com
all rights reserved.© ここまでのまとめ SQLを文字列連結で組み立てるから、 SQL Injection が発生する 対策:文字列連結ではない方法でSQLを組み立てる 生のSQLを文字列で渡せてしまうから、 文字列連結を使ってしまう 対策:生のSQLを渡すかわりに別の方法でSQLを指定する 本質的にはAPIやインターフェースの欠陥 結果はセキュリティ被害だけど、原因はセキュリティとは違う
18.
SQLテンプレート
19.
copyright 2015 kuwata-lab.com
all rights reserved.© SQLテンプレートとは? SQLを生成するためのテンプレート WebアプリでのHTMLテンプレートと同じ SQL Injection が発生しない(原理上は) 文字列連結が不可、値のエスケープ or プレースホルダを強制 注:内部の実装では文字列連結を使うが、開発者が明示的に使うことはできない。
20.
copyright 2015 kuwata-lab.com
all rights reserved.© サンプル:SQLテンプレート /* 年齢の上限/下限が指定されたら、検索条件を追加 */ select * from users where deleted_at is null -- #if :max_age and age <= :max_age -- #end -- #if :min_age and age >= :min_age -- #end
21.
copyright 2015 kuwata-lab.com
all rights reserved.© サンプル:PHPコードへ変換 /* 年齢の上限/下限が指定されたら、検索条件を追加 */ select * from users where deleted_at is null <?php if ($vars['max_age']) { ?> and age <= :max_age <?php } ?> <?php if ($vars['min_age']) { ?> and age >= :min_age <?php } ?> 注:実際はもう少し複雑なコードに変換される
22.
copyright 2015 kuwata-lab.com
all rights reserved.© サンプル:生成されたSQL // $var = array("min_age"=>20) なら select * from users where deleted_at is null and age >= :min_age
23.
copyright 2015 kuwata-lab.com
all rights reserved.© SQLTempl8 SQLを対象としたテンプレートエンジン https://github.com/kwatch/sqltempl8/ まだコンセプト実装 (いろいろ足りない) 使い方は随時変わるので、最新のドキュメントを参照のこと
24.
copyright 2015 kuwata-lab.com
all rights reserved.© SQLTempl8:SQLを生成 1: <?php 2: require_once 'sqltempl8.php'; 3: $t = new SQLTempl8("sql/users.sql"); 4: $vars = array('min_age'=>20); 5: $sql = $t->render($vars); 6: echo $sql; //=> select * from users // where deleted_at is null // and age >= :min_age
25.
copyright 2015 kuwata-lab.com
all rights reserved.© SQLTempl8:SQLを実行 1: <?php 2: require_once 'sqltempl8.php'; 3: $t = new SQLTempl8("sql/users.sql"); 4: $vars = array('min_age'=>20); 5: $pdo_conn = new PDO("....."); 6: $pdo_stmt = $t->execute($pdo_conn, $vars); 7: if ($pdo_stmt !== null) { 8: foreach ($pdo_stmt as $row) { ... } 9: }
26.
copyright 2015 kuwata-lab.com
all rights reserved.© なぜSQL Injectionが発生しないの? // SQLテンプレート select * from users where deleted_at is null -- #if :max_age and age <= :max_age -- #end -- #if :min_age and age >= :min_age -- #end 文字列連結が書けない (文法が極めて限定的) 変数値が埋め込めない (プレースホルダを強制)
27.
copyright 2015 kuwata-lab.com
all rights reserved.© なぜSQL Injectionが発生しないの? // メインプログラム <?php require_once 'sqltempl8.php'; $t = new SQLTempl8("sql/users.sql"); $vars = array('min_age'=>20); $pdo_conn = new PDO("....."); $pdo_stmt = $t->execute($pdo_conn, $vars); if ($pdo_stmt !== null) { foreach ($pdo_stmt as $row) { ... } } SQL IDとしてテンプレートの ファイル名を指定 (生のSQLを指定しない)
28.
copyright 2015 kuwata-lab.com
all rights reserved.© Q:PHPコードが埋め込めるのでは? セキュリティ上の大きな穴になりそう… // SQL template select <?= $_GET['param'] ?> from users where true -- % if :max_age and age <= :max_age -- % end -- % if :min_age and age >= :min_age -- % end
29.
copyright 2015 kuwata-lab.com
all rights reserved.© A:'<?' をエスケープします ちゃんとSQL Syntax Errorになってくれます // PHP code select <<?php ?>?= $_GET['param'] ?> from users where true <?php if ($var['max_age']) { ?> and age <= :max_age <?php } ?> <?php if ($var['min_age']) { ?> and age >= :min_age <?php } ?>
30.
copyright 2015 kuwata-lab.com
all rights reserved.© Q:'=' と 'is null' との切り替えは? 値が null なら '=' を 'is null' にしてほしい select * from users where deleted_on = :deleted // これ↓は面倒なのでいやだ select * from users -- #if :deleted where deleted_on = :deleted -- #else where deleted_on is null -- #end $vars['deleted'] がnullなら '=' を 'is null' に自動的に変更 してほしい
31.
copyright 2015 kuwata-lab.com
all rights reserved.© A:MySQLの '<=>' 演算子を使おう ポスグレなら 'is not distinct from' 演算子 select * from users where deleted_on <=> :deleted 値が null なら deleted_on is null と同じ、 それ以外なら deleted_on = :deleted と同じ 注:本当なら、SQL構文を解析して '=' 演算子を置換することが望ましい。
32.
copyright 2015 kuwata-lab.com
all rights reserved.© Q:where句の追加が面倒では? 例:上下限値があるときだけwhere句を追加 select * from users -- #if :max_age or :min_age where true -- #if :max_age and age <= :max_age -- #end -- #if :min_age and age >= :min_age -- #end -- #end この条件分岐が面倒!!
33.
copyright 2015 kuwata-lab.com
all rights reserved.© A:DBの最適化機能に任せよう 「where true」が残っても性能に影響はない select * from users -- #if :max_age or :min_age where true -- #if :max_age and age <= :max_age -- #end -- #if :min_age and age >= :min_age -- #end -- #end 余分な 'where true' は DBのOptimizerが 取り除いてくれる (実行計画を見れば確認可能)
34.
copyright 2015 kuwata-lab.com
all rights reserved.© Q:やっぱり埋め込み式が欲しい! placeholderでは表名やカラム名が指定できない select * from blog_entries_<?= $user ?> where deleted_at is null order by <?= $sortkey ?> from :table とはできない order by :sortkey とはできない
35.
copyright 2015 kuwata-lab.com
all rights reserved.© A:制限つき埋め込み式を用意しました 値として、英数字と '_' と '.' だけを許可 // SQL template select * from blog_entries order by [=:sortkey=] // PHP code select * from blog_entries order by <?php if (! preg_match('/^w+(.w+)*$/', $vars['sortkey']) throw new SQLTemplateError("error"); echo $vars['sortkey']; ?> テーブル名やカラム名で なければ例外を発生
36.
copyright 2015 kuwata-lab.com
all rights reserved.© 課題 xxx in (...) のサポートがまだ プレースホルダではうまく扱うのが難しく、仕様を考え中 (できるならPDOのエスケープ機能 quote() を拡張したい) foreach文の導入がまだ これもプレースホルダでは扱いが難しいが、いわゆる バルクインサートでは必須なので実装したい PDOは全部文字列として扱ってしまう! バインド変数にデータ型を指定するよう変更予定
37.
copyright 2015 kuwata-lab.com
all rights reserved.© ここまでのまとめ SQLテンプレートならSQLiが発生しない 文字列結合が書けない プレースホルダやエスケープを強制 生SQLを指定できない
38.
SQL構文木
39.
copyright 2015 kuwata-lab.com
all rights reserved.© SQL構文木とは? SQLを木構造で表したデータ select * where = id 123 from books
40.
copyright 2015 kuwata-lab.com
all rights reserved.© SQL構文木の組み立て方 通常は専用のライブラリを使うか、… $q = new Query(); $q->select('*') ->from('books') ->where('id', '=', 123); $book = $q->query();
41.
copyright 2015 kuwata-lab.com
all rights reserved.© SQL構文木の組み立て方 O/R Mapperを使う class Book extends Entity { ... }; class Books extends Schema { ... }; $q = new Query(Books); $q->where(Books::id->eq(123)); $book = $q->select('*');
42.
copyright 2015 kuwata-lab.com
all rights reserved.© SQL構文木の組み立て方 演算子オーバーライドが使えると自然な記述に // Ruby book = Book.where(:id == 123).first() // Python book = db.query(Book) .filter(Book.id == 123) .first() true/falseではなく 部分構文木を返す 参考:「演算子オーバーライドをDSLに活用する」でggr
43.
copyright 2015 kuwata-lab.com
all rights reserved.© 構文木 → SQL文字列 '=' と 'is null' も、値に応じて自動的に変換 where == id 123 where == id null where id = 123 where id is null
44.
copyright 2015 kuwata-lab.com
all rights reserved.© なぜSQL Injectionを防げるの? 文字列結合後にSQLをパースするからSQLiが発生 $id = $_GET['id']; $sql = "select * from books where id = '$id'"; // もし $id が "' or 1<>'" なら…⋯ select * from books where id = '' or 1<>'' 意図しない構造に 変わってしまった!
45.
copyright 2015 kuwata-lab.com
all rights reserved.© なぜSQL Injectionを防げるの? SQL構文木なら意図しない変更ができない where = id ' or 1 <>' $q->where( Books::id, '=', $_GET['id'] ); 悪意ある値を 受けとっても… 木構造は影響を 受けない
46.
copyright 2015 kuwata-lab.com
all rights reserved.© 本当は構文木のままDBに送信したい SQL文字列は直列化形式として本当に妥当なのか? where = id 123 送信 (注)直列化:構造のあるデータをバイト列に変換すること。 データを送信したりファイルに保存するときに必要。 データベース 変換 select ... from ... where ... and ... もっと改ざんされにくい 形式でもいいのでは? SQL文字列構文木
47.
copyright 2015 kuwata-lab.com
all rights reserved.© 注意!それは木構造ではない! // 一見、木構造を作ってるように見えるが…⋯ $q->where('id = ?', $_GET['id']); // 実はそうではない $q->where($_GET['col'].' = ?', $_GET['id']); SQLを文字列で指定できて しまうのでアウト
48.
copyright 2015 kuwata-lab.com
all rights reserved.© 課題 動作速度は遅い 木構造の構築も、SQLへの変換も、動作コストが大きい 昨今のCPUパワーをもっと 安全性のために使ってほしい
49.
copyright 2015 kuwata-lab.com
all rights reserved.© ここまでのまとめ SQL構文木を作るとSQLiが発生しない 悪意ある文字列を渡されてもSQL構造が変更されない
50.
まとめ
51.
copyright 2015 kuwata-lab.com
all rights reserved.© まとめ 動的SQLを作るのに文字列結合を避ける かわりにSQLテンプレートやSQL構文木を使う 本質的にはAPIやインターフェースの欠陥 生のSQLを文字列で渡せてしまう → だからSQLを文字列で組み立ててしまう → だからSQL Injectionがなくならない
52.
copyright 2015 kuwata-lab.com
all rights reserved.© 補足 型はSQLiの防止に役立つか? Yes。型はValidationに役立つ、そしてバインド変数の ValidationはSQLi防止に有効、なので型はSQLi防止に役立つ 型安全であればSQLiは防げるか? No。型安全でも文字列連結はできる、そして文字列連結を使 うとSQLiが起こり得る、なので型安全でもSQLiが起こり得る 参考:https://twitter.com/ockeghem/status/650171306428596224 https://twitter.com/tanakh/status/650214648382291968 https://twitter.com/tanakh/status/650215363943116800 型安全だけではSQLiは防げない、 もう一工夫必要
53.
copyright 2015 kuwata-lab.com
all rights reserved.© 参考資料 (SQLテンプレート) SQLTempl8 https://github.com/kwatch/sqltempl8 Doma - SQLテンプレートの仕組み http://www.slideshare.net/taedium/doma-sql DBFlute入門 - 外だしSQLの基本 http://gihyo.jp/dev/feature/01/dbflute/0005 S2JDBC - SQLファイル http://s2container.seasar.org/2.4/ja/s2jdbc_manager_sqlfile.html
54.
copyright 2015 kuwata-lab.com
all rights reserved.© 参考資料 (SQL構文木) 演算子オーバーライドをDSLに活用する http://j.mp/slide_opdsl O/R Mapperによるトラブルを未然に防ぐ http://j.mp/slide_orm2 O/Rマッパーを支える技術 http://j.mp/slide_orm1
55.
copyright 2015 kuwata-lab.com
all rights reserved.© お客さまにおすすめの新刊があります 徳丸浩のWebセキュリティ教室 2015-10-22 発売予定 日経BP社 1944円 Let's Tweet! 絶賛予約受付中!
56.
One More Thing...
57.
copyright 2015 kuwata-lab.com
all rights reserved.© 私的反省会 今回の内容は、HTMLテンプレートでは すでに知られていたことばかり 自動エスケープ機能や、木構造が安全なことなど それをSQLへ応用するのが遅れたせいで 不幸な判決を生み出してしまった HTMLテンプレートエンジン作者の一人としてお詫びします ごめんなさい
58.
copyright 2015 kuwata-lab.com
all rights reserved.© おしまい
Download