Your SlideShare is downloading. ×
0
再帰的 正規表現JSON Validator<br />サイボウズ・ラボ株式会社竹迫 良範<takesako@shibuya.pm.org><br />
(?R)<br />
再帰的正規表現でJSON Validatorを作ってみた<br />PCREの記法(?R)(?0)(?1)を使うテクニック<br />$json =~ /A (<br /> s*<br /> (?:<br />"(?:[^"]*|["bfnrt...
JSONとは<br />
JSONとは<br />JavaScript Object Notation<br />JavaScriptの記法を元にしたデータ記述用言語<br />元々はJavaScriptのサブセットとして考案<br />varobj = eval(  ...
JavaScript で受け取った JSON を evalすると…<br />そのまま evalするのは大変危険<br />「山田太郎(正常系)」<br />{ "name" : "山田太郎=> (正常系" }<br />「山田  ”}),al...
CVE-2007-3227:JSON における XSS 脆弱性<br />#to_jsonのHTMLエスケープ漏れでXSSが発生<br />http://dev.rubyonrails.org/ticket/8371<br />
JSONの規格(データ交換フォーマット)<br />RFC4627 による定義<br />The application/json Media Type forJavaScript Object Notation (JSON)<br />ECM...
JSON の構成要素<br />JSON string<br />JSON number<br />JSON array<br />JSON object<br />JSON value<br />特別な値3つ<br />true<br />f...
JSON string の定義<br />例: "abc", "tn", "あ", "u3042"<br />A string is a collection of zero or more Unicode characters, wrappe...
JSON number の定義<br />例: 0, 1, -2, 3.14, 9e3, 9000<br />A number is very much like a C or Java number, except that the octa...
JSON array の定義<br />例:["a", "b", "c"]<br />An array is an ordered collection of values. An array begins with [ (left brack...
JSON object の定義<br />例:{"string": value, "key": value}<br />An object is an unordered set of name/value pairs. An object b...
JSON value の定義<br />例:"abc", 123, {}, [], true, false, null<br />A value can be a string in double quotes, or a number, or...
演習問題<br />
Q. 以下の JSON は正しいフォーマットか?<br />(1) JSON object のキーは "string"<br />{ apple: 1, beer: 2 }<br />{ "apple": 1, "beer": 2 }<br />
Q. 以下の JSON は正しいフォーマットか?<br />(2) 複数 value のカンマ区切り(最後)<br />{<br />  "name"   : "TAKESAKO, Yoshinori", <br />  "E-mail" : ...
Q. 以下の JSON は正しいフォーマットか?<br />(3) JSON string の引用符は "" のみ<br />[ 0, 1, 2, 'abc', 'string' ]<br />[ 0, 1, 2, "abc", "string...
Q. 以下の JSON は正しいフォーマットか?<br />(4) JSON number の符号に + はない<br />[ -3, 3.14, 1.23e2, +123.456 ]<br />[ -3, 3.14, 1.23e2,  123...
Q. 以下の JSON は正しいフォーマットか?<br />(5) JavaScript comment は使用できない<br />[{ /* Bookmark */<br />  "url": "http://cybozu.co.jp/",<...
Q. 以下の JSON は正しいフォーマットか?<br />(6) JSON number は10進数のみ<br />[<br />  { "file": "a.out", "chmod": 0775 },<br />  { "file": "...
Q. 以下の JSON は正しいフォーマットか?<br />(7) string number 以外の JSON value<br />[ "Boolean", True, False, Null ]<br />[ "Boolean", tru...
Q. 以下の JSON は正しいフォーマットか?<br />(8) Unicode 文字の扱い<br />{ "a": "aあA", "i": "iu3044I" }<br />{ "a":"au3042A", "i":"iu3044I" }<...
Q. 以下の JSON は正しいフォーマットか?<br />(9) /のエスケープ<br />"<script src='/jquery.js'></script>"<br />"<script src='/jquery.js'></scrip...
正規表現で<br />チェック<br />できる?<br />
Perl で PCRE 拡張の記法を使う<br />(?(DEFINE)	(?<foo> regexp1)			(?<bar> regexp2) … )<br />(?&foo) (?&bar)<br />$json =~ /<br />(?(...
これは<br />わかり<br />やすい<br />
自分自身の正規表現にマッチ (?R)<br />PCREの記法(?R)がPerlでも使える!<br />“{{{}}}” にマッチ<br />“xxxx{{{}}}}}}}zzzzzz” にもマッチ<br />以下の正規表現だとネストしてくれな...
(?R)(?0)(?1)(?2)・・・が使える!<br />任意のキャプチャ部分の再帰ができる<br />/{(?R)*}/<br />/{(?0)*}/<br />/({(?1)*})/<br />/^({(?1)*})$/<br />
JSON Validator を作ってみる<br />PCREの記法(?1)を使うテクニック<br />$json =~ /A (<br /> s*<br /> (?:<br />"(?:[^"]*|["bfnrt/]|u[0-9A-Fa-f]...
再帰的<br />正規表現<br />便利也<br />
<br />
Upcoming SlideShare
Loading in...5
×

再帰的 正規表現JSON Validator

7,108

Published on

PCREの記法(?R)(?0)(?1)を使うテクニック

Published in: Technology, Design
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
7,108
On Slideshare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
11
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

Transcript of "再帰的 正規表現JSON Validator"

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

    Clipping is a handy way to collect important slides you want to go back to later.

×