1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- EN-Revision: 21825 -->
4 <sect1 id="migration.19">
5 <title>Zend Framework 1.9</title>
8 Wenn man von einem Zend Framework Release vor 1.9.0 zu einem beliebigen 1.9 Release
9 hochrüstet sollte man die folgenden Migrations Hinweise beachten.
12 <sect2 id="migration.19.zend.file.transfer">
13 <title>Zend_File_Transfer</title>
15 <sect3 id="migration.19.zend.file.transfer.mimetype">
16 <title>MimeType Prüfung</title>
19 Aus Sicherheitsgründen haben wir den standardmäßigen Fallback Mechanismus der
20 <classname>MimeType</classname>, <classname>ExcludeMimeType</classname>,
21 <classname>IsCompressed</classname> und <classname>IsImage</classname> Prüfungen
22 ausgeschaltet. Das bedeutet, wenn die <emphasis>fileInfo</emphasis> oder
23 <emphasis>magicMime</emphasis> Erweiterungen nicht gefunden werden können, dann
24 wird die Prüfung immer fehlschlagen.
28 Wenn es notwendig ist das man für die Prüfung die <acronym>HTTP</acronym> Felder
29 verwendet welche vom Benutzer geschickt werden, dann kann man dieses Feature
30 einschalten indem die <methodname>enableHeaderCheck()</methodname> Methode
35 <title>Sicherheits Hinweis</title>
38 Man sollte beachten, das wenn man sich auf die <acronym>HTTP</acronym> Felder
39 verlässt, die vom Benutzer geschickt werden, das ein Sicherheits Risiko ist.
40 Diese können einfach geändert werden und könnten es einem Benutzer erlauben eine
41 schädliche Datei zu schicken.
45 <example id="migration.19.zend.file.transfer.example">
46 <title>Die Verwendung der HTTP Felder erlauben</title>
48 <programlisting language="php"><![CDATA[
49 // Bei der Initiierung
50 $valid = new Zend_File_Transfer_Adapter_Http(array('headerCheck' => true);
53 $valid->enableHeaderCheck();
59 <sect2 id="migration.19.zend.filter">
60 <title>Zend_Filter</title>
63 Vor dem Release 1.9 erlaubte <classname>Zend_Filter</classname> die Verwendung der
64 statischen Methode <methodname>get()</methodname>. Ab dem Release 1.9 wurde diese
65 Methode zu <methodname>filterStatic()</methodname> umbenannt um besser zu beschreiben
66 was Sie macht. Die alte <methodname>get()</methodname> Methode wurde als deprecated
71 <sect2 id="migration.19.zend.http.client">
72 <title>Zend_Http_Client</title>
74 <sect3 id="migration.19.zend.http.client.fileuploadsarray">
76 Änderungen in der internen Speicherung der Information von hochgeladenen Dateien
80 In Version 1.9 vom Zend Framework gibt es eine Ändernug wie
81 <classname>Zend_Http_Client</classname> Informationen über hochgeladenen Dateien
82 intern speichert, bei denen die
83 <methodname>Zend_Http_Client::setFileUpload()</methodname> Methode verwendet wird.
87 Diese Änderung wurde durchgeführt um es zu erlauben mehrere Dateien mit dem
88 gleichen Formularnamen, als Array von Dateien, hochzuladen. Weitere Informationen
89 über dieses Problem können in <ulink
90 url="http://framework.zend.com/issues/browse/ZF-5744">diesem
91 Fehlerreport</ulink> gefunden werden.
94 <example id="migration.19.zend.http.client.fileuploadsarray.example">
95 <title>Interne Speicherung der Informationen von hochgeladenen Dateien</title>
97 <programlisting language="php"><![CDATA[
98 // Zwei Dateien mit dem gleichen Namen des Formularelements als Array hochladen
99 $client = new Zend_Http_Client();
100 $client->setFileUpload('file1.txt',
104 $client->setFileUpload('file2.txt',
107 'application/octet-stream');
109 // In Zend Framework 1.8 oder älter, ist der Wert der geschützten
110 // Variable $client->files:
111 // $client->files = array(
112 // 'userfile[]' => array('file2.txt',
113 'application/octet-stream',
117 // In Zend Framework 1.9 oder neuer, ist der Wert von $client->files:
118 // $client->files = array(
120 // 'formname' => 'userfile[]',
121 // 'filename' => 'file1.txt,
122 // 'ctype' => 'text/plain',
123 // 'data' => 'some raw data'
126 // 'formname' => 'userfile[]',
127 // 'filename' => 'file2.txt',
128 // 'formname' => 'application/octet-stream',
129 // 'formname' => 'some other data'
136 Wie man sieht gestattet diese Änderung die Verwendung des gleichen Namens für das
137 Formularelement mit mehr als einer Datei - trotzdem führt dies zu einer subtilen
138 Änderung der Rückwärtskompatibilität und sollte erwähnt werden.
142 <sect3 id="migration.19.zend.http.client.getparamsrecursize">
144 Zend_Http_Client::_getParametersRecursive() sollte nicht mehr eingesetzt werden
148 Beginnend mit Version 1.9, wird die geschützte Methode
149 <methodname>_getParametersRecursive()</methodname> nicht mehr von
150 <classname>Zend_Http_Client</classname> verwendet und ist abgelehnt (deprecated).
151 Ihre Verwendung führt zu einer <constant>E_NOTICE</constant> Nachricht die von
152 <acronym>PHP</acronym> kommt.
156 Wenn man <classname>Zend_Http_Client</classname> erweitert und diese Methode
157 aufrufr, sollte man sehen das man stattdessen die statische Methode
158 <methodname>Zend_Http_Client::_flattenParametersArray()</methodname> verwendet.
162 Nochmals, da <methodname>_getParametersRecursive()</methodname> eine geschützte
163 Methode ist, sind nur Benutzer betroffen die <classname>Zend_Http_Client</classname>
169 <sect2 id="migration.19.zend.locale">
170 <title>Zend_Locale</title>
172 <sect3 id="migration.19.zend.locale.deprecated">
173 <title>Abgelaufene Methoden</title>
176 Einige spezialisiertere Übersetzungsmethoden stehen nicht mehr zur Verfügung weil
177 Sie bestehende Verhaltensweisen duplizieren. Beachten Sie das die alten Methoden
178 weiterhin funktionieren, aber eine Benutzer Notiz geworfen wird, die den neuen
179 Aufruf beschreibt. Diese Methoden werden mit 2.0 entfernt. Die folgende Liste zeigt
180 die alten und neuen Methodenaufrufe.
183 <table id="migration.19.zend.locale.deprecated.table-1">
184 <title>List der Methodenaufrufe</title>
189 <entry>Alter Aufruf</entry>
190 <entry>Neuer Aufruf</entry>
197 <methodname>getLanguageTranslationList($locale)</methodname>
201 <methodname>getTranslationList('language', $locale)</methodname>
207 <methodname>getScriptTranslationList($locale)</methodname>
211 <methodname>getTranslationList('script', $locale)</methodname>
217 <methodname>getCountryTranslationList($locale)</methodname>
221 <methodname>getTranslationList('territory', $locale, 2)</methodname>
227 <methodname>getTerritoryTranslationList($locale)</methodname>
231 <methodname>getTranslationList('territory', $locale, 1)</methodname>
237 <methodname>getLanguageTranslation($value, $locale)</methodname>
241 <methodname>getTranslation($value, 'language', $locale)</methodname>
247 <methodname>getScriptTranslation($value, $locale)</methodname>
251 <methodname>getTranslation($value, 'script', $locale)</methodname>
257 <methodname>getCountryTranslation($value, $locale)</methodname>
261 <methodname>getTranslation($value, 'country', $locale)</methodname>
267 <methodname>getTerritoryTranslation($value, $locale)</methodname>
271 <methodname>getTranslation($value, 'territory',
272 $locale)</methodname>
281 <sect2 id="migration.19.zend.view.helper.navigation">
282 <title>Zend_View_Helper_Navigation</title>
285 Vor dem Release 1.9 hat der Menü Helfer
286 (<classname>Zend_View_Helper_Navigation_Menu</classname>) Untermenüs nicht richtig
287 dargestellt. Wenn <property>onlyActiveBranch</property> <constant>TRUE</constant> war
288 und die Option <property>renderParents</property> <constant>FALSE</constant> wurde
289 nichts dargestellt wenn die tiefste aktive Seite auf einer geringeren Tiele als die
290 <property>minDepth</property> Option war.
294 In einfacheren Worten; Wenn <property>minDepth</property> auf '1' gesetzt war und
295 die aktive Seite eine der Seiten am Anfangs-Level, wurde nichts dargestellt wie das
296 folgende Beispiel zeigt.
300 Das folgende Container Setup wird angenommen:
303 <programlisting language="php"><![CDATA[
305 $container = new Zend_Navigation(array(
311 'label' => 'Products',
326 'label' => 'Solutions',
333 Der folgende Code wird in einem View Script verwendet:
336 <programlisting language="php"><![CDATA[
337 <?php echo $this->navigation()->menu()->renderMenu($container, array(
339 'onlyActiveBranch' => true,
340 'renderParents' => false
345 Vor dem Release 1.9 würde der obige Codeabschnitt nichts ausgeben.
349 Seit dem Release 1.9 akzeptiert die <methodname>_renderDeepestMenu()</methodname>
350 Methode in <classname>Zend_View_Helper_Navigation_Menu</classname> aktive Seiten die ein
351 Level unter <property>minDepth</property> sind, solange diese Seite Kinder hat.
355 Der gleiche Codeabschnitt zeigt jetzt die folgende Ausgabe:
358 <programlisting language="html"><![CDATA[
359 <ul class="navigation">
361 <a href="#">Server</a>
364 <a href="#">Studio</a>
370 <sect2 id="migration.19.security">
371 <title>Sicherheitsfixes ab 1.9.7</title>
374 Zusätzlich können Benutzer der Serie 1.9 von anderen Änderungen beginnend in Version
375 1.9.7 betroffen sein. Das sind alles Sicherheitsbehebungen welche auch potentiell
376 Probleme mit Rückwärtskompatibilität haben können.
379 <sect3 id="migration.19.security.zend.dojo.editor">
380 <title>Zend_Dojo_View_Helper_Editor</title>
383 Eine kleine Änderung wurde in der Serie 1.9 gemacht um die Standardverwendung des
384 dijit Editors zu modifizieren um <acronym>div</acronym> Tags statt einem
385 <acronym>textarea</acronym> Tag zu verwenden; die letztere Verwendung bringt <ulink
386 url="http://api.dojotoolkit.org/jsdoc/HEAD/dijit._editor.RichText">Sicherheits
387 Probleme</ulink> mit sich, und die Verwendung von <acronym>div</acronym> Tags
388 wird vom Dojo Projekt empfohlen.
392 Um trotzdem eine erfolgreiche Degration zu erlauben, wurde dem View Helper eine neue
393 Option <varname>degrade</varname> hinzugefügt; diese erlaubt es Entwicklern statt
394 dessen optional ein <acronym>textarea</acronym> zu verwenden. Trotzdem öffnet dies
395 Anwendungen die damit entwickelt wurden <acronym>XSS</acronym> Vektoren. In 1.9.7
396 wurde diese Option entfernt. Die erfolgreiche Degration wird trotzdem, über das
397 <acronym>noscript</acronym> Tag unterstützt welches eine <acronym>textarea</acronym>
398 enthält. Diese Lösung adressiert Sicherheitsbedenken.
402 Die Folgerung ist, das wenn man das <varname>degrade</varname> Flag verwendet,
403 dieses ab diesem Zeitpunkt einfach ignoriert wird.
407 <sect3 id="migration.19.security.zend.filter.html-entities">
408 <title>Zend_Filter_HtmlEntities</title>
411 Um zu einem höheren Sicherheitsstandard für die Zeichenkodierung zu kommen, ist der
412 Standardwert von <classname>Zend_Filter_HtmlEntities</classname> jetzt
413 <acronym>UTF-8</acronym> statt <acronym>ISO-8859-1</acronym>.
417 Zusätzlich, weil der aktuelle Mechanismus mit Zeichenkodierung handelt und nicht mit
418 Zeichensets, wurden zwei Methoden hinzugefügt.
419 <methodname>setEncoding()</methodname> und <methodname>getEncoding()</methodname>.
420 Die vorhergehenden Methoden <methodname>setCharSet()</methodname> und
421 <methodname>setCharSet()</methodname> sind jetzt deprecated und verweisen auf die
422 neuen Methoden. Letztendlich, statt die geschützten Mitglieder in der
423 <methodname>filter()</methodname> Methode direkt zu verwenden, werden Sie durch Ihre
424 expliziten Zugriffsmethoden empfangen. Wenn man den Filter in der Vergangenheit
425 erweitert hat, sollte man seinen Code und seine Unittests prüfen um sicherzustellen
426 das weiterhin alles funktioniert.
430 <sect3 id="migration.19.security.zend.filter.strip-tags">
431 <title>Zend_Filter_StripTags</title>
434 <classname>Zend_Filter_StripTags</classname> enthielt in voehergehenden Versionen
435 ein <varname>commentsAllowed</varname> Flag, welches es erlaubt hat
436 <acronym>HTML</acronym> Kommentare in von dieser Klasse gefiltertem
437 <acronym>HTML</acronym> Text als erlaubt zu markieren. Aber das öffnet den Weg für
438 <acronym>XSS</acronym> Attacken, speziell im Internet Explorer (der es erlaubt
439 konditionelle Funktionalität über <acronym>HTML</acronym> Kommentare zu
440 spezifizieren). Beginnend mit Version 1.9.7 (und retour mit den Versionen 1.8.5 und
441 1.7.9), hat das <varname>commentsAllowed</varname> Flag keine Bedeutung meht, und
442 alle <acronym>HTML</acronym> Kommentare, inklusive denen die andere
443 <acronym>HTML</acronym> Tags oder untergeordnete Kommentare enthalten, werden von
444 der endgültigen Aufgabe des Filters entfernt.