SlideShare uma empresa Scribd logo
1 de 34
再帰的 正規表現JSON Validator サイボウズ・ラボ株式会社竹迫 良範<takesako@shibuya.pm.org>
(?R)
再帰的正規表現でJSON Validatorを作ってみた PCREの記法(?R)(?0)(?1)を使うテクニック $json =~ / (  *  (?: "(?:[^"]*|["bfnrt]|u[0-9A-Fa-f]{4})*"   | -? (?= [1-9]|0(?!) ) + (?:+)? (?:[eE] [+-]? +)?    | true | false | null   |   (?:  (?1)  (?: , (?1)  )*  )?  *    |  (?: *"(?:[^"]*|["bfnrt]|u[0-9A-Fa-f]{4})*"*:(?1)      (?:,*"(?:[^"]*|["bfnrt]|u[0-9A-Fa-f]{4})*"*:(?1)   )*)? *   )  * ) /sx ;
JSONとは
JSONとは JavaScript Object Notation JavaScriptの記法を元にしたデータ記述用言語 元々はJavaScriptのサブセットとして考案 varobj = eval(  "(" + json_text + ")"  ); JSON文字列を evalすると JavaScript object になる [     { "id" : 1001 , "name" : "foo" },      { "id" : 1002 , "name" : "bar" } ]
JavaScript で受け取った JSON を evalすると… そのまま evalするのは大変危険 「山田太郎(正常系)」 { "name" : "山田太郎=> (正常系" } 「山田  ”}),alert(24)//XSS」 { "name" : "山田"}),alert(24)//太郎" } varjson_text = (   { "name" : "  山田"}, alert(24);//XSS " } ); varobj = eval("(" + json_text + ")");
CVE-2007-3227:JSON における XSS 脆弱性 #to_jsonのHTMLエスケープ漏れでXSSが発生 http://dev.rubyonrails.org/ticket/8371
JSONの規格(データ交換フォーマット) RFC4627 による定義 The application/json Media Type forJavaScript Object Notation (JSON) ECMA-262 による定義 ECMA-262 ECMAScript言語仕様 5th edition 15.12 The JSON object [PDF] ISO/IEC 16262:2011 他のプログラミング言語の JSON parser PHP, Python, Java, Perl, C/C++... http://json.org/
JSON の構成要素 JSON string JSON number JSON array JSON object JSON value 特別な値3つ true false null
JSON string の定義 例: "abc", "", "あ", "3042" A string is a collection of zero or more Unicode characters, wrapped in double quotes, using backslash escapes. A character is represented as a single character string.
JSON number の定義 例: 0, 1, -2, 3.14, 9e3, 9000 A number is very much like a C or Java number, except that the octal and hexadecimal formats are not used.
JSON array の定義 例:["a", "b", "c"] An array is an ordered collection of values. An array begins with [ (left bracket) and ends with ] (right bracket). Values are separated by , (comma).
JSON object の定義 例:{"string": value, "key": value} An object is an unordered set of name/value pairs. An object begins with { (left brace) and ends with } (right brace). Each name is followed by : (colon) and the name/value pairs are separated by , (comma).
JSON value の定義 例:"abc", 123, {}, [], true, false, null A value can be a string in double quotes, or a number, or true or false or null, or an object or an array. These structures can be nested. [ [], [1, 2], ["a", "b"], {}, {"x": {"y": "z"}} ]
演習問題
Q. 以下の JSON は正しいフォーマットか? (1) JSON object のキーは "string" { apple: 1, beer: 2 } { "apple": 1, "beer": 2 }
Q. 以下の JSON は正しいフォーマットか? (2) 複数 value のカンマ区切り(最後) {   "name"   : "TAKESAKO, Yoshinori",    "E-mail" : "takesako@labs.cybozu.co.jp", } {   "name"   : "TAKESAKO, Yoshinori",    "E-mail" : "takesako@labs.cybozu.co.jp" }
Q. 以下の JSON は正しいフォーマットか? (3) JSON string の引用符は "" のみ [ 0, 1, 2, 'abc', 'string' ] [ 0, 1, 2, "abc", "string" ]
Q. 以下の JSON は正しいフォーマットか? (4) JSON number の符号に + はない [ -3, 3.14, 1.23e2, +123.456 ] [ -3, 3.14, 1.23e2,  123.456 ]
Q. 以下の JSON は正しいフォーマットか? (5) JavaScript comment は使用できない [{ /* Bookmark */   "url": "http://cybozu.co.jp/",   "memo": "Cybozu HP" // title }] [{   "url": "http://cybozu.co.jp/",   "memo": "Cybozu HP" }]
Q. 以下の JSON は正しいフォーマットか? (6) JSON number は10進数のみ [   { "file": "a.out", "chmod": 0775 },   { "file": "a.cpp", "chmod": 0644 } ] [   { "file": "a.out", "chmod": 509 },   { "file": "a.cpp", "chmod": 420 } ]
Q. 以下の JSON は正しいフォーマットか? (7) string number 以外の JSON value [ "Boolean", True, False, Null ] [ "Boolean", true, false, null ]
Q. 以下の JSON は正しいフォーマットか? (8) Unicode 文字の扱い { "a": "aあA", "i": "i3044I" } { "a":"a3042A", "i":"i3044I" }
Q. 以下の JSON は正しいフォーマットか? (9) /のエスケープ "<script src='/jquery.js'></script>" "<script src='/jquery.js'><script>"
正規表現で チェック できる?
Perl で PCRE 拡張の記法を使う (?(DEFINE)	(?<foo> regexp1)			(?<bar> regexp2) … ) (?&foo) (?&bar) $json =~ / (?(DEFINE) (?<string>  (?:[^"]* |  ["bfnrt] | u[0-9A-Fa-f]{4} )* " ) (?<number>  -? (?=[1-9]|0(?!))+(?:+)? (?:[eE] [+-]? +)? )      (?<boolean>   true | false | null ) (?<array>       (?:  (?&json)  (?: , (?&json)  )*  )?  *  )      (?<pair>      * (?&string) * : (?&json)  )      (?<object>      (?:  (?&pair)  (?: , (?&pair)  )*  )?  *  ) (?<json>  * (?: (?&number) | (?&boolean) | (?&string)  | (?&array)  | (?&object)  ) * ) )   (?&json)  /sx;
これは わかり やすい
自分自身の正規表現にマッチ (?R) PCREの記法(?R)がPerlでも使える! “{{{}}}” にマッチ “xxxx{{{}}}}}}}zzzzzz” にもマッチ 以下の正規表現だとネストしてくれない… /(?R)*/ /^ (?R)* $/
(?R)(?0)(?1)(?2)・・・が使える! 任意のキャプチャ部分の再帰ができる /(?R)*/ /(?0)*/ /((?1)*)/ /^((?1)*)$/
JSON Validator を作ってみる PCREの記法(?1)を使うテクニック $json =~ / (  *  (?: "(?:[^"]*|["bfnrt]|u[0-9A-Fa-f]{4})*"   | -? (?= [1-9]|0(?!) ) + (?:+)? (?:[eE] [+-]? +)?    | true | false | null   |   (?:  (?1)  (?: , (?1)  )*  )?  *    | (?: *"(?:[^"]*|["bfnrt]|u[0-9A-Fa-f]{4})*"*:(?1) (?:,*"(?:[^"]*|["bfnrt]|u[0-9A-Fa-f]{4})*"*:(?1)     )* )? *   )  * ) /sx ;
再帰的 正規表現 便利也


Mais conteúdo relacionado

Semelhante a 再帰的 正規表現JSON Validator

JavaScriptの正規表現
JavaScriptの正規表現JavaScriptの正規表現
JavaScriptの正規表現yaju88
 
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和schoowebcampus
 
Jpug study-jsonb-datatype-20141011
Jpug study-jsonb-datatype-20141011Jpug study-jsonb-datatype-20141011
Jpug study-jsonb-datatype-20141011Toshi Harada
 
OpenStreetMap+MongoDBで地図情報を検索してみたい!
OpenStreetMap+MongoDBで地図情報を検索してみたい!OpenStreetMap+MongoDBで地図情報を検索してみたい!
OpenStreetMap+MongoDBで地図情報を検索してみたい!Naruhiko Ogasawara
 
すごいHaskell読書会 第7章 (前編)
すごいHaskell読書会 第7章 (前編)すごいHaskell読書会 第7章 (前編)
すごいHaskell読書会 第7章 (前編)Suguru Hamazaki
 
PGCon.jp 2014 jsonb-datatype-20141205
PGCon.jp 2014 jsonb-datatype-20141205PGCon.jp 2014 jsonb-datatype-20141205
PGCon.jp 2014 jsonb-datatype-20141205Toshi Harada
 
プログラミング講座 #2 複雑なデータの扱い
プログラミング講座 #2 複雑なデータの扱いプログラミング講座 #2 複雑なデータの扱い
プログラミング講座 #2 複雑なデータの扱いZOIdayo
 
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.0.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.0.0対応)NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.0.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.0.0対応)fisuda
 
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.2.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.2.0対応)NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.2.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.2.0対応)fisuda
 
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.6.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.6.0対応)NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.6.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.6.0対応)fisuda
 
お前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのかお前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのかKousuke Ebihara
 
MyNA JPUG study 20160220-postgresql-json-datatype
MyNA JPUG study 20160220-postgresql-json-datatypeMyNA JPUG study 20160220-postgresql-json-datatype
MyNA JPUG study 20160220-postgresql-json-datatypeToshi Harada
 
ErlangでErlagVM上で動く言語の作り方
ErlangでErlagVM上で動く言語の作り方ErlangでErlagVM上で動く言語の作り方
ErlangでErlagVM上で動く言語の作り方osamu kimura
 
Usp友の会勉強会、ジャクソン構造図の巻(前編)
Usp友の会勉強会、ジャクソン構造図の巻(前編)Usp友の会勉強会、ジャクソン構造図の巻(前編)
Usp友の会勉強会、ジャクソン構造図の巻(前編)umidori
 
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.1.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.1.0対応)NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.1.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.1.0対応)fisuda
 

Semelhante a 再帰的 正規表現JSON Validator (16)

JavaScriptの正規表現
JavaScriptの正規表現JavaScriptの正規表現
JavaScriptの正規表現
 
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
 
Ssaw08 0916
Ssaw08 0916Ssaw08 0916
Ssaw08 0916
 
Jpug study-jsonb-datatype-20141011
Jpug study-jsonb-datatype-20141011Jpug study-jsonb-datatype-20141011
Jpug study-jsonb-datatype-20141011
 
OpenStreetMap+MongoDBで地図情報を検索してみたい!
OpenStreetMap+MongoDBで地図情報を検索してみたい!OpenStreetMap+MongoDBで地図情報を検索してみたい!
OpenStreetMap+MongoDBで地図情報を検索してみたい!
 
すごいHaskell読書会 第7章 (前編)
すごいHaskell読書会 第7章 (前編)すごいHaskell読書会 第7章 (前編)
すごいHaskell読書会 第7章 (前編)
 
PGCon.jp 2014 jsonb-datatype-20141205
PGCon.jp 2014 jsonb-datatype-20141205PGCon.jp 2014 jsonb-datatype-20141205
PGCon.jp 2014 jsonb-datatype-20141205
 
プログラミング講座 #2 複雑なデータの扱い
プログラミング講座 #2 複雑なデータの扱いプログラミング講座 #2 複雑なデータの扱い
プログラミング講座 #2 複雑なデータの扱い
 
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.0.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.0.0対応)NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.0.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.0.0対応)
 
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.2.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.2.0対応)NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.2.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.2.0対応)
 
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.6.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.6.0対応)NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.6.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.6.0対応)
 
お前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのかお前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのか
 
MyNA JPUG study 20160220-postgresql-json-datatype
MyNA JPUG study 20160220-postgresql-json-datatypeMyNA JPUG study 20160220-postgresql-json-datatype
MyNA JPUG study 20160220-postgresql-json-datatype
 
ErlangでErlagVM上で動く言語の作り方
ErlangでErlagVM上で動く言語の作り方ErlangでErlagVM上で動く言語の作り方
ErlangでErlagVM上で動く言語の作り方
 
Usp友の会勉強会、ジャクソン構造図の巻(前編)
Usp友の会勉強会、ジャクソン構造図の巻(前編)Usp友の会勉強会、ジャクソン構造図の巻(前編)
Usp友の会勉強会、ジャクソン構造図の巻(前編)
 
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.1.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.1.0対応)NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.1.0対応)
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 3.1.0対応)
 

Mais de takesako

SECCON CTF セキュリティ競技会コンテスト開催について
SECCON CTF セキュリティ競技会コンテスト開催についてSECCON CTF セキュリティ競技会コンテスト開催について
SECCON CTF セキュリティ競技会コンテスト開催についてtakesako
 
Acme minechan
Acme minechanAcme minechan
Acme minechantakesako
 
Acme::MineChan LT demo
Acme::MineChan LT demoAcme::MineChan LT demo
Acme::MineChan LT demotakesako
 
Node.js - JavaScript Thread Programming
Node.js - JavaScript Thread ProgrammingNode.js - JavaScript Thread Programming
Node.js - JavaScript Thread Programmingtakesako
 
Node.js - sleep sort algorithm
Node.js - sleep sort algorithmNode.js - sleep sort algorithm
Node.js - sleep sort algorithmtakesako
 
x86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNTx86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNTtakesako
 
正規表現‐もう一つのバベルの塔‐木村浩一
正規表現‐もう一つのバベルの塔‐木村浩一正規表現‐もう一つのバベルの塔‐木村浩一
正規表現‐もう一つのバベルの塔‐木村浩一takesako
 
Perl6 Regex Programming with Rakudo
Perl6 Regex Programming with RakudoPerl6 Regex Programming with Rakudo
Perl6 Regex Programming with Rakudotakesako
 
That Goes Without Alpha-Num (or Does It ?) all your base10 are belong to us
That Goes Without Alpha-Num (or Does It ?) all your base10 are belong to usThat Goes Without Alpha-Num (or Does It ?) all your base10 are belong to us
That Goes Without Alpha-Num (or Does It ?) all your base10 are belong to ustakesako
 
Devsumi2010 Ecmascript5 (ISO/IEC JTC1/SC22)
Devsumi2010 Ecmascript5 (ISO/IEC JTC1/SC22)Devsumi2010 Ecmascript5 (ISO/IEC JTC1/SC22)
Devsumi2010 Ecmascript5 (ISO/IEC JTC1/SC22)takesako
 
Perl x86 JIT Programming
Perl x86 JIT ProgrammingPerl x86 JIT Programming
Perl x86 JIT Programmingtakesako
 
YAPC::Asia 2008 Closing Ceremony
YAPC::Asia 2008 Closing CeremonyYAPC::Asia 2008 Closing Ceremony
YAPC::Asia 2008 Closing Ceremonytakesako
 
HTML Binary Hacks & GIF89a Ployglot
HTML Binary Hacks & GIF89a PloyglotHTML Binary Hacks & GIF89a Ployglot
HTML Binary Hacks & GIF89a Ployglottakesako
 
Devsumi2008 - YAPC::Asia 2008 Tokyo
Devsumi2008 - YAPC::Asia 2008 TokyoDevsumi2008 - YAPC::Asia 2008 Tokyo
Devsumi2008 - YAPC::Asia 2008 Tokyotakesako
 
GIF89a Oldtype
GIF89a OldtypeGIF89a Oldtype
GIF89a Oldtypetakesako
 
Shibuyajs Digest
Shibuyajs DigestShibuyajs Digest
Shibuyajs Digesttakesako
 
HTML2.0 - digg - OSC2007-fall
HTML2.0 - digg - OSC2007-fallHTML2.0 - digg - OSC2007-fall
HTML2.0 - digg - OSC2007-falltakesako
 
Shibuya.pm#8 - ImageFight - HTML 2.0 New Browser Detection
Shibuya.pm#8 - ImageFight - HTML 2.0 New Browser DetectionShibuya.pm#8 - ImageFight - HTML 2.0 New Browser Detection
Shibuya.pm#8 - ImageFight - HTML 2.0 New Browser Detectiontakesako
 
Shibuyajs24 JavaScript.GIF x LiveConnect
Shibuyajs24 JavaScript.GIF x LiveConnectShibuyajs24 JavaScript.GIF x LiveConnect
Shibuyajs24 JavaScript.GIF x LiveConnecttakesako
 

Mais de takesako (19)

SECCON CTF セキュリティ競技会コンテスト開催について
SECCON CTF セキュリティ競技会コンテスト開催についてSECCON CTF セキュリティ競技会コンテスト開催について
SECCON CTF セキュリティ競技会コンテスト開催について
 
Acme minechan
Acme minechanAcme minechan
Acme minechan
 
Acme::MineChan LT demo
Acme::MineChan LT demoAcme::MineChan LT demo
Acme::MineChan LT demo
 
Node.js - JavaScript Thread Programming
Node.js - JavaScript Thread ProgrammingNode.js - JavaScript Thread Programming
Node.js - JavaScript Thread Programming
 
Node.js - sleep sort algorithm
Node.js - sleep sort algorithmNode.js - sleep sort algorithm
Node.js - sleep sort algorithm
 
x86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNTx86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNT
 
正規表現‐もう一つのバベルの塔‐木村浩一
正規表現‐もう一つのバベルの塔‐木村浩一正規表現‐もう一つのバベルの塔‐木村浩一
正規表現‐もう一つのバベルの塔‐木村浩一
 
Perl6 Regex Programming with Rakudo
Perl6 Regex Programming with RakudoPerl6 Regex Programming with Rakudo
Perl6 Regex Programming with Rakudo
 
That Goes Without Alpha-Num (or Does It ?) all your base10 are belong to us
That Goes Without Alpha-Num (or Does It ?) all your base10 are belong to usThat Goes Without Alpha-Num (or Does It ?) all your base10 are belong to us
That Goes Without Alpha-Num (or Does It ?) all your base10 are belong to us
 
Devsumi2010 Ecmascript5 (ISO/IEC JTC1/SC22)
Devsumi2010 Ecmascript5 (ISO/IEC JTC1/SC22)Devsumi2010 Ecmascript5 (ISO/IEC JTC1/SC22)
Devsumi2010 Ecmascript5 (ISO/IEC JTC1/SC22)
 
Perl x86 JIT Programming
Perl x86 JIT ProgrammingPerl x86 JIT Programming
Perl x86 JIT Programming
 
YAPC::Asia 2008 Closing Ceremony
YAPC::Asia 2008 Closing CeremonyYAPC::Asia 2008 Closing Ceremony
YAPC::Asia 2008 Closing Ceremony
 
HTML Binary Hacks & GIF89a Ployglot
HTML Binary Hacks & GIF89a PloyglotHTML Binary Hacks & GIF89a Ployglot
HTML Binary Hacks & GIF89a Ployglot
 
Devsumi2008 - YAPC::Asia 2008 Tokyo
Devsumi2008 - YAPC::Asia 2008 TokyoDevsumi2008 - YAPC::Asia 2008 Tokyo
Devsumi2008 - YAPC::Asia 2008 Tokyo
 
GIF89a Oldtype
GIF89a OldtypeGIF89a Oldtype
GIF89a Oldtype
 
Shibuyajs Digest
Shibuyajs DigestShibuyajs Digest
Shibuyajs Digest
 
HTML2.0 - digg - OSC2007-fall
HTML2.0 - digg - OSC2007-fallHTML2.0 - digg - OSC2007-fall
HTML2.0 - digg - OSC2007-fall
 
Shibuya.pm#8 - ImageFight - HTML 2.0 New Browser Detection
Shibuya.pm#8 - ImageFight - HTML 2.0 New Browser DetectionShibuya.pm#8 - ImageFight - HTML 2.0 New Browser Detection
Shibuya.pm#8 - ImageFight - HTML 2.0 New Browser Detection
 
Shibuyajs24 JavaScript.GIF x LiveConnect
Shibuyajs24 JavaScript.GIF x LiveConnectShibuyajs24 JavaScript.GIF x LiveConnect
Shibuyajs24 JavaScript.GIF x LiveConnect
 

Último

TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 

Último (8)

TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 

再帰的 正規表現JSON Validator

  • 1. 再帰的 正規表現JSON Validator サイボウズ・ラボ株式会社竹迫 良範<takesako@shibuya.pm.org>
  • 2.
  • 4. 再帰的正規表現でJSON Validatorを作ってみた PCREの記法(?R)(?0)(?1)を使うテクニック $json =~ / ( * (?: "(?:[^"]*|["bfnrt]|u[0-9A-Fa-f]{4})*" | -? (?= [1-9]|0(?!) ) + (?:+)? (?:[eE] [+-]? +)? | true | false | null | (?: (?1) (?: , (?1) )* )? * | (?: *"(?:[^"]*|["bfnrt]|u[0-9A-Fa-f]{4})*"*:(?1) (?:,*"(?:[^"]*|["bfnrt]|u[0-9A-Fa-f]{4})*"*:(?1) )*)? * ) * ) /sx ;
  • 6. JSONとは JavaScript Object Notation JavaScriptの記法を元にしたデータ記述用言語 元々はJavaScriptのサブセットとして考案 varobj = eval( "(" + json_text + ")" ); JSON文字列を evalすると JavaScript object になる [ { "id" : 1001 , "name" : "foo" }, { "id" : 1002 , "name" : "bar" } ]
  • 7. JavaScript で受け取った JSON を evalすると… そのまま evalするのは大変危険 「山田太郎(正常系)」 { "name" : "山田太郎=> (正常系" } 「山田 ”}),alert(24)//XSS」 { "name" : "山田"}),alert(24)//太郎" } varjson_text = ( { "name" : " 山田"}, alert(24);//XSS " } ); varobj = eval("(" + json_text + ")");
  • 8. CVE-2007-3227:JSON における XSS 脆弱性 #to_jsonのHTMLエスケープ漏れでXSSが発生 http://dev.rubyonrails.org/ticket/8371
  • 9. JSONの規格(データ交換フォーマット) RFC4627 による定義 The application/json Media Type forJavaScript Object Notation (JSON) ECMA-262 による定義 ECMA-262 ECMAScript言語仕様 5th edition 15.12 The JSON object [PDF] ISO/IEC 16262:2011 他のプログラミング言語の JSON parser PHP, Python, Java, Perl, C/C++... http://json.org/
  • 10. JSON の構成要素 JSON string JSON number JSON array JSON object JSON value 特別な値3つ true false null
  • 11. JSON string の定義 例: "abc", "", "あ", "3042" A string is a collection of zero or more Unicode characters, wrapped in double quotes, using backslash escapes. A character is represented as a single character string.
  • 12. JSON number の定義 例: 0, 1, -2, 3.14, 9e3, 9000 A number is very much like a C or Java number, except that the octal and hexadecimal formats are not used.
  • 13. JSON array の定義 例:["a", "b", "c"] An array is an ordered collection of values. An array begins with [ (left bracket) and ends with ] (right bracket). Values are separated by , (comma).
  • 14. JSON object の定義 例:{"string": value, "key": value} An object is an unordered set of name/value pairs. An object begins with { (left brace) and ends with } (right brace). Each name is followed by : (colon) and the name/value pairs are separated by , (comma).
  • 15. JSON value の定義 例:"abc", 123, {}, [], true, false, null A value can be a string in double quotes, or a number, or true or false or null, or an object or an array. These structures can be nested. [ [], [1, 2], ["a", "b"], {}, {"x": {"y": "z"}} ]
  • 17. Q. 以下の JSON は正しいフォーマットか? (1) JSON object のキーは "string" { apple: 1, beer: 2 } { "apple": 1, "beer": 2 }
  • 18. Q. 以下の JSON は正しいフォーマットか? (2) 複数 value のカンマ区切り(最後) { "name" : "TAKESAKO, Yoshinori", "E-mail" : "takesako@labs.cybozu.co.jp", } { "name" : "TAKESAKO, Yoshinori", "E-mail" : "takesako@labs.cybozu.co.jp" }
  • 19. Q. 以下の JSON は正しいフォーマットか? (3) JSON string の引用符は "" のみ [ 0, 1, 2, 'abc', 'string' ] [ 0, 1, 2, "abc", "string" ]
  • 20. Q. 以下の JSON は正しいフォーマットか? (4) JSON number の符号に + はない [ -3, 3.14, 1.23e2, +123.456 ] [ -3, 3.14, 1.23e2, 123.456 ]
  • 21. Q. 以下の JSON は正しいフォーマットか? (5) JavaScript comment は使用できない [{ /* Bookmark */ "url": "http://cybozu.co.jp/", "memo": "Cybozu HP" // title }] [{ "url": "http://cybozu.co.jp/", "memo": "Cybozu HP" }]
  • 22. Q. 以下の JSON は正しいフォーマットか? (6) JSON number は10進数のみ [ { "file": "a.out", "chmod": 0775 }, { "file": "a.cpp", "chmod": 0644 } ] [ { "file": "a.out", "chmod": 509 }, { "file": "a.cpp", "chmod": 420 } ]
  • 23. Q. 以下の JSON は正しいフォーマットか? (7) string number 以外の JSON value [ "Boolean", True, False, Null ] [ "Boolean", true, false, null ]
  • 24. Q. 以下の JSON は正しいフォーマットか? (8) Unicode 文字の扱い { "a": "aあA", "i": "i3044I" } { "a":"a3042A", "i":"i3044I" }
  • 25. Q. 以下の JSON は正しいフォーマットか? (9) /のエスケープ "<script src='/jquery.js'></script>" "<script src='/jquery.js'><script>"
  • 26.
  • 28. Perl で PCRE 拡張の記法を使う (?(DEFINE) (?<foo> regexp1) (?<bar> regexp2) … ) (?&foo) (?&bar) $json =~ / (?(DEFINE) (?<string> (?:[^"]* | ["bfnrt] | u[0-9A-Fa-f]{4} )* " ) (?<number> -? (?=[1-9]|0(?!))+(?:+)? (?:[eE] [+-]? +)? ) (?<boolean> true | false | null ) (?<array> (?: (?&json) (?: , (?&json) )* )? * ) (?<pair> * (?&string) * : (?&json) ) (?<object> (?: (?&pair) (?: , (?&pair) )* )? * ) (?<json> * (?: (?&number) | (?&boolean) | (?&string) | (?&array) | (?&object) ) * ) ) (?&json) /sx;
  • 30. 自分自身の正規表現にマッチ (?R) PCREの記法(?R)がPerlでも使える! “{{{}}}” にマッチ “xxxx{{{}}}}}}}zzzzzz” にもマッチ 以下の正規表現だとネストしてくれない… /(?R)*/ /^ (?R)* $/
  • 32. JSON Validator を作ってみる PCREの記法(?1)を使うテクニック $json =~ / ( * (?: "(?:[^"]*|["bfnrt]|u[0-9A-Fa-f]{4})*" | -? (?= [1-9]|0(?!) ) + (?:+)? (?:[eE] [+-]? +)? | true | false | null | (?: (?1) (?: , (?1) )* )? * | (?: *"(?:[^"]*|["bfnrt]|u[0-9A-Fa-f]{4})*"*:(?1) (?:,*"(?:[^"]*|["bfnrt]|u[0-9A-Fa-f]{4})*"*:(?1) )* )? * ) * ) /sx ;
  • 34.