migration-19.xml 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="migration.19">
  5. <title>Zend Framework 1.9</title>
  6. <para>
  7. Wenn man von einem Zend Framework Release vor 1.9.0 zu einem beliebigen 1.9 Release
  8. hochrüstet sollte man die folgenden Migrations Hinweise beachten.
  9. </para>
  10. <sect2 id="migration.19.zend.file.transfer">
  11. <title>Zend_File_Transfer</title>
  12. <sect3 id="migration.19.zend.file.transfer.mimetype">
  13. <title>MimeType Prüfung</title>
  14. <para>
  15. Aus Sicherheitsgründen haben wir den standardmäßigen Fallback Mechanismus der
  16. <classname>MimeType</classname>, <classname>ExcludeMimeType</classname>,
  17. <classname>IsCompressed</classname> und <classname>IsImage</classname> Prüfungen
  18. ausgeschaltet. Das bedeutet, wenn die <emphasis>fileInfo</emphasis> oder
  19. <emphasis>magicMime</emphasis> Erweiterungen nicht gefunden werden können, dann
  20. wird die Prüfung immer fehlschlagen.
  21. </para>
  22. <para>
  23. Wenn es notwendig ist das man für die Prüfung die <acronym>HTTP</acronym> Felder
  24. verwendet welche vom Benutzer geschickt werden, dann kann man dieses Feature
  25. einschalten indem die <methodname>enableHeaderCheck()</methodname> Methode
  26. verwendet wird.
  27. </para>
  28. <note>
  29. <title>Sicherheits Hinweis</title>
  30. <para>
  31. Man sollte beachten, das wenn man sich auf die <acronym>HTTP</acronym> Felder
  32. verlässt, die vom Benutzer geschickt werden, das ein Sicherheits Risiko ist.
  33. Diese können einfach geändert werden und könnten es einem Benutzer erlauben eine
  34. schädliche Datei zu schicken.
  35. </para>
  36. </note>
  37. <example id="migration.19.zend.file.transfer.example">
  38. <title>Die Verwendung der HTTP Felder erlauben</title>
  39. <programlisting language="php"><![CDATA[
  40. // Bei der Initiierung
  41. $valid = new Zend_File_Transfer_Adapter_Http(array('headerCheck' => true);
  42. // oder im Nachhinein
  43. $valid->enableHeaderCheck();
  44. ]]></programlisting>
  45. </example>
  46. </sect3>
  47. </sect2>
  48. <sect2 id="migration.19.zend.filter">
  49. <title>Zend_Filter</title>
  50. <para>
  51. Vor dem Release 1.9 erlaubte <classname>Zend_Filter</classname> die Verwendung der
  52. statischen Methode <methodname>get()</methodname>. Ab dem Release 1.9 wurde diese
  53. Methode zu <methodname>filterStatic()</methodname> umbenannt um besser zu beschreiben
  54. was Sie macht. Die alte <methodname>get()</methodname> Methode wurde als deprecated
  55. markiert.
  56. </para>
  57. </sect2>
  58. <sect2 id="migration.19.zend.http.client">
  59. <title>Zend_Http_Client</title>
  60. <sect3 id="migration.19.zend.http.client.fileuploadsarray">
  61. <title>
  62. Änderungen in der internen Speicherung der Information von hochgeladenen Dateien
  63. </title>
  64. <para>
  65. In Version 1.9 vom Zend Framework gibt es eine Ändernug wie
  66. <classname>Zend_Http_Client</classname> Informationen über hochgeladenen Dateien
  67. intern speichert, bei denen die
  68. <methodname>Zend_Http_Client::setFileUpload()</methodname> Methode verwendet wird.
  69. </para>
  70. <para>
  71. Diese Änderung wurde durchgeführt um es zu erlauben mehrere Dateien mit dem
  72. gleichen Formularnamen, als Array von Dateien, hochzuladen. Weitere Informationen
  73. über dieses Problem können in <ulink
  74. url="http://framework.zend.com/issues/browse/ZF-5744">diesem
  75. Fehlerreport</ulink> gefunden werden.
  76. </para>
  77. <example id="migration.19.zend.http.client.fileuploadsarray.example">
  78. <title>Interne Speicherung der Informationen von hochgeladenen Dateien</title>
  79. <programlisting language="php"><![CDATA[
  80. // Zwei Dateien mit dem gleichen Namen des Formularelements als Array hochladen
  81. $client = new Zend_Http_Client();
  82. $client->setFileUpload('file1.txt',
  83. 'userfile[]',
  84. 'some raw data',
  85. 'text/plain');
  86. $client->setFileUpload('file2.txt',
  87. 'userfile[]',
  88. 'some other data',
  89. 'application/octet-stream');
  90. // In Zend Framework 1.8 oder älter, ist der Wert der geschützten
  91. // Variable $client->files:
  92. // $client->files = array(
  93. // 'userfile[]' => array('file2.txt',
  94. 'application/octet-stream',
  95. 'some other data')
  96. // );
  97. // In Zend Framework 1.9 oder neuer, ist der Wert von $client->files:
  98. // $client->files = array(
  99. // array(
  100. // 'formname' => 'userfile[]',
  101. // 'filename' => 'file1.txt,
  102. // 'ctype' => 'text/plain',
  103. // 'data' => 'some raw data'
  104. // ),
  105. // array(
  106. // 'formname' => 'userfile[]',
  107. // 'filename' => 'file2.txt',
  108. // 'formname' => 'application/octet-stream',
  109. // 'formname' => 'some other data'
  110. // )
  111. // );
  112. ]]></programlisting>
  113. </example>
  114. <para>
  115. Wie man sieht gestattet diese Änderung die Verwendung des gleichen Namens für das
  116. Formularelement mit mehr als einer Datei - trotzdem führt dies zu einer subtilen
  117. Änderung der Rückwärtskompatibilität und sollte erwähnt werden.
  118. </para>
  119. </sect3>
  120. <sect3 id="migration.19.zend.http.client.getparamsrecursize">
  121. <title>
  122. Zend_Http_Client::_getParametersRecursive() sollte nicht mehr eingesetzt werden
  123. </title>
  124. <para>
  125. Beginnend mit Version 1.9, wird die geschützte Methode
  126. <methodname>_getParametersRecursive()</methodname> nicht mehr von
  127. <classname>Zend_Http_Client</classname> verwendet und ist abgelehnt (deprecated).
  128. Ihre Verwendung führt zu einer <constant>E_NOTICE</constant> Nachricht die von
  129. <acronym>PHP</acronym> kommt.
  130. </para>
  131. <para>
  132. Wenn man <classname>Zend_Http_Client</classname> erweitert und diese Methode
  133. aufrufr, sollte man sehen das man stattdessen die statische Methode
  134. <methodname>Zend_Http_Client::_flattenParametersArray()</methodname> verwendet.
  135. </para>
  136. <para>
  137. Nochmals, da <methodname>_getParametersRecursive()</methodname> eine geschützte
  138. Methode ist, sind nur Benutzer betroffen die <classname>Zend_Http_Client</classname>
  139. erweitert haben.
  140. </para>
  141. </sect3>
  142. </sect2>
  143. <sect2 id="migration.19.zend.locale">
  144. <title>Zend_Locale</title>
  145. <sect3 id="migration.19.zend.locale.deprecated">
  146. <title>Abgelaufene Methoden</title>
  147. <para>
  148. Einige spezialisiertere Übersetzungsmethoden stehen nicht mehr zur Verfügung weil
  149. Sie bestehende Verhaltensweisen duplizieren. Beachten Sie das die alten Methoden
  150. weiterhin funktionieren, aber eine Benutzer Notiz geworfen wird, die den neuen
  151. Aufruf beschreibt. Diese Methoden werden mit 2.0 entfernt. Die folgende Liste zeigt
  152. die alten und neuen Methodenaufrufe.
  153. </para>
  154. <table id="migration.19.zend.locale.deprecated.table-1">
  155. <title>List der Methodenaufrufe</title>
  156. <tgroup cols="2">
  157. <thead>
  158. <row>
  159. <entry>Alter Aufruf</entry>
  160. <entry>Neuer Aufruf</entry>
  161. </row>
  162. </thead>
  163. <tbody>
  164. <row>
  165. <entry>
  166. <methodname>getLanguageTranslationList($locale)</methodname>
  167. </entry>
  168. <entry>
  169. <methodname>getTranslationList('language', $locale)</methodname>
  170. </entry>
  171. </row>
  172. <row>
  173. <entry>
  174. <methodname>getScriptTranslationList($locale)</methodname>
  175. </entry>
  176. <entry>
  177. <methodname>getTranslationList('script', $locale)</methodname>
  178. </entry>
  179. </row>
  180. <row>
  181. <entry>
  182. <methodname>getCountryTranslationList($locale)</methodname>
  183. </entry>
  184. <entry>
  185. <methodname>getTranslationList('territory', $locale, 2)</methodname>
  186. </entry>
  187. </row>
  188. <row>
  189. <entry>
  190. <methodname>getTerritoryTranslationList($locale)</methodname>
  191. </entry>
  192. <entry>
  193. <methodname>getTranslationList('territory', $locale, 1)</methodname>
  194. </entry>
  195. </row>
  196. <row>
  197. <entry>
  198. <methodname>getLanguageTranslation($value, $locale)</methodname>
  199. </entry>
  200. <entry>
  201. <methodname>getTranslation($value, 'language', $locale)</methodname>
  202. </entry>
  203. </row>
  204. <row>
  205. <entry>
  206. <methodname>getScriptTranslation($value, $locale)</methodname>
  207. </entry>
  208. <entry>
  209. <methodname>getTranslation($value, 'script', $locale)</methodname>
  210. </entry>
  211. </row>
  212. <row>
  213. <entry>
  214. <methodname>getCountryTranslation($value, $locale)</methodname>
  215. </entry>
  216. <entry>
  217. <methodname>getTranslation($value, 'country', $locale)</methodname>
  218. </entry>
  219. </row>
  220. <row>
  221. <entry>
  222. <methodname>getTerritoryTranslation($value, $locale)</methodname>
  223. </entry>
  224. <entry>
  225. <methodname>getTranslation($value, 'territory',
  226. $locale)</methodname>
  227. </entry>
  228. </row>
  229. </tbody>
  230. </tgroup>
  231. </table>
  232. </sect3>
  233. </sect2>
  234. <sect2 id="migration.19.zend.view.helper.navigation">
  235. <title>Zend_View_Helper_Navigation</title>
  236. <para>
  237. Vor dem Release 1.9 hat der Menü Helfer
  238. (<classname>Zend_View_Helper_Navigation_Menu</classname>) Untermenüs nicht richtig
  239. dargestellt. Wenn <property>onlyActiveBranch</property> <constant>TRUE</constant> war
  240. und die Option <property>renderParents</property> <constant>FALSE</constant> wurde
  241. nichts dargestellt wenn die tiefste aktive Seite auf einer geringeren Tiele als die
  242. <property>minDepth</property> Option war.
  243. </para>
  244. <para>
  245. In einfacheren Worten; Wenn <property>minDepth</property> auf '1' gesetzt war und
  246. die aktive Seite eine der Seiten am Anfangs-Level, wurde nichts dargestellt wie das
  247. folgende Beispiel zeigt.
  248. </para>
  249. <para>
  250. Das folgende Container Setup wird angenommen:
  251. </para>
  252. <programlisting language="php"><![CDATA[
  253. <?php
  254. $container = new Zend_Navigation(array(
  255. array(
  256. 'label' => 'Home',
  257. 'uri' => '#'
  258. ),
  259. array(
  260. 'label' => 'Products',
  261. 'uri' => '#',
  262. 'active' => true,
  263. 'pages' => array(
  264. array(
  265. 'label' => 'Server',
  266. 'uri' => '#'
  267. ),
  268. array(
  269. 'label' => 'Studio',
  270. 'uri' => '#'
  271. )
  272. )
  273. ),
  274. array(
  275. 'label' => 'Solutions',
  276. 'uri' => '#'
  277. )
  278. ));
  279. ]]></programlisting>
  280. <para>
  281. Der folgende Code wird in einem View Script verwendet:
  282. </para>
  283. <programlisting language="php"><![CDATA[
  284. <?php echo $this->navigation()->menu()->renderMenu($container, array(
  285. 'minDepth' => 1,
  286. 'onlyActiveBranch' => true,
  287. 'renderParents' => false
  288. )); ?>
  289. ]]></programlisting>
  290. <para>
  291. Vor dem Release 1.9 würde der obige Codeabschnitt nichts ausgeben.
  292. </para>
  293. <para>
  294. Seit dem Release 1.9 akzeptiert die <methodname>_renderDeepestMenu()</methodname>
  295. Methode in <classname>Zend_View_Helper_Navigation_Menu</classname> aktive Seiten die ein
  296. Level unter <property>minDepth</property> sind, solange diese Seite Kinder hat.
  297. </para>
  298. <para>
  299. Der gleiche Codeabschnitt zeigt jetzt die folgende Ausgabe:
  300. </para>
  301. <programlisting language="html"><![CDATA[
  302. <ul class="navigation">
  303. <li>
  304. <a href="#">Server</a>
  305. </li>
  306. <li>
  307. <a href="#">Studio</a>
  308. </li>
  309. </ul>
  310. ]]></programlisting>
  311. </sect2>
  312. <sect2 id="migration.19.security">
  313. <title>Sicherheitsfixes ab 1.9.7</title>
  314. <para>
  315. Zusätzlich können Benutzer der Serie 1.9 von anderen Änderungen beginnend in Version
  316. 1.9.7 betroffen sein. Das sind alles Sicherheitsbehebungen welche auch potentiell
  317. Probleme mit Rückwärtskompatibilität haben können.
  318. </para>
  319. <sect3 id="migration.19.security.zend.dojo.editor">
  320. <title>Zend_Dojo_View_Helper_Editor</title>
  321. <para>
  322. Eine kleine Änderung wurde in der Serie 1.9 gemacht um die Standardverwendung des
  323. dijit Editors zu modifizieren um <acronym>div</acronym> Tags statt einem
  324. <acronym>textarea</acronym> Tag zu verwenden; die letztere Verwendung bringt <ulink
  325. url="http://api.dojotoolkit.org/jsdoc/HEAD/dijit._editor.RichText">Sicherheits
  326. Probleme</ulink> mit sich, und die Verwendung von <acronym>div</acronym> Tags
  327. wird vom Dojo Projekt empfohlen.
  328. </para>
  329. <para>
  330. Um trotzdem eine erfolgreiche Degration zu erlauben, wurde dem View Helper eine neue
  331. Option <varname>degrade</varname> hinzugefügt; diese erlaubt es Entwicklern statt
  332. dessen optional ein <acronym>textarea</acronym> zu verwenden. Trotzdem öffnet dies
  333. Anwendungen die damit entwickelt wurden <acronym>XSS</acronym> Vektoren. In 1.9.7
  334. wurde diese Option entfernt. Die erfolgreiche Degration wird trotzdem, über das
  335. <acronym>noscript</acronym> Tag unterstützt welches eine <acronym>textarea</acronym>
  336. enthält. Diese Lösung adressiert Sicherheitsbedenken.
  337. </para>
  338. <para>
  339. Die Folgerung ist, das wenn man das <varname>degrade</varname> Flag verwendet,
  340. dieses ab diesem Zeitpunkt einfach ignoriert wird.
  341. </para>
  342. </sect3>
  343. <sect3 id="migration.19.security.zend.filter.html-entities">
  344. <title>Zend_Filter_HtmlEntities</title>
  345. <para>
  346. Um zu einem höheren Sicherheitsstandard für die Zeichenkodierung zu kommen, ist der
  347. Standardwert von <classname>Zend_Filter_HtmlEntities</classname> jetzt
  348. <acronym>UTF-8</acronym> statt <acronym>ISO-8859-1</acronym>.
  349. </para>
  350. <para>
  351. Zusätzlich, weil der aktuelle Mechanismus mit Zeichenkodierung handelt und nicht mit
  352. Zeichensets, wurden zwei Methoden hinzugefügt.
  353. <methodname>setEncoding()</methodname> und <methodname>getEncoding()</methodname>.
  354. Die vorhergehenden Methoden <methodname>setCharSet()</methodname> und
  355. <methodname>setCharSet()</methodname> sind jetzt deprecated und verweisen auf die
  356. neuen Methoden. Letztendlich, statt die geschützten Mitglieder in der
  357. <methodname>filter()</methodname> Methode direkt zu verwenden, werden Sie durch Ihre
  358. expliziten Zugriffsmethoden empfangen. Wenn man den Filter in der Vergangenheit
  359. erweitert hat, sollte man seinen Code und seine Unittests prüfen um sicherzustellen
  360. das weiterhin alles funktioniert.
  361. </para>
  362. </sect3>
  363. <sect3 id="migration.19.security.zend.filter.strip-tags">
  364. <title>Zend_Filter_StripTags</title>
  365. <para>
  366. <classname>Zend_Filter_StripTags</classname> enthielt in voehergehenden Versionen
  367. ein <varname>commentsAllowed</varname> Flag, welches es erlaubt hat
  368. <acronym>HTML</acronym> Kommentare in von dieser Klasse gefiltertem
  369. <acronym>HTML</acronym> Text als erlaubt zu markieren. Aber das öffnet den Weg für
  370. <acronym>XSS</acronym> Attacken, speziell im Internet Explorer (der es erlaubt
  371. konditionelle Funktionalität über <acronym>HTML</acronym> Kommentare zu
  372. spezifizieren). Beginnend mit Version 1.9.7 (und retour mit den Versionen 1.8.5 und
  373. 1.7.9), hat das <varname>commentsAllowed</varname> Flag keine Bedeutung meht, und
  374. alle <acronym>HTML</acronym> Kommentare, inklusive denen die andere
  375. <acronym>HTML</acronym> Tags oder untergeordnete Kommentare enthalten, werden von
  376. der endgültigen Aufgabe des Filters entfernt.
  377. </para>
  378. </sect3>
  379. </sect2>
  380. </sect1>