Escape- und Codierfunktionen im Vergleich (Thema: PHP Beispiele)

Die verschiedenen Escape- und Codierfunktionen von PHP im Vergleich, inklusive umfassenden Beispielrückgaben

1. Übersicht

PHP bietet fünf nennenswerte Funktionen zum Escapen und Encoden von Strings. Diese lauten:

  • htmlentities($string): Encodiert alle Zeichen im String für die es passende HTML-Entities gibt (haben jeweils einen Aufbau der Art &beispiel; oder &#1234;). Dies betrifft insbesondere die HTML-Steuerungszeichen „<” und „>”. htmlentitites() sollte immer auf Benutzereingaben vor deren Ausgabe angewendet werden.
  • htmlspecialchars($string): Encodiert die HTML-Steuerungszeichen „<”, „>”, „"” (doppelte Anführungszeichen), „'” (einfache Anführungszeichen) und „&” (kaufmännisches Und). (Die einfachen Anführungszeichen werden nur codiert, wenn als zweiter Parameter das Flag ENT_QUOTES übergeben wird.) htmlspecialchars() codiert also letztlich eine kleine Teilmenge aller Zeichen, die auch von htmlentities() codiert werden. In der Regel sollte daher htmlentities() bevorzugt werden.
  • addslashes($string): Diese Funktion escapet alle einfachen und doppelten Anführungszeichen, sowie alle Backslashes indem sie wiederum ein Backslash vor diesen einfügt. Entsprechend wird zum Beispiel aus dem Zeichen " (doppeltes Anführungszeichen) ein \" (Backslash + doppeltes Anführungszeichen). Aus einem Backslash (\) werden zwei (\\). addslashes() kann teilweise genutzt werden, um Strings vorzubereiten, welche in JavaScript verwendet werden sollen. Mitunter wird die Funktion benutzt, um Daten zu escapen, die an MySql gesendet werden. Für diesen Vorgang sollte allerdings bevorzugt mysql_real_escape_string() Anwendung finden, welche speziell dafür konzipiert wurde.
  • urlencode($string): Sollen Strings mit unbekannten Inhalt in URLs verwendet werden, dann ist es ratsam, die zuvor mit urlencode() zu encodieren. Die Funktion ersetzt Sonderzeichen, die nicht in URLs erlaubt sind oder die in diesen spezielle Bedeutung haben, durch ein Prozentzeichen mit ihrem anschließenden Hexadezimalwert. So würde ein Slash (/) zu „%2F” encodiert werden.
  • rawurlencode($string): Funktioniert genauso wie urlencode() mit einem wesentlichen Unterschied: Während urlencode() jedes Leerzeichen zu „+” umwandelt, macht rawurlencode() daraus „%20”. Die Umwandlung vom Leerzeichen zu Plus bei urlencode() hat rein historische Gründe. rawurlencode() ist dementsprechend die „sauberere” Funktion. Seit PHP 5.3.0 gibt es zudem eine weitere kleine Abweichung zwischen den beiden Funktionen: rawurlencode() encodiert nun nicht mehr die Tilde (~), urlencode() macht dies nach wie vor.

2. Tabelle

In der nachfolgenden Tabelle werden die genannten Funktionen gegenüber gestellt. Aufgelistet werden alle ASCII-Zeichen von 1 bis 255, jeweils mit Nummer und zugehörigem Zeichen. (Das Zeichen zur Nummer kann über chr($nummer) bestimmt werden.) Zu jedem Zeichen $chr werden die Ergebnisse von htmlentities($chr), htmlspecialchars($chr), addslashes($chr), urlencode($chr) und rawurlencode($chr) gezeigt. Blau markierte Zellen unterstreichen, dass das ursprüngliche Zeichen von der jeweiligen Funktion abgeändert wurde.

x chr(x) htmlentities htmlspecialchars addslashes urlencode rawurlencode
1     %01 %01
2     %02 %02
3     %03 %03
4     %04 %04
5     %05 %05
6     %06 %06
7     %07 %07
8     %08 %08
9 %09 %09
10 %0A %0A
11 %0B %0B
12 %0C %0C
13 %0D %0D
14     %0E %0E
15     %0F %0F
16     %10 %10
17     %11 %11
18     %12 %12
19     %13 %13
20     %14 %14
21     %15 %15
22     %16 %16
23     %17 %17
24     %18 %18
25     %19 %19
26     %1A %1A
27     %1B %1B
28     %1C %1C
29     %1D %1D
30     %1E %1E
31     %1F %1F
32 + %20
33 ! ! ! ! %21 %21
34 " &quot; &quot; \" %22 %22
35 # # # # %23 %23
36 $ $ $ $ %24 %24
37 % % % % %25 %25
38 & &amp; &amp; & %26 %26
39 ' ' ' \' %27 %27
40 ( ( ( ( %28 %28
41 ) ) ) ) %29 %29
42 * * * * %2A %2A
43 + + + + %2B %2B
44 , , , , %2C %2C
45 - - - - - -
46 . . . . . .
47 / / / / %2F %2F
48 0 0 0 0 0 0
49 1 1 1 1 1 1
50 2 2 2 2 2 2
51 3 3 3 3 3 3
52 4 4 4 4 4 4
53 5 5 5 5 5 5
54 6 6 6 6 6 6
55 7 7 7 7 7 7
56 8 8 8 8 8 8
57 9 9 9 9 9 9
58 : : : : %3A %3A
59 ; ; ; ; %3B %3B
60 < &lt; &lt; < %3C %3C
61 = = = = %3D %3D
62 > &gt; &gt; > %3E %3E
63 ? ? ? ? %3F %3F
64 @ @ @ @ %40 %40
65 A A A A A A
66 B B B B B B
67 C C C C C C
68 D D D D D D
69 E E E E E E
70 F F F F F F
71 G G G G G G
72 H H H H H H
73 I I I I I I
74 J J J J J J
75 K K K K K K
76 L L L L L L
77 M M M M M M
78 N N N N N N
79 O O O O O O
80 P P P P P P
81 Q Q Q Q Q Q
82 R R R R R R
83 S S S S S S
84 T T T T T T
85 U U U U U U
86 V V V V V V
87 W W W W W W
88 X X X X X X
89 Y Y Y Y Y Y
90 Z Z Z Z Z Z
91 [ [ [ [ %5B %5B
92 \ \ \ \\ %5C %5C
93 ] ] ] ] %5D %5D
94 ^ ^ ^ ^ %5E %5E
95 _ _ _ _ _ _
96 ` ` ` ` %60 %60
97 a a a a a a
98 b b b b b b
99 c c c c c c
100 d d d d d d
101 e e e e e e
102 f f f f f f
103 g g g g g g
104 h h h h h h
105 i i i i i i
106 j j j j j j
107 k k k k k k
108 l l l l l l
109 m m m m m m
110 n n n n n n
111 o o o o o o
112 p p p p p p
113 q q q q q q
114 r r r r r r
115 s s s s s s
116 t t t t t t
117 u u u u u u
118 v v v v v v
119 w w w w w w
120 x x x x x x
121 y y y y y y
122 z z z z z z
123 { { { { %7B %7B
124 | | | | %7C %7C
125 } } } } %7D %7D
126 ~ ~ ~ ~ %7E ~
127     %7F %7F
128 %80 %80
129 %81 %81
130 %82 %82
131 %83 %83
132 %84 %84
133 %85 %85
134 %86 %86
135 %87 %87
136 %88 %88
137 %89 %89
138 %8A %8A
139 %8B %8B
140 %8C %8C
141 %8D %8D
142 %8E %8E
143 %8F %8F
144 %90 %90
145 %91 %91
146 %92 %92
147 %93 %93
148 %94 %94
149 %95 %95
150 %96 %96
151 %97 %97
152 %98 %98
153 %99 %99
154 %9A %9A
155 %9B %9B
156 %9C %9C
157 %9D %9D
158 %9E %9E
159 %9F %9F
160   &nbsp;     %A0 %A0
161 ¡ &iexcl; ¡ ¡ %A1 %A1
162 ¢ &cent; ¢ ¢ %A2 %A2
163 £ &pound; £ £ %A3 %A3
164 ¤ &curren; ¤ ¤ %A4 %A4
165 ¥ &yen; ¥ ¥ %A5 %A5
166 ¦ &brvbar; ¦ ¦ %A6 %A6
167 § &sect; § § %A7 %A7
168 ¨ &uml; ¨ ¨ %A8 %A8
169 © &copy; © © %A9 %A9
170 ª &ordf; ª ª %AA %AA
171 « &laquo; « « %AB %AB
172 ¬ &not; ¬ ¬ %AC %AC
173 ­ &shy; ­ ­ %AD %AD
174 ® &reg; ® ® %AE %AE
175 ¯ &macr; ¯ ¯ %AF %AF
176 ° &deg; ° ° %B0 %B0
177 ± &plusmn; ± ± %B1 %B1
178 ² &sup2; ² ² %B2 %B2
179 ³ &sup3; ³ ³ %B3 %B3
180 ´ &acute; ´ ´ %B4 %B4
181 µ &micro; µ µ %B5 %B5
182 &para; %B6 %B6
183 · &middot; · · %B7 %B7
184 ¸ &cedil; ¸ ¸ %B8 %B8
185 ¹ &sup1; ¹ ¹ %B9 %B9
186 º &ordm; º º %BA %BA
187 » &raquo; » » %BB %BB
188 ¼ &frac14; ¼ ¼ %BC %BC
189 ½ &frac12; ½ ½ %BD %BD
190 ¾ &frac34; ¾ ¾ %BE %BE
191 ¿ &iquest; ¿ ¿ %BF %BF
192 À &Agrave; À À %C0 %C0
193 Á &Aacute; Á Á %C1 %C1
194 Â &Acirc; Â Â %C2 %C2
195 Ã &Atilde; Ã Ã %C3 %C3
196 Ä &Auml; Ä Ä %C4 %C4
197 Å &Aring; Å Å %C5 %C5
198 Æ &AElig; Æ Æ %C6 %C6
199 Ç &Ccedil; Ç Ç %C7 %C7
200 È &Egrave; È È %C8 %C8
201 É &Eacute; É É %C9 %C9
202 Ê &Ecirc; Ê Ê %CA %CA
203 Ë &Euml; Ë Ë %CB %CB
204 Ì &Igrave; Ì Ì %CC %CC
205 Í &Iacute; Í Í %CD %CD
206 Î &Icirc; Î Î %CE %CE
207 Ï &Iuml; Ï Ï %CF %CF
208 Ð &ETH; Ð Ð %D0 %D0
209 Ñ &Ntilde; Ñ Ñ %D1 %D1
210 Ò &Ograve; Ò Ò %D2 %D2
211 Ó &Oacute; Ó Ó %D3 %D3
212 Ô &Ocirc; Ô Ô %D4 %D4
213 Õ &Otilde; Õ Õ %D5 %D5
214 Ö &Ouml; Ö Ö %D6 %D6
215 × &times; × × %D7 %D7
216 Ø &Oslash; Ø Ø %D8 %D8
217 Ù &Ugrave; Ù Ù %D9 %D9
218 Ú &Uacute; Ú Ú %DA %DA
219 Û &Ucirc; Û Û %DB %DB
220 Ü &Uuml; Ü Ü %DC %DC
221 Ý &Yacute; Ý Ý %DD %DD
222 Þ &THORN; Þ Þ %DE %DE
223 ß &szlig; ß ß %DF %DF
224 à &agrave; à à %E0 %E0
225 á &aacute; á á %E1 %E1
226 â &acirc; â â %E2 %E2
227 ã &atilde; ã ã %E3 %E3
228 ä &auml; ä ä %E4 %E4
229 å &aring; å å %E5 %E5
230 æ &aelig; æ æ %E6 %E6
231 ç &ccedil; ç ç %E7 %E7
232 è &egrave; è è %E8 %E8
233 é &eacute; é é %E9 %E9
234 ê &ecirc; ê ê %EA %EA
235 ë &euml; ë ë %EB %EB
236 ì &igrave; ì ì %EC %EC
237 í &iacute; í í %ED %ED
238 î &icirc; î î %EE %EE
239 ï &iuml; ï ï %EF %EF
240 ð &eth; ð ð %F0 %F0
241 ñ &ntilde; ñ ñ %F1 %F1
242 ò &ograve; ò ò %F2 %F2
243 ó &oacute; ó ó %F3 %F3
244 ô &ocirc; ô ô %F4 %F4
245 õ &otilde; õ õ %F5 %F5
246 ö &ouml; ö ö %F6 %F6
247 ÷ &divide; ÷ ÷ %F7 %F7
248 ø &oslash; ø ø %F8 %F8
249 ù &ugrave; ù ù %F9 %F9
250 ú &uacute; ú ú %FA %FA
251 û &ucirc; û û %FB %FB
252 ü &uuml; ü ü %FC %FC
253 ý &yacute; ý ý %FD %FD
254 þ &thorn; þ þ %FE %FE
255 ÿ &yuml; ÿ ÿ %FF %FF

3. Skript zur Tabelle

Das Skript zur Erzeugung der Tabelle ist eher trivial. Es wird mit einer foreach-Schleife ein mal über die Zahlen von 1 bis 255 iteriert (eine for-Schleife wäre hier genauso denkbar). Zu jeder dieser Zahlen $x wird jeweils das ASCII-Zeichen anhand von chr($x) bestimmt. Nacheinander werden die Funktionen htmlentities, htmlspecialchars, addslashes, urlencode und rawurlencode angewendet und deren Rückgaben gespeichert. Mit einem schlichten Vergleich über den Operator „===” kann festgestellt werden, ob das jeweilige Ergebnis von $chr abweicht. Falls ja wird die Tabellenzelle mit einer passenden CSS-Klasse markiert, sodass sie eingefärbt werden kann.

PHP-Code
<table id="php-escape-and-encode-functions">
	<thead>
		<tr>
			<th>x</th>
			<th>chr(x)</th>
			<th>htmlentities</th>
			<th>htmlspecialchars</th>
			<th>addslashes</th>
			<th>urlencode</th>
			<th>rawurlencode</th>
		</tr>
	</thead>
	<tbody>
		<?php foreach (range(1, 255) as $x): ?>
			<?php
				$chr = chr($x);
				$htmlentities = htmlentities($chr);
				$htmlspecialchars = htmlspecialchars($chr);
				$addslashes = addslashes($chr);
				$urlencode = urlencode($chr);
				$rawurlencode = rawurlencode($chr);
				
				$htmlentitiesClass = ($htmlentities===$chr ? '' : 'changed');
				$htmlspecialcharsClass = ($htmlspecialchars===$chr ? '' : 'changed');
				$addslashesClass = ($addslashes===$chr ? '' : 'changed');
				$urlencodeClass = ($urlencode===$chr ? '' : 'changed');
				$rawurlencodeClass = ($rawurlencode===$chr ? '' : 'changed');
			?>
			<tr>
				<td><?php echo $x; ?></td>
				<td><?php echo htmlentities($chr); ?></td>
				<td class="<?php echo $htmlentitiesClass; ?>"><?php echo htmlentities($htmlentities); ?></td>
				<td class="<?php echo $htmlspecialcharsClass; ?>"><?php echo htmlentities($htmlspecialchars); ?></td>
				<td class="<?php echo $addslashesClass; ?>"><?php echo htmlentities($addslashes); ?></td>
				<td class="<?php echo $urlencodeClass; ?>"><?php echo htmlentities($urlencode); ?></td>
				<td class="<?php echo $rawurlencodeClass; ?>"><?php echo htmlentities($rawurlencode); ?></td>
			</tr>
		<?php endforeach; ?>
	</tbody>
</table>

Kommentare (0)

Von neu nach alt