Advertisement
Guest User

Untitled

a guest
Apr 18th, 2016
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.80 KB | None | 0 0
  1. 題名: ```Zend_Validate_Hostnameクラスで .com, .biz, .cn ドメインのホスト名がエラーになる```
  2.  
  3. 説明:
  4. ```
  5. h3. Overview (現象)
  6.  
  7. Zend_Validate_Hostname を使用する機能で .com, .biz, .cn ドメインのホスト名または URL がエラーになる。
  8.  
  9. 具体的には、下記の機能で問題が発生する。
  10.  
  11. * OpenPNE.yml の @mail_smtp_host@
  12. ** 例: @smtp.gmail.com@ を使用したメール送信が行えない<pre><code class="yaml">
  13. mail_smtp_host: "smtp.gmail.com"
  14. mail_smtp_config:
  15. auth: "login"
  16. username: "*****@gmail.com"
  17. password: “*****”
  18. ssl: "tls"
  19. port: 587
  20. </code></pre>
  21. ** 発生するエラーの例: {{collapse(詳細を表示...)
  22. <pre>
  23. $ ./symfony openpne:send-daily-news --app=pc_frontend --trace
  24.  
  25.  
  26. [Zend_Validate_Exception]
  27. Internal error: DNS validation failed
  28.  
  29.  
  30. Exception trace:
  31. at /home/upsilon/git/openpne3/v3.6/lib/vendor/Zend/Validate/Hostname.php:365
  32. Zend_Validate_Hostname->isValid at /home/upsilon/git/openpne3/v3.6/lib/vendor/Zend/Validate.php:94
  33. Zend_Validate->isValid at /home/upsilon/git/openpne3/v3.6/lib/vendor/Zend/Mail/Protocol/Abstract.php:133
  34. Zend_Mail_Protocol_Abstract->__construct at /home/upsilon/git/openpne3/v3.6/lib/vendor/Zend/Mail/Protocol/Smtp.php:156
  35. Zend_Mail_Protocol_Smtp->__construct at /home/upsilon/git/openpne3/v3.6/lib/vendor/Zend/Mail/Protocol/Smtp/Auth/Login.php:76
  36. Zend_Mail_Protocol_Smtp_Auth_Login->__construct at /home/upsilon/git/openpne3/v3.6/lib/vendor/Zend/Mail/Transport/Smtp.php:196
  37. Zend_Mail_Transport_Smtp->_sendMail at /home/upsilon/git/openpne3/v3.6/lib/vendor/Zend/Mail/Transport/Abstract.php:348
  38. Zend_Mail_Transport_Abstract->send at /home/upsilon/git/openpne3/v3.6/lib/vendor/Zend/Mail.php:936
  39. Zend_Mail->send at /home/upsilon/git/openpne3/v3.6/lib/util/opMailSend.class.php:218
  40. opMailSend::execute at /home/upsilon/git/openpne3/v3.6/lib/util/opMailSend.class.php:156
  41. opMailSend::sendTemplateMail at /home/upsilon/git/openpne3/v3.6/lib/task/openpneSendDailyNewsTask.class.php:112
  42. openpneSendDailyNewsTask->sendDailyNews at /home/upsilon/git/openpne3/v3.6/lib/task/openpneSendDailyNewsTask.class.php:43
  43. openpneSendDailyNewsTask->execute at /home/upsilon/git/openpne3/v3.6/lib/vendor/symfony/lib/task/sfBaseTask.class.php:68
  44. sfBaseTask->doRun at /home/upsilon/git/openpne3/v3.6/lib/vendor/symfony/lib/task/sfTask.class.php:97
  45. sfTask->runFromCLI at /home/upsilon/git/openpne3/v3.6/lib/vendor/symfony/lib/command/sfSymfonyCommandApplication.class.php:76
  46. sfSymfonyCommandApplication->run at /home/upsilon/git/openpne3/v3.6/lib/vendor/symfony/lib/command/cli.php:20
  47. include at /home/upsilon/git/openpne3/v3.6/symfony:14
  48. </pre>
  49. }}
  50. * opOpenSocialPlugin のアプリ追加
  51. ** 例: 管理画面の「アプリ追加」(/pc_backend_dev.php/opOpenSocialPlugin/add) で @Gadget XML URL@ に @gist.github.com@ などのドメインの URL を指定するとエラーになる
  52.  
  53. この不具合は OpenPNE *3.4.x* および *3.6.x* のみで発生する。
  54.  
  55. h3. Causes (原因)
  56.  
  57. #205 で起きた問題の修正のために、@Zend_Validate_Hostname@ に対して @3.7.0@ 以降とそれ以前で異なる修正が行われた。
  58. この修正により OpenPNE 3.6.x には commit:fbdbb216 の修正が行われたが、「最新の安定版で配布されている Zend/Validate/Hostname/*.php とほぼ近い挙動になるようなクラスファイル」が正しく機能しなかったため今回の不具合が起きた。
  59.  
  60. #205-6 より引用:
  61. > 次の方針で実装します。
  62. >
  63. > * OpenPNE 3.7.0 : 同梱する ZendFramework の最新の安定版にアップデートします
  64. > * OpenPNE 3.6 以前 : ZendFramework の最新の安定版に存在する Zend/Validate/Hostname/*.php に対応するファイルが同梱している ZendFramework に存在していなければ、最新の安定版で配布されている Zend/Validate/Hostname/*.php とほぼ近い挙動になるようなクラスファイルを追加するという暫定的な対処をおこないます
  65.  
  66. h4. *.biz, *.cn ドメインの場合に発生するエラー
  67.  
  68. <pre>
  69. PHP Warning: preg_match(): Compilation failed: regular expression is too large at offset 156194 in /home/upsilon/git/openpne3/v3.6/lib/vendor/Zend/Validate/Hostname.php on line 358
  70. </pre>
  71.  
  72. source:lib/vendor/Zend/Validate/Hostname/Biz.php@fbdbb216 のパターンは 207,460 文字、 source:lib/vendor/Zend/Validate/Hostname/Cn.php@fbdbb216 のパターンは 156,176 文字と非常に巨大な正規表現パターンとなっており、このことがエラーの原因であると考えられる。
  73.  
  74. 3.7.0 以降に対して修正された source:lib/vendor/Zend/Validate/Hostname/Biz.php@821abff4 は複数に分割された正規表現パターンを使用してドメイン名をチェックしているため今回のような問題は発生していない。
  75.  
  76. h4. *.com ドメインの場合に発生するエラー
  77.  
  78. <pre>
  79. PHP Warning: preg_match(): Compilation failed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 9800 in /home/upsilon/git/openpne3/v3.6/lib/vendor/Zend/Validate/Hostname.php on line 358
  80. </pre>
  81.  
  82. コードポイント U+D800 から U+DFFF までの範囲は Unicode のサロゲートペアの high surrogates および low surrogates のために確保された領域であり、これらの領域では 2 つの符号単位で 1 文字として扱うためいずれか単体で正規表現パターンにマッチすることはない。
  83. 例えば「🍣」という文字は U+D83C U+DF63 の組で 1 文字として扱われるため @/\x{D800}-\x{DFFF}/u@ のような正規表現パターンを用いてもマッチすることはない(サロゲートペアは U+10000 以降のコードポイントで表され、「🍣」は U+1F363 であるため @/\x{1F363}/u@ であればマッチする)
  84.  
  85. <pre>
  86. $ echo -n '🍣' | nkf -W -w16B0 | xxd
  87. 00000000: d83c df63 .<.c
  88. $ php -r "var_dump(preg_match('/\x{D800}-\x{DFFF}/u', '🍣'));"
  89. PHP Warning: preg_match(): Compilation failed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 7 in Command line code on line 1
  90.  
  91. Warning: preg_match(): Compilation failed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 7 in Command line code on line 1
  92. bool(false)
  93. $ php -r "var_dump(preg_match('/\x{1F363}/u', '🍣'));"
  94. int(1)
  95. </pre>
  96.  
  97. source:lib/vendor/Zend/Validate/Hostname/Com.php@fbdbb216 の正規表現パターンには @\x{D800}-\x{DB7F}\x{DC00}-\x{DFFF}@ が含まれており、この部分がサロゲートペアの領域に該当するため上記のエラーが発生したと考えられる。
  98. 実際にこの部分を除去すると *.com ドメインのホスト名でエラーになる現象は起きなくなった。
  99.  
  100. h3. Way to fix (修正内容)
  101.  
  102. 修正内容を記入
  103. ```
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement