SlideShare a Scribd company logo
再帰的 正規表現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 ;
再帰的 正規表現 便利也


More Related Content

Similar to 再帰的 正規表現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-20141011
Toshi 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-20141205
Toshi 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-datatype
Toshi 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
 

Similar to 再帰的 正規表現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対応)
 

More from takesako

SECCON CTF セキュリティ競技会コンテスト開催について
SECCON CTF セキュリティ競技会コンテスト開催についてSECCON CTF セキュリティ競技会コンテスト開催について
SECCON CTF セキュリティ競技会コンテスト開催について
takesako
 
Acme minechan
Acme minechanAcme minechan
Acme minechan
takesako
 
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 algorithm
takesako
 
x86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNTx86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNT
takesako
 
正規表現‐もう一つのバベルの塔‐木村浩一
正規表現‐もう一つのバベルの塔‐木村浩一正規表現‐もう一つのバベルの塔‐木村浩一
正規表現‐もう一つのバベルの塔‐木村浩一takesako
 
Perl6 Regex Programming with Rakudo
Perl6 Regex Programming with RakudoPerl6 Regex Programming with Rakudo
Perl6 Regex Programming with Rakudo
takesako
 
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
takesako
 
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 Programming
takesako
 
YAPC::Asia 2008 Closing Ceremony
YAPC::Asia 2008 Closing CeremonyYAPC::Asia 2008 Closing Ceremony
YAPC::Asia 2008 Closing Ceremony
takesako
 
HTML Binary Hacks & GIF89a Ployglot
HTML Binary Hacks & GIF89a PloyglotHTML Binary Hacks & GIF89a Ployglot
HTML Binary Hacks & GIF89a Ployglot
takesako
 
Devsumi2008 - YAPC::Asia 2008 Tokyo
Devsumi2008 - YAPC::Asia 2008 TokyoDevsumi2008 - YAPC::Asia 2008 Tokyo
Devsumi2008 - YAPC::Asia 2008 Tokyo
takesako
 
GIF89a Oldtype
GIF89a OldtypeGIF89a Oldtype
GIF89a Oldtype
takesako
 
Shibuyajs Digest
Shibuyajs DigestShibuyajs Digest
Shibuyajs Digest
takesako
 
HTML2.0 - digg - OSC2007-fall
HTML2.0 - digg - OSC2007-fallHTML2.0 - digg - OSC2007-fall
HTML2.0 - digg - OSC2007-fall
takesako
 
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
takesako
 
Shibuyajs24 JavaScript.GIF x LiveConnect
Shibuyajs24 JavaScript.GIF x LiveConnectShibuyajs24 JavaScript.GIF x LiveConnect
Shibuyajs24 JavaScript.GIF x LiveConnect
takesako
 

More from 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
 

Recently uploaded

CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
Yuuitirou528 default
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
Matsushita Laboratory
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
Toru Tamaki
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
Fukuoka Institute of Technology
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
harmonylab
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LBカタログ
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LBカタログLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LBカタログ
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LBカタログ
CRI Japan, Inc.
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
Sony - Neural Network Libraries
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
yassun7010
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
iPride Co., Ltd.
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
NTT DATA Technology & Innovation
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance
 

Recently uploaded (15)

CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LBカタログ
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LBカタログLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LBカタログ
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LBカタログ
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.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.