File: security.xml

package info (click to toggle)
phpdoc 20020310-1
  • links: PTS
  • area: main
  • in suites: woody
  • size: 35,272 kB
  • ctags: 354
  • sloc: xml: 799,767; php: 1,395; cpp: 500; makefile: 200; sh: 140; awk: 51
file content (1293 lines) | stat: -rw-r--r-- 55,485 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
<?xml version="1.0" encoding="iso-8859-2"?>
<!-- EN-Revision: 1.46 Maintainer: gerzson Status: ready -->
<!-- CREDITS: goba -->

 <chapter id="security">
  <title>Biztonsg</title>

  <simpara>
   A PHP egy igen hatkony nyelv s feldolgoz program, akr
   kiszolglmodulknt, akr egy klnll <acronym>CGI</acronym> futtathat
   llomnyknt mkdik. Kpes elrni fjlokat, futtatni parancsokat s
   hlzati kapcsolatokat nyitni a szerveren. Ezek a tulajdonsgok alapesetben
   veszlyess is tehetik ms, a webszerveren fut alkalmazsok szmra.
   A PHP-t azonban gy fejlesztettk, hogy biztonsgosabb legyen
   CGI programok rsra, mint a Perl vagy C nyelvek. A PHP a fordtsi s
   futsidej belltsok helyes megvlasztsval, s megfelel programrsi
   mdszerek betartsval a szabadsg s biztonsg kvnt kombincijt
   biztostja a fejlesztk szmra.
  </simpara>
  <simpara>
   Mivel sokflekppen s sok mindenre lehet hasznlni a PHP-t, szmos
   konfigurcis lehetsg van a mkdsnek szablyozsra. A
   lehetsgek nagy szma garantlja, hogy a PHP-t sokflekppen fel lehet 
   hasznlni, de egyben azt is jelenti, hogy ezek s a webkiszolgl 
   belltsainak kombincii kritikus helyzeteket teremthetnek.
  </simpara>
  <simpara>
   A belltsok soksznsge egyenl mrtk a kdok soksznsgvel.
   A PHP hasznlhat teljes szerver-alkalmazsok ksztsre,
   egy shell felhasznl minden lehetsgvel, vagy hasznlhat
   egyszer 'server side include'-oknl, kis kockzattal egy
   szigoran ellenrztt rendszerben. Az, hogy hogyan kell
   kialaktani egy krnyezetet, milyen biztonsgosan, nagyban a PHP
   fejlesztn mlik.
  </simpara>
  <simpara>
   Ez a fejezet nhny biztonsgi tancsot trgyal, a klnbz
   belltsi lehetsgeket s azokat a helyzeteket trja fel, amelyekben
   ezeket biztonsggal lehet hasznlni. Utna nhny kdolsi szempontot
   is rint a klnbz szint vdelem szempontjbl.
  </simpara>

  <sect1 id="security.general">
   <title>ltalnos szempontok</title>
   <simpara>
    A teljesen biztonsgos rendszer kialaktani tulajdonkppen lehetlen,
    ezrt a vdelmi szakterleten alkalmazott megkzelts a kockzat s a
    hasznlhatsg kzti egyensly megteremtsre trekszik. Ha minden a 
    felhasznl ltal kldtt adat kt biometrikus rvnyestst (pl. retina- s
    ujjlenyomatvizsglatot) ignyel, akkor igen magas szint a rendszer
    "felelssgre vonhatsga" (accountability). Ez azonban azt jelenten, hogy
    flrba telne kitlteni egy meglehetsen sszetett rlapot, ami arra
    sztkln a felhasznlkat, hogy valahogy megkerljk ezt a vdelmet.
   </simpara>
   <simpara>
    A legjobb vdelem gyakran a kevsb alkalmatlankod s nem annyira feltn
    fajta, amely megfelel a kvetelmnyeknek anlkl, hogy megakadlyozn a
    felhasznlkat a munkjuk elvgzsben vagy tlterheln a program rit
    annak tlzott mrv bonyolultsga. Valjban nhny biztonsgi tmads
    pusztn a kiaknzsa az olyasfajta tlsgosan is kiptett vdelemnek, amely
    hajlamos elerodldni az idvel.
   </simpara>
   <simpara>
    Egy mondatot rdemes megjegyezni: A rendszer csakis annyira jl vdett,
    amennyire a leggyengbb lncszeme. Ha minden tranzakcirl feljegyzs 
    kszl id, hely s tranzakcitpus alapjn is, de a felhasznlt csak
    egy egyszer sti (cookie) alapjn azonostja a rendszer, akkor a 
    felhasznlk s a naplzott tranzakcik kzti sszefggsek rvnyessge,
    megbzhatsga igen gyenge.
   </simpara>
   <simpara>
    Tesztels sorn figyelembe kell venni, hogy kptelensg minden lehetsget
    kiprblni mr a legegyszerbb oldalak esetn is. A programoz ltal vrt
    adatok teljesen klnbzek azoktl s minden sszefggst nlklznek 
    azokkal, amelyeket egy zsmbeld alkalmazott kpes elkldeni, vagy 
    amelyeket egy szoftverkalz (cracker) tbb havi munkjval llt ssze, 
    vagy amit egy hzimacska a billenytyzeten vgiggyalogolva bevisz. Ezrt a
    legjobb a programot logikai nzpontbl megkzelteni, hogy sikerljn 
    szrevenni, hol jhetnek el nem vrt adatok s azok a tovbbiakban hogyan
    mdosulhatnak, tnhetnek el vagy ersdhetnek fel a hatsuk.
   </simpara>
   <simpara>
    Az Internet tele van olyan emberekkel, akik azzal akarnak maguknak nevet
    szerezni, hogy feltrik az oldalaidat, tnkreteszik a programjaidat, nem
    helynval tartalommal tltik fel azokat, mellesleg egy - kt izgalmas(?)
    napot szerezve ezzel Neked. Nem szmt, hogy kis vagy nagy webhelyrl van
    sz, elg indok a tmadsra, hogy az r van kapcsolva a hlra, van egy 
    szerver, amelyhez csatlakozni lehet. Sok kdtr program nem foglalkozik 
    a mretekkel, egyszeren csak nagy mennyisg IP blokkokra vadszik 
    ldozatokat keresve ezzel magnak. Prblj meg nem egy lenni kzlk!
   </simpara>
  </sect1>

  <sect1 id="security.cgi-bin">
   <title>CGI futtathat llomnyknt teleptett PHP</title>

   <sect2 id="security.cgi-bin.attacks">
    <title>Lehetsges tmadsok</title>
    <simpara>
     A PHP <acronym>CGI</acronym> futtathat llomnyknt val hasznlata
     egy teleptsi lehetsg azok szmra, akik valami oknl fogva nem
     szeretnk a PHP-t modulknt a szerverbe integrlni (pl. Apache),
     vagy a PHP-t ms CGI wrapper-ekkel szeretnk hasznlni biztonsgos
     chroot s setuid krnyezet kialaktsa rdekben. Ez a forma magval
     vonja azt, hogy a PHP-t a szerver cgi-bin knyvtrba lett teleptve.
     A CERT advisory <ulink url="&url.cert;">CA-96.11</ulink> azt tancsolja,
     hogy ne tegyl feldolgoz programot a cgi-bin knyvtrba.
     Br a PHP hasznlhat mint egy egyedlll feldolgoz program, a PHP-t
     gy terveztk, hogy az ilyen teleptsekbl add tmadsokat kivdje:
    </simpara>
    <itemizedlist>
     <listitem>
      <simpara>
       Rendszerfjlok elrse: <filename
       role="url">http://domain.nev/cgi-bin/php?/etc/passwd</filename>
      </simpara>
      <simpara>
       Az URL lekrsi informcija (query information), ami
       a krdjel (?) utn tallhat, parancssori paramterknt kerl
       tadsra a feldolgoznak. ltalban a feldolgozk megnyitjk,
       s lefuttatjk az els paramterknt adott fjlt.
      </simpara>
      <simpara>
       Ha a PHP CGI futtathat llomnyknt hvdik meg, nem veszi figyelembe
       a parancssori paramtereket.
      </simpara>
     </listitem>
     <listitem>
      <simpara>
       Brmilyen web dokumentum elrse a szerveren: <filename
       role="url">http://domain.nev/cgi-bin/php/titkos/doc.html</filename>
      </simpara>
      <simpara>
       Az elrsi t informci (path information) az URL rsze, a
       futtathat fjl neve utn lv
       <filename role="uri">/titkos/doc.html</filename> a
       <acronym>CGI</acronym> program ltal megnyitsra s futtatsra kerl
       fjl elrsnek meghatrozsra hasznlatos.
       Tipikusan nhny webkiszolgl belltsi lehetsg (Apache-ban:
       Action) hasznlatos a krsek tirnytsra a dokumentumhoz, mint a
       <filename role="url">http://domain.nev/titkos/szkript.php</filename>
       a PHP rtelmez szmra. Ezzel a belltssal a szerver elszr
       ellenrzi az elrsi engedlyeket a <filename
       role="uri">/titkos</filename> knyvtrra, s ezutn lltja el
       az tirnyt krst a <filename
       role="url">http://domain.nev/cgi-bin/php/titkos/szkript.php</filename>
       oldalra, amit gy mr a PHP feldolgoz. Azonban ha eredetileg is
       ebben a formban volt megadva a krs, nem trtnik elrsi
       ellenrzs a <filename role="uri">/titkos/szkript.php</filename>
       fjlra, csak a <filename role="uri">/cgi-bin/php</filename> fjlra.
       Ilyen mdon brki, aki elrheti a
       <filename role="uri">/cgi-bin/php</filename> cmet, egyben
       tetszleges vdett dokumentumot is elrhet.
      </simpara>
      <simpara>
       A PHP esetben az <link
       linkend="install.configure.enable-force-cgi-redirect">--enable-force-cgi-redirect</link>
       fordtsi paramter, a <link
       linkend="ini.doc-root">doc_root</link> s <link
       linkend="ini.user-dir">user_dir</link> konfigurcis lehetsgek
       hasznlhatak ennek kivdsre, ha a szerver dokumentumainak
       knyvtrfjban van olyan knyvtr, ami elrsi korltozsokkal
       br. Nzd meg az albbi lehetsgeket a klnbz kombincikhoz!
      </simpara>
     </listitem>
    </itemizedlist>
   </sect2>

   <sect2 id="security.cgi-bin.default">
    <title>1. eset : csak publikus fjlok</title>

    <simpara>
     Ha a szerveren nincs olyan tartalom, ami jelsz vagy IP alap
     vdelemmel van elltva, nincs szksg ezekre a konfigurcis
     belltsokra. Ha a kiszolgl nem engedlyezi az tirnytsokat,
     illetve ha nincs mdja biztonsgos tirnytssal kldeni a krst
     a PHP szmra, megadhatod az <link
     linkend="install.configure.enable-force-cgi-redirect">--enable-force-cgi-redirect</link>
     opcit a &quot;configure&quot; szkript szmra. Meg kell gyzdnd arrl, hogy
     a PHP szkriptjeid nem fggnek egy specilis szkript-hvsi formtl
     sem, mint a <filename
     role="php">http://domain.nev/cgi-bin/php/dir/szkript.php</filename>
     vagy a <filename
     role="php">http://domain.nev/dir/szkript.php</filename>.
    </simpara>
    <simpara>
     Az tirnyts belltsa Apache alatt az AddHandler s
     Action direktvkkal trtnik (lsd lentebb).
    </simpara>
   </sect2>

   <sect2 id="security.cgi-bin.force-redirect">
    <title>2. eset : az --enable-force-cgi-redirect hasznlata</title>
    <simpara>
     Ez a fordtsi paramter megakadlyozza, hogy brki meghvja a
     PHP-t egy <filename
     role="php">http://domain.nev/cgi-bin/php/titkos/szkript.php</filename>.
     URL-el. Ehelyett a PHP csak akkor fog elfogadni egy ilyen krst
     ha egy szerver tirnytsban kapta.
    </simpara>
    <simpara>
     Apache esetben tipikusan a kvetkez direktvkkal trtnik a bellts:
    </simpara>
    <programlisting role="apache-conf">
<![CDATA[
Action php-script /cgi-bin/php
AddHandler php-script .php
]]>
    </programlisting>
    <simpara>
     Ez a lehetsg csak az Apache web szerverrel tesztelt s azon
     mlik, hogy az Apache belltja a nem standard
     <envar>REDIRECT_STATUS</envar> CGI krnyezeti vltozt ha
     tirnytott krsrl van sz. Ha a webkiszolgld semmilyen
     mdon nem kzli, hogy ez egy direkt vagy tirnytott krs
     volt-e, nem hasznlhatod ezt az opcit, gy valamelyik
     msik mdot kell hasznlnod.
    </simpara>
   </sect2>

   <sect2 id="security.cgi-bin.doc-root">
    <title>3. eset : a doc_root vagy user_dir belltsa</title>
    <simpara>
     Aktv tartalom elhelyezse a norml dokumentumok kztt,
     (pl. szkriptek s futtathat llomnyok) veszlyes gyakorlat lehet.
     Ha pldul valamilyen belltsi hiba miatt a szkriptek ahelyett,
     hogy lefutnnak hagyomnyos HTML dokumentumokknt jelennek meg,
     mindenki szmra tisztn lthat vlnak kdolsi technikid s
     plsul adatbzis jelszavaid. Ezrt nhny rendszeradminisztrtor
     inkbb egy kln knyvtrat jell ki, ami csak a PHP CGI ltal
     elrhet, s gy mindig feldolgozsra kerl s nem jelenik meg
     a szkript kdja.
    </simpara>
    <simpara>
     Ha a fent lert tirnyts azonostsi md nem mkdik,
     fontos, hogy egy klnll szkript doc_root-ot hatrozz meg,
     ami nem azonos a web doc_root-al.
    </simpara>
    <simpara>
     A PHP szkript dokumentumok gykrknyvtrt a
     <link linkend="ini.doc-root">doc_root</link> konfigurcis belltssal
     hatrozhatod meg a
     <link linkend="configuration.file">konfigurcis fjlban</link>, vagy a
     <envar>PHP_DOCUMENT_ROOT</envar> krnyezeti vltozban adhatod meg
     ezt az rtket. Ha ez be van lltva a PHP CGI verzija a fjl
     elrsi tjt a <parameter>doc_root</parameter> s a krs elrsi
     t informcija (path information) alapjn lltja el, ami azt
     jelenti, hogy ezen a knyvtron kvl nem futtathat fjl.
     (kivve a <parameter>user_dir</parameter> esett).
    </simpara>
    <simpara>
     Egy msik itt hasznlhat opci a <link
     linkend="ini.user-dir">user_dir</link>.  Ha ez nincs megadva, csak a
     <parameter>doc_root</parameter> szablyozza a megnyithat fjlok
     krt. Ekkor egy <filename
     role="url">http://domain.nev/~user/doc.php</filename> URL nem a
     &quot;user&quot; nev felhasznl home knyvtrban lv fjlt
     keresi, hanem a <filename role="uri">~user/doc.php</filename>
     fjlt keresi a doc_root alatt (igen, egy tilde karakterrel
     kezdd knyvtrban [<literal>~</literal>]).
    </simpara>
    <simpara>
     Ha a user_dir meg van adva, pldul <filename
     role="dir">public_php</filename>, akkor a fenti <filename
     role="url">http://domain.nev/~user/doc.php</filename> krs a
     <filename>doc.php</filename> nev fjlt fogja megnyitni a &quot;user&quot;
     nev felhasznl home knyvtrban lv
     <filename role="dir">public_php</filename> knyvtrban. Ha a
     &quot;user&quot; home knyvtra <filename role="dir">/home/user</filename>,
     a lefuttatand fjl a
     <filename>/home/user/public_php/doc.php</filename> lesz.
    </simpara>
    <simpara>
     A <parameter>user_dir</parameter> kifejts a
     <parameter>doc_root</parameter> belltstl fggetlenl mkdik,
     gyhogy a dokumentum gykr s felhasznli knyvtr belltsokat
     kln is hasznlhatod.
    </simpara>
   </sect2>

   <sect2 id="security.cgi-bin.shell">
    <title>4. eset : PHP feldolgoz a web knyvtrfn kvl</title>
    <para>
     Rendkvl biztonsgos lehetsg a PHP feldolgozt valahol a
     webrl lthat knyvtrakon kvlre tenni. Pldul az <filename
     role="dir">/usr/local/bin</filename> knyvtrba. Az egyetlen
     igazi htrnya ennek az opcinak az, hogy minden PHP szkript
     els sornak egy ehhez hasonl sort kell megadnod:
     <informalexample>
      <programlisting>
<![CDATA[
#!/usr/local/bin/php
]]>
      </programlisting>
     </informalexample>
     ami meghatrozza, hogy hol tallhat a PHP feldolgoz, ami lefuttatja
     majd ezt a kdot. Radsul minden PHP szkriptnek futsi jogot kell adni.
     Azaz gy kell eljrni, mint brmilyen ms nyelven megrt CGI programmal,
     amit Perl, sh vagy s a <literal>#!</literal> shell-escape mechanizmust
     hasznlja nmaga futtatsra.
    </para>
    <para>
     Ahhoz, hogy ebben az esetben a PHP helyesen kezelje a <envar>PATH_INFO</envar>
     s a <envar>PATH_TRANSLATED</envar> informcikat, a PHP feldolgozt az
     <link linkend="install.configure.enable-discard-path">--enable-discard-path</link>
     &quot;configure&quot; paramterrel kell fordtani.
    </para>
   </sect2>

  </sect1>

  <sect1 id="security.apache">
   <title>Apache modulknt teleptett PHP</title>
   <simpara>
    A PHP-t Apache modulknt hasznlva rkli az Apache-t futtat
    felhasznl (tipikusan a &quot;nobody&quot;) jogait. Ennek tbbfle hatsa
    van a biztonsgra s az azonostsra. PHP-n kersztli adatbzis elrs
    esetn pldul, az adatbzist elrhetv kell tenni ennek a felhasznlnak
    szmra is - annak ellenre, hogy az adatbzisnak beptett azonostsa van.
    Ez azt jelenti, hogy egy rosszindulat szkript elrheti, s mdosthatja az
    adatbzist, akr felhasznli nv s jelsz nlkl is. Lehetsges, hogy egy
    keresrobot beleakadjon az adatbzis-adminisztrcis oldalak egyikbe, s 
    kirtse az sszes adatbzist. Termszetesen lehet ez ellen vdekezni Apache
    azonostsi technikkkal, vagy LDAP segtsgvel megvalstotott sajt 
    elrsi modellekkel, vagy kln .htaccess fjlokkal, stb., s ezeket a sajt
    PHP kd rszev is lehet tenni gy.
   </simpara>
   <simpara>
    ltalban, ha a biztonsgot akkora szintre tudjuk emelni, hogy
    a PHP felhasznl (ebben az esetben az Apache-) igen kis kockzattal
    fut, akkor nem kpes pldul akrmilyen fjlok rsra a user knyvtrakba.
    Letilthatjuk szmra egy adatbzis elrst vagy megvltoztatst.
    Tipikusan ebben a helyzetben mr azokat a fjlokat sem tudja rni,
    amit kellene, vagy egyarnt nem tud vgrehajtani j s rosszindulat
    adatbzis tranzakcikat egyarnt.
   </simpara>
   <simpara>
    Gyakori hiba ezen a ponton, hogy az Apache-nak root jogokat adnak vagy
    valamilyen egyb mdon bvtik az Apache jogait / lehetsgeit.
   </simpara>
   <simpara>
    Az Apache felhasznl jogainak root szintre bvtse klnsen veszlyes,
    s tnkreteheti a teljes rendszert, teht sudo, chroot vagy ms hasonl 
    eszkzk hasznlata elkerlend, ha nem vagy biztonsgi szakember.
   </simpara>
   <simpara>
    Van nhny egyszerbb megolds is. Az <link 
    linkend="ini.open-basedir">open_basedir</link> hasznlatval szablyozni 
    lehet, hogy mely knyvtrakat olvashatja a PHP. Ki lehet jellni n. csak
    apache-s terleteket, hogy minden web alap mvelet ide, csak ezekre a 
    nem rendszer- s nem felhasznli fjlokra korltozdjon.
   </simpara>
  </sect1>

  <sect1 id="security.filesystem">
   <title>Fjlrendszer biztonsg</title>
   <simpara>
    A PHP tiszteli a rendszerbe ptett biztonsgi megoldsokat, klns 
    tekintettel a fjlok s knyvtrak hozzfrsi jogosultsgaira. Ez 
    lehetsget ad arra, hogy megszabd, mely fjlok olvashatak a rendszerben.
    A mindenki szmra olvashat fjloknl gyelni kell arra, hogy ne 
    tartalmazzanak olyan fontos adatot, amit nem szabad elolvasnia
    akrmelyik felhasznlnak a rendszeren.
   </simpara>
   <simpara>
    Mivel a PHP gy kszlt, hogy felhasznli szint fjlrendszer
    hozzfrst ad, lehetsges olyan program ksztse, amely a
    rendszerfjlokat olvassa, pl. az /etc/passwd fjlt. Ez
    maga utn von egy nyilvnval kvetkeztetst, neveztesen minden esetben 
    meg kell gyzdni a programokban arrl, hogy a helyes fjlokat olvassa
    illetve rja a program.
   </simpara>
   <simpara>
    Nzzk a kvetkez szkriptet, ahol a felhasznl megadja, hogy
    le szeretne trlni egy fjlt a knyvtrban. Ez tbbnyire
    egy webes felletet jelent, ahol egy PHP program hasznlatos
    fjlkezelsre, ezrt az Apache-t futtat felhasznlnak engedlyezni kell
    a fjlok trlst a felhasznl knyvtrban.
   </simpara>
   <para>
    <example>
     <title>A helytelen vltoz hasznlat ...</title>
     <programlisting role="php">
<![CDATA[
<?php
// egy fjl trlse a user knyvtrbl
$usernev = $HTTP_POST_VARS["user_altal_beadott_nev"];
$konyvtar = "/home/$usernev";
$torlendo_file = "$userfile";
unlink ($konyvtar/$torlendo_file);
echo "$torlendo_file trlve!";
?>
]]>
     </programlisting>
    </example>
   Mivel a <varname>$usernev</varname> egy HTML rlapbl rkezik, a felhasznl
   berhat tetszleges felhasznli nevet s fjlnevet, gy akr ms knyvtrt
   is manipullhatja. Ebben az esetben ltalban valamilyen 
   felhasznl-azonostsi eljrst kell alkalmazni. Lssuk, mi trtnik, ha a
   beadott vltozk a &quot;../etc/&quot; s a &quot;passwd&quot;. A kd akkor
   gy alakulna (az adatokat behelyettestve):
    <example>
     <title>... fjlrendszer tmadshoz vezethet</title>
     <programlisting role="php">
<![CDATA[
<?php
// egy fjl trlse akrhonnan, ahol a PHP usernek
// joga van erre. Ha a PHP root userknt fut:
$usernev = "../etc/"
$konyvtar = "/home/../etc/";
$torlendo_file = "passwd";
unlink ("/home/../etc/passwd");
echo "/home/../etc/passwd trlve!";
?>
]]>
     </programlisting>
    </example>
    Kt fontos komponensre kell odafigyelni, hogy megelzhessk az ilyen 
    problmkat:
    <itemizedlist>
     <listitem>
      <simpara>
       Csak korltozott jogok belltsa a PHP-t futtat felhasznlnak.
      </simpara>
     </listitem>
     <listitem>
      <simpara>
       Minden felhasznltl bejv adat ellenrzse.
      </simpara>
     </listitem>
    </itemizedlist>
    Egy jobban tgondolt, tkletesitett szkript:
    <example>
     <title>Biztonsgosabb fjl ellenrzs</title>
     <programlisting role="php">
<![CDATA[
<?php
// egy fjl trlse akrhonnan, ahol a PHP usernek
// joga van erre.
$usernev = $HTTP_SERVER_VARS['REMOTE_USER']; // ez a user azonostott neve
                                             // (ha volt eltte azonosts)

$konyvtar = "/home/$usernev";

$torlendo_file = basename("$userfile"); // elrsi trkkzs eldobsa
unlink ($konyvtar/$torlendo_file);

$fp = fopen("/home/logging/filedelete.log","+a"); // trls naplzsa
$logstring = "$usernev $konyvtar $torlendo_file";
fputs ($fp, $logstring);
fclose($fp);

echo "$torlendo_file trlve!";
?>
]]>
     </programlisting>
    </example>
     Mindamellett, ez sem mentes a hinyossgoktl. Ha az aktulisan hasznlt
     hitelestsi mdszer (authentication) megengedi a felhasznlknak, hogy
     sajt loginnevet vlasszanak, s az egyikk a "../etc/" -t vlasztja, akkor
     a rendszer ugyanolyan vdtelenn vlik. Ebbl kiindulva a jobban 
     testreszabott ellenrzs a kvetkezkpp alakulna:
    <example>
     <title>Biztonsgosabb fjlnv-ellenrzs</title>
     <programlisting role="php">
     <![CDATA[
<?php
$usernev = $HTTP_SERVER_VARS['REMOTE_USER']; // hitelesites
$homedir = "/home/$usernev"; $homedir = "/home/$usernev";

if (!ereg('^[^./][^/]*$', $userfile))
    die('rossz fjlnv'); // vge, nincs feldolgozs

if (!ereg('^[^./][^/]*$', $usernev))
    die('rossz usernev'); // vge, nincs feldolgozs
//stb...
?>
]]>
     </programlisting>
    </example>
   </para>
   <para>
    A hasznlt opercis rendszertl fggen szles a vdeni kvnt
    fjlok sklja, belertve az eszkz hivatkozsokat (/dev/ vagy COM1),
    konfigurcis fjlokat (/etc/ s az .ini fjlok), jl ismert
    trolhelyek (/home/, My Documents), stb. E sokasg miatt knnyebb egy
    olyan rendszert kszteni, ahol mindent tiltunk azon kvl, amelyet
    kifejezetten megengednk.
   </para>
  </sect1>

  <sect1 id="security.database">
   <title>Adatbzis biztonsg</title>

   <simpara>
    Mostanban, a dinamikus tartalmat szolgltat web alkalmazsok sarokkvnek
    szmtanak az adatbzisok. Mivel nagyon knyes, titkos adatok trolsra
    szolglhatnak ezek az adatbzisok, ersen megfontoland, mikpp vdjk meg
    ezeket.
   </simpara>
   <simpara>
    Informcik trolshoz vagy visszakeresshez csatlakozni kell az 
    adatbzishoz, egy rvnyes lekrdezst kell kldeni, az eredmnyt ki kell
    olvasni, s le kell zrni a kapcsolatot.
    Manapsg ebben a prbeszdben a Structured Query Language (SQL) a 
    leggyakrabban hasznlt lekrdeznyelv. Figyeld meg, miknt lehet <link
    linkend="security.database.sql-injection">SQL lekrdezseket megbabrlni</link>!
   </simpara>
   <simpara>
    Mint lthat, a PHP egymagban, magtl nem kpes megvdeni az adatbzist.
    A kvetkez bekezdsek clja, hogy betekintst adjanak az alapokba, hogyan kell
    adatbzisokat elrni s mdostani egy PHP programon bell.
   </simpara>
   <simpara>
    Tartsd szben a kvetkez egyszer szablyt: tagoltan vdekezni. Minl tbb
    helyen minl tbbet teszel a biztonsg nvelsrt, annl kisebb a valsznsge,
    hogy a tmadk sikerrel jrjanak, s kiteregessk titkos adataidat, vagy 
    visszaljenek velk. A j adatbzis- s alkalmazstervezs mindig a legnagyobb
    flelmek figyelembevtelrl ismerszik meg.
   </simpara>

   <sect2 id="security.database.design">
    <title>Adatbzis-tervezs</title>
     <simpara>
      Az els lps mindig az adatbzis ltrehozsa, hacsak nem egy kvlllt
      kell hasznlni. Az adatbzis ltrehozsakor az a tulajdonos lesz, az,
      aki lefuttatta az utastsokat. ltalban csak a tulajdonos - esetleg az
      n. superuser - jogosult brmifle az adatbzis elemeit rint mveletre.
      Annak rdekben, hogy ms felhasznlk is hozzfrjenek, jogokat kell
      nekik biztostani.
     </simpara>
     <simpara>
      Az alkalmazsoknak soha nem szabad a tulajdonosaknt vagy superuserknt
      csatlakozni az adatbzishoz, mert ezek brmilyen utastst s lekrdezst
      tetszs szerint futtathatnak, pl. a szerkezeti mdostst (tblk 
      megszntetse) vagy tblk komplett trlse.
     </simpara>
     <simpara>
      Ltre lehet hozni klnbz, szigoran korltozott jogosultsg adatbzis-
      felhasznlkat, melyek mindegyike az adatbzis manipulcinak egy-egy 
      klnbz nzpontjrt felelsek. Mindig csak a legszksgesebb jogokat
      szabad engedlyezni, s el kell kerlni, hogy ugyanazt a felhasznlt
      hasznljuk szerepeiben egymstl klnbz esetekben. Ez azt jelenti, hogy
      ha a behatol meg is szerzi valamelyik ilyen minstst (hitelestsi 
      informcit = felhasznli nv + jelsz), akkor is csak akkora vltozst tud 
      okozni, mint az alkalmazs maga.
     </simpara>
     <simpara>
      Nem kell minden feladatfgg szablyozst a webalkalmazsban (PHP 
      szkriptben) kdolni, ehelyett inkbb hasznld az adatbzis lehetsgeit:
      view-k (nzetek), trigger-ek, rule-ok (szablyok). Ha a rendszer 
      fejldik, s ms alkalmazsokat is csatlakoztatni kell az adatbzishoz,
      akkor mindegyiknl jra kellene programozni ezeket a szablyokat.
      Mindezen fell a triggerek arra is jk, hogy tltsz mdon s 
      automatikusan kezeljenek egyes mezket az adatbzisban, amelyek gyakran
      bepillantst adnak abba, hogy mi is trtnik/trtnt egy tranzakci kzben,
      vagy nagyon hasznosnak bizonyulhatnak hibakeress sorn.
     </simpara>
   </sect2>

   <sect2 id="security.database.connection">
    <title>Kapcsolds az adatbzishoz</title>
    <simpara>
     Elkpzelhet, hogy SSL-n keresztl szeretnl kapcsoldni az adatbzishoz,
     hogy a kiszolgl s gyfl kzti teljes kommunikci titkostsval
     nveld a vdelmet. Hasznlhatsz ssh-t is erre a clra. Akrmelyik is
     ll, nagyon nehz lesz a forgalom lehallgatsbl informcikat kinyerni
     ezek utn.
    </simpara>
    <!--simpara>
     If your database server native SSL support, consider to use <link
     linkend="ref.openssl">OpenSSL functions</link> in communication between
     PHP and database via SSL.
    </simpara-->
   </sect2>

   <sect2 id="security.database.storage">
    <title>Titkostott trols</title>
    <simpara>
     SSL/SSH az gyfl s kiszolgl kzt mozg adatokat vdi, s nem vdi 
     az adatbzisban trolt megmarad adatokat. Az SSL - kapcsolati protokoll.
    </simpara>
    <simpara>
     Mihelyst a tmad kzvetlen hozzfrst szerzett az adatbzishoz - 
     megkerlve a webszervert -, a trolt adatok vdtelenn vltak, s 
     visszalhet velk, ha csak maga az adatbzis nem vdi valahogy azokat.
     Az adatok titkostsa kellkpp enyhti ezt a veszlyt, de jelenleg
     nagyon kevs adatbzis kezel tmogatja a titkostst.
    </simpara>
    <simpara>
     Ez a legknnyebben sajt titkost csomag rsval oldhat meg, amelyet
     utna a PHP szkriptbl el lehet rni. Ebben az esetben a PHP segtsget
     nyjthat nhny kiterjesztsvel, mint pldul az <link
     linkend="ref.mcrypt">Mcrypt</link> vagy az <link
     linkend="ref.mhash">Mhash</link>, amelyek nagyon sokfle titkost 
     algoritmust fednek le. A szkript elszr titkostja a trolni kvnt
     adatot, majd visszakeresskor visszafejti azokat. Nzd meg a hivatkozott
     fejezeteket tovbbi pldkrt, hogyan kell a titkostst vgrehajtani.
    </simpara>
    <simpara>
     Olyan teljesen rejtett adatok esetn, amelyeknek nylt brzolsukra nincs
     szksg, mert nem lesznek kiratva, a hashels alkalmazsa is 
     meggondoland. A hashels jl ismert pldja az, hogy a jelszavak helyett, 
     azoknak csak MD5 hash rtkt troljk az adatbzisban. Lsd mg:
     <function>crypt</function> s <function>md5</function>!
    </simpara>
    <example>
     <title>Hashelt jelsz mez hasznlata</title>
     <programlisting role="php">
<![CDATA[
// jelsz hash rtknek trolsa
$query  = sprintf("INSERT INTO users(name,pwd) VALUES('%s','%s');",
            addslashes($username), md5($password));
$result = pg_exec($connection, $query);

// lekrdezs, vajon a felhasznl a helyes jelszt adta-e meg
$query = sprintf("SELECT 1 FROM users WHERE name='%s' AND pwd='%s';",
            addslashes($username), md5($password));
$result = pg_exec($connection, $query);

if (pg_numrows($result) > 0) {
    echo "dvzllek, $username!";
}
else {
    echo "$username hitelestse nem sikerlt.";
}
]]>
     </programlisting>
    </example>
   </sect2>

   <sect2 id="security.database.sql-injection">
    <title>SQL "beolts"</title>
    <simpara>
     Sok web fejleszt nincs tudatban annak, hogy hogyan lehet megbabrlni
     az SQL utastsokat, ezrt az SQL utastsokat megbzhat parancsoknak 
     felttelezik. Ez azt jelenti, hogy az SQL lekrdezsekkel ki lehet 
     jtszani a hozzfrs szablyozsokat, meg lehet kerlni a szablyos
     engedlyezsi folyamatokat , s nha az SQL lekrdezsekkel a gazdagpen 
     opercis rendszer szint hozzfrst is lehet ltrehozni.
    </simpara>
    <simpara>
     A "kzvetlen SQL utasts befecskendezs" olyan mdszer, amellyel a tmad
     a rgi SQL utastsokat mdostja vagy jakat ad hozzjuk annak rdekben,
     hogy titkos informcikhoz jusson hozz, vagy fellrja azokat, vagy veszlyes
     rendszer szint parancsokat futtasson az adatbzis gazdagpn. Ez olyan 
     alkalmazsok esetn tehet meg, amelyek a felhasznltl szrmaz adatokbl 
     s statikus paramterekbl lltanak ssze SQL lekrdezseket. Sajnos, a 
     kvetkez pldk mind megtrtnt eseteken alapulnak.
    </simpara>
    <para>
     Az, hogy az adatbzishoz superuserknt (olyan szemlyknt, aki superusert
     kpes ltrehozni) csatlakozott az alkalmazs, s a bevitt adatok ellenrzsnek 
     hinya odavezethet, hogy a tmad superuser hozzfrst hozhat ltre az 
     adatbzishoz.
     <example>
      <title>
       A keressi eredmnyek lapokra trdelse ... s superuserek ltrehozsa
       (PostgreSQL s MySQL)
      </title>
      <programlisting role="php">
<![CDATA[

$offset = argv[0]; // Vigyzz, nincs beviteli ellenrzs!
$query  = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
// PostgreSQL
$result = pg_exec($conn, $query);
// MySQL
$result = mysql_query($query);
]]>
      </programlisting>
     </example>
      A szokvnyos felhasznl az 'elz', 'kvetkez' linkekre kattint, ahol
      az <varname>$offset</varname> az URL-be van kdolva. A szkript azt vrja,
      hogy <varname>$offset</varname> decimlis szm. Mgis, valaki megprblhatja 
      a kvetkez utasts <function>urlencode</function> alakjt hozzfzni  
      az URL-hez:
      <informalexample>
       <programlisting>
<![CDATA[
// PostgreSQL
0;
insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd)
    select 'crack', usesysid, 't','t','crack'
    from pg_shadow where usename='postgres';
--

// vagy MySQL esetn
0;
UPDATE user SET Password=PASSWORD('crack') WHERE user='root';
FLUSH PRIVILEGES;
]]>
       </programlisting>
      </informalexample>
      Ha ez megtrtnne, akkor a szkript megajndkozn a tmadt egy superuser
      hozzfrssel. A <literal>0;</literal> arra val, hogy rvnyes offset-et
      biztostson az eredeti lekrdezsnek.
    </para>
    <note>
     <para>
      ltalnos mdszer, hogy a <literal>--</literal> jellel knyszertik ki, 
      hogy az SQL elemz figyelmen kvl hagyja a lekrdezsknt tadott 
      string fennmarad rszt, mivel ez a megjegyzs szabvnyos jellse 
      SQL-ben.
     </para>
    </note>
    <para>
     Egy lehetsges mdja a jelszavak megszerzsnek, hogy kijtszk a keres
     oldalak tallati listjnak lekrdezseit. A tmadnak mindssze annyit
     kell tennie, hogy vgig prblja melyik elkldtt SQL lekrdezsben hasznlt
     vltoz nincs megfelelen lekezelve. Ezeket ltalban egy megelz rlapon 
     lehet belltani, hogy testre szabjuk a <literal>SELECT</literal> utasts
     <literal>WHERE, ORDER BY, LIMIT</literal> s <literal>OFFSET</literal>
     klauzulit. Ha a hasznlt adatbziskezel tmogatja a <literal>UNION</literal>
     szerkezetet, akkor a tmad esetleg hozzfzhet egy teljesen j lekrdezst
     a mr meglevhz, hogy kilistzza  valamelyik tblban trolt jelszavakat.
     Titkostott trols ersen ajnlott!
     <example>
      <title>
       rucikkek listzsa ... s nhny jelsz (valamilyen adatbzis kezel)
      </title>
      <programlisting role="php">
<![CDATA[
$query  = "SELECT id, name, inserted, size FROM products
                  WHERE size = '$size' AND inserted BETWEEN '$min_date' AND '$max_date'
                  ORDER BY $order LIMIT $limit, $offset;";
$result = odbc_exec($conn, $query);
]]>
      </programlisting>
     </example>
     A lekrdezs statikus rsze egy msik <literal>SELECT</literal> utastssal
     kombinlhat, ami az sszes jelszt kilistzza:
     <informalexample>
      <programlisting>
<![CDATA[
'
union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable;
--
]]>
      </programlisting>
     </informalexample>
     Ha ezt a lekrdezst (a <literal>'</literal> s <literal>--</literal> 
     megfelel hasznlatval) valamelyik <varname>$query</varname>-ben hasznlt
     vltozhoz sikerlne hozzrendelni, akkor a szrny felbredne.
    </para>
    <para>
     SQL UPDATE parancsok ugyancsak ki vannak tve az adatbzisok elleni 
     tmadsoknak. Ezeket az utastsokat is fenyegetik az elzekben megismert
     megrvidt s hozzfz technikk. m emellett a tmad meghamisthatja a
     <literal>SET</literal> klauzult is. Ebben az esetben nmi sma 
     informcival rendelkeznie kell a tmadnak, hogy sikerrel jrjon. Ezeket
     az informcikat az rlapvltozk neveibl szerezhetik meg, vagy egyszeren
     prblgatssal. Az ltalnosan hasznlt elnevezsek a felhasznli nvre s
     jelszra nem nagyon klnbznek egymstl.
     <example>
     <title>
      Jelsz trstl ... j jogok megszerzsig (valamilyen adatbzis kezel)
     </title>
      <programlisting role="php">
<![CDATA[
$query = "UPDATE usertable SET pwd='$pwd' WHERE uid='$uid';";
]]>
      </programlisting>
     </example>
     A rosszindulat felhasznl a <literal>' or uid like'%admin%'; --</literal>
     rtket adja t a <varname>$uid</varname> vltoznak, s ezzel 
     megvltoztatja az adminisztrtor jelszavt, vagy egyszeren a 
     <varname>$pwd</varname>-nek a <literal>"hehehe', admin='yes', trusted=100 "</literal>
     (lezr szkzzel) rtket adva  mg tbb jogot szerez magnak. Ezt az 
     SQL parancsot ezek gy ferdtik el:
     <informalexample>
      <programlisting role="php">
<![CDATA[
// $uid == "' or uid like'%admin%'; --"
$query = "UPDATE usertable SET pwd='...' WHERE uid='' or uid like '%admin%'; --';";

// $pwd == "hehehe', admin='yes', trusted=100 "
$query = "UPDATE usertable SET pwd='hehehe', admin='yes', trusted=100 WHERE ...";
]]>
      </programlisting>
     </informalexample>
    </para>
    <para>
     Egy ijeszt plda, hogyan lehet az adatbzis gazdagpn opercis 
     rendszerszint parancsokat futtatni.
     <example>
     <title>Az adatbzis-gazdagp opercis rendszere elleni tmads (MSSQL Server)</title>
      <programlisting role="php">
<![CDATA[
$query  = "SELECT * FROM products WHERE id LIKE '%$prod%'";
$result = mssql_query($query);
]]>
      </programlisting>
     </example>
     Ha a tmad az <literal>a%' exec master..xp_cmdshell 'net user test testpass /ADD' --</literal>
     rtket kldi el a <varname>$prod</varname> vltoznak, akkor a 
     <varname>$query</varname> a kvetkezkpp alakul:
     <informalexample>
      <programlisting role="php">
<![CDATA[
$query  = "SELECT * FROM products 
                    WHERE id LIKE '%a%' 
                    exec master..xp_cmdshell 'net user test testpass /ADD'--%'";
$result = mssql_query($query);
]]>
      </programlisting>
     </informalexample>
     MSSQL Server futtatja a ktegbe fogott SQL utastsokat, kztk azt 
     is, amelyik j felhasznlt vesz fel az adatbzis kiszolglgpen. Ha
     az alkalmazs <literal>sa</literal> jogosultsggal fut s az MSSQLSERVER
     service megfelel jogokkal fut, akkor a tmadnak most mr hozzfrse van
     ehhez a gphez.
    </para>
    <note>
     <para>
      A pldk nmelyike bizonyos adatbziskezelhz ktdik. Ez nem azt jelenti,
      hogy hasonl tmads elkpzelhetetlen ms termkkek ellen. Az ltalad 
      hasznlt adatbzis-kezel ugyanilyen srlkeny lehet, akr ms mdon.
     </para>
    </note>

    <sect3 id="security.database.avoiding">
     <title>Elhrtsi mdszerek</title>
     <simpara>
      Ellenevetsknt felmerlhet, hogy a pldk tbbsgben a tmadnak 
      rendelkeznie kell valamennyi elzetes informcival az adatbzis
      felptsrl. Ez igaz, de soha nem lehet tudni, hogy mikor, hol, hogyan
      szerezhetik meg ezeket, s ha ez megtrtnt, az adatbzisod vdtelenn
      vlik. A behatolk knnyen hozzjuthatnank a program egy darabjhoz nylt 
      forrskd, vagy olyan nyilvnosan elrhet adatbzis-kezel programcsomag
      hasznlatakor, amelyik egy frum vagy tartalomszolgltat rendszer rsze.
      Ez klnsen veszlyes lehet, ha ezek kevss tgondoltak s gyengn 
      megtervezettek.
     </simpara>
     <simpara>
      Ezek a tmadsok alapveten olyan programoknak a kijtszsn alapulnak,
      amelyek a vdelmet/biztonsgot figyelmen kvl hagyva szlettek. Soha nem
      lehet megbzni semmilyen bejv adatban, fleg ha az a kliens oldalrl 
      rkezik, mg akkor sem, ha az egy ltalunk megadott sti (cookie), vagy
      rejtett mez (hidden input) rtke esetleg egy legrdl lista eleme.
      Mg egy olyan rtatlan lekrdezs, mint ami az els pldban lthat,
      katasztrft okozhat.
     </simpara>

     <itemizedlist>
      <listitem>
       <simpara>
        Soha ne csatlakozz az adatbzishoz tulajdonosaknt vagy superuser-knt.
        Mindig kevs jogosultsggal rendelkez, testreszabott felhasznlkat
        hasznlj!
       </simpara>
      </listitem>
      <listitem>
       <simpara>
        Ellenrizd a bejv adat tpust, hogy az a vrtnak megfelel-e! A PHP
        a bevitelt ellenrz fggvnyek szles krvel rendelkezik kezdve
        a legegyszerbbektl - pl.: <link 
        linkend="ref.variables">Vltozkkal kapcsolatos fggvnyek</link> kzl
        <function>is_numeric</function> vagy a <link 
        linkend="ref.ctype">Character Type Functions</link> kzl a 
        <function>ctype_digit</function> - a <link 
        linkend="ref.pcre">Perl kompatibilis regulris kifejezsek</link>
        tmogatsig.
       </simpara>
      </listitem>
      <listitem>
       <para>
        Ha az alkalmazs szmot vr, akkor megfontoland az 
        <function>is_numeric</function> fggvnnyel ellenrizni a tpust, vagy 
        csendben megvltoztatni a tpust a <function>settype</function>
        fggvnnyel, vagy szm szerinti brzolst hasznlni az 
        <function>sprintf</function> fggvnnyel.
        <example>
         <title>
          A lapozshoz hasznlt lekrdezs sszelltsnak biztonsgosabb mdja
         </title>
         <programlisting role="php">
<![CDATA[
settype($offset, 'integer');
$query  = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";

// Figyelj a %d -re a formz sztringben, a %s hasznlat rtelmetlen lenne
$query  = sprintf("SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET %d;", $offset);
]]>
         </programlisting>
        </example>
       </para>
      </listitem>
      <listitem>
       <simpara>
        Idzjelek kz kell tenni minden nem szm jelleg, felhasznltl
        szrmaz adatot, erre hasznlhat az <function>addslashes</function>
        vagy az <function>addcslashes</function>. Lsd mg 
        <link linkend="security.database.storage">az els pldt</link>!
        Ahogy a pldk is mutatjk, a statikus rszbe getett idzjelek
        nem elegendek, s knnyen kijtszhatk.
       </simpara>
      </listitem>
      <listitem>
       <simpara>
        Semmilyen adatbzisra jellemz informcit - klnsen 
        szerkezetit - nem szabad kirni, ha trik, ha szakad.
        Lsd mg: <link
        linkend="security.errors">Hibajelzs</link> s <link
        linkend="ref.errorfunc">Hibakezel s naplz fggvnyek</link>!
       </simpara>
      </listitem>
      <listitem>
       <simpara>
        Trolt eljrsokat s elre definilt kurzorokat is hasznlhatsz, hogy
        az adatbzis elrst absztrahld annak rdekben, hogy a felhasznlk
        ne kzvetlenl a tblkhoz vagy nzetekhez frjenek hozz. Ennek a
        megolds azonban egyb hatsai vannak.
       </simpara>
      </listitem>
     </itemizedlist>

     <simpara>
      Ezeken kvl, hasznot hajthat a lekrdezsek naplzsa akr a szkripteken 
      bell, akr ha az adatbzis kezel maga teszi ezt. Nyilvnvalan ez nem
      tud megakadlyozni egyetlen rtalmas prblkozst sem, de segtsget
      nyjthat annak feldertsben, hogy melyik alkalmazs lett kijtszva. A
      naplzs nmagban nem, csak a benne megjelen informcikon keresztl 
      vlik hasznoss: ltalban a tbb rszlet, hasznosabb.
     </simpara>
    </sect3>
   </sect2>
  </sect1>

  <sect1 id="security.errors">
   <title>Hibakezels</title>
   <para>
      A PHP biztonsgi krdsek fell a hibajelzseknek kt oldaluk van.
      Az egyiket nzve hasznos a vdelem nvelse szempontjbl, a msik 
      szemszgbl viszont kros.
   </para>
   <para>
    Egy szoksos tmadsi technika minl tbb informci begyjtse
    a rendszerrl. Ezt gy prbljk megoldani, hogy helytelen
    adatokat kldenek be, s rgztik a hibazenetek tpusait
    s krnyezetket. Ez lehetsget ad a crackernek, hogy
    elg informcit gyjtsn a rendszerrl, s meghatrozza
    a lehetsges gyenge pontokat.  Ha pldul a tmad sszeszedegetett
    elg informcit az elz rlap kitltsek alapjn, akkor
    megprblhatja a vltozkat fellrni vagy megvltoztatni ket:
    <example>
     <title>Vltozk elleni tmads egy HTML oldallal</title>
     <programlisting role="php">
<![CDATA[
<form method="post" action="tamadas_celpontja?usernev=rosszize&jelszo=rosszize">
<input type="hidden" name="usernev" value="rosszize">
<input type="hidden" name="jelszo" value="rosszize">
</form>
]]>
     </programlisting>
    </example>
   </para>
   <para>
    A PHP ltal visszaadott hibazenetek ltalban hasznosak
    a hibkat keres fejleszt szmra, megjellve a fjlt, s
    a fggvnyt, ami hibs, megadva a megfelel programsor szmt.
    Ez az sszes informci, amit ki lehet nyerni. Nem ritka,
    hogy egy PHP fejleszt a <function>show_source</function>,
    <function>highlight_string</function>, vagy
    <function>highlight_file</function> fggvnyeket a
    fejleszts sorn hibakeressre is hasznlja, de egy lesben
    lv webhelyen ez rejtett vltozkat, ellenrizetlen kdokat,
    s ms veszlyes informcikat fedhet fel. Kifejezetten veszlyes
    beptett hibakezelvel rendelkez ismert forrs kdok hasznlata.
    Ha a tmad rismer valamilyen ltalnos programozsi technikra, akkor
    megprblhatja a nyers erre alapozva feltrni az oldalt a
    klnbz megszokott hibakeres (debugging) vltozk elkldsvel:
    <example>
     <title>Szokvnyos hibakeres vltozk kihasznlsa</title>
     <programlisting role="php">
<![CDATA[
<form method="post" action="tamadas_celpontja?errors=Y&amp;showerrors=1&debug=1">
<input type="hidden" name="errors" value="Y">
<input type="hidden" name="showerrors" value="1">
<input type="hidden" name="debug" value="1">
</form>
]]>
     </programlisting>
    </example>
   </para>
   <para>
    A hibakezels mdjtl fggetlenl az a lehetsg, hogy egy rendszerben
    hibk utn kuthatnak, odavezet, hogy a tmadk is tbb informcihoz
    jutnak.
    Az ltalnos hibazenetek nagyrszbl pldul beazonosthat, hogy
    a rendszer PHP-t hasznl. Ha a tmad egy .html oldalt ltott,
    s ismert hibkat kihasznlva meg akarta tudni, hogy
    milyen alkalmazst hasznl a rendszer, hibs adatokat bekldve
    azonosthatja, hogy az oldalt egy PHP program lltotta el.
   </para>
   <para>
    Egy fggvnyhiba elrulhatja, hogy a rendszer milyen
    adatbzismotort hasznl, vagy hogy milyen programozi
    stlussal kszlt az adott weblap. Ez mlyebb kutatsokra
    ad lehetsget nyitott adatbzisportok irnyban, vagy
    tipikus hibk illetve gyengesgek keresst jelentheti.
    Klnbz hibs adatok kldsvel a tmad meg tudja
    llaptani, hogy milyen sorrendben vgzed az azonostsokat
    (a hibk sorszmaibl). Ezzel a gyenge pontok is knnyen
    megtallhatak egy szkriptben.
   </para>
   <para>
    A fjlrendszer vagy ltalnos PHP hibk jelezhetik, hogy
    milyen jogokkal rendelkezik a webszerver, s megmutathatjk
    a fjlok elrendezst s struktrjt. A fejleszt ltal
    rt hibs kd slyosbthatja a helyzetet, rgebben
    'rejtett' informcik knny kidertst tve lehetv.
   </para>
   <para>
    Hrom megoldsi lehetsg addik erre a problmra. Az els, megvizsglni
    alaposan a fggvnyeket, s megprblni elkerlni a hibkat. A msodik a
    a hibajelzs kikapcsolsa a teljes kdon bell. A harmadik a PHP 
    testreszabhat hibajelentsi funkciinak hasznlata, hogy sajt hibakezelket 
    definilj. A mr megtett biztonsgi intzkedsektl fggen esetleg 
    mindhrom fenti mdszert vlaszthat.
   </para>
   <para>
    Megelzend a bajt hasznot hajthat a PHP beptett
    <function>error_reporting</function> fggvnye, amely segt
    biztonsgosabb tenni a programokat s megtallni a vltozk
    vszelyeket rejt hasznlati formit. A bevezets eltti tesztels
    sorn E_ALL bellltssal gyorsan meg lehet tallni azokat a pontokat,
    ahol a vltozk knnyen s/vagy rosszindulatan mdosthatk. Ha
    a program mr ksz bevezetsre, akkor a E_NONE-t hasznlva
    teljesen leszigetelhet a kd a tovbbi vizslatsoktl.
    <example>
     <title>Veszlyes vltozk feldertse az E_ALL segtsgvel</title>
     <programlisting role="php">
<![CDATA[
<?php
if ($usernev) {  // nincs inicializlva vagy ellenrizve hasznlat eltt
    $jo_belepes = 1;
}
if ($jo_belepes == 1) { // ha az elz felttel hamis, nincs inicializlva vagy ellenrizve hasznlat eltt
    fpassthru ("/nagyon/kenyes/adatok/index.html");
}
?>
]]>
     </programlisting>
    </example>
   </para>
  </sect1>

  <sect1 id="security.registerglobals">
   <title>Globlisan is elrhet vltozk (Register Globals) hasznlata</title>
   <para>
    A biztonsg nvelsre hasznlhat a PHP egyik lehetsge: a
    <link linkend="ini.register-globals">register_globals</link> = off bellts
    hasznlata. Ennek a kikapcsolsa azt jelenti, hogy a felhasznltl jv vltozk 
    nem "szennyezik be" akaratlanul a PHP kdot, s gy cskken a potencilis
    tmad ltal befolysolhat vltozk kre. Mg tbb idt kell azzal tltenik,
    hogy kitalljk a vltozk feltltsnek mdjt, s a bels vltozid
    hatkonyan elklnlnek a felhasznl ltal elkldtt adatoktl.
   </para>
   <para>
    Az ezzel jr elnyk messze fellmljk azt a kevs knyelmetlensget, amelyet
    a megnvekedett munka mennyisge okoz.
    <example>
     <title>register_globals=off nlkl</title>
     <programlisting role="php">
<![CDATA[
<?php
if ($usernev) {  // felhasznlhat ltal hamisthat get/post/cookies
    $jo_belepes = 1;
}

if ($jo_belepes == 1) { // felhasznlhat ltal hamisthat get/post/cookies
    fpassthru ("/nagyon/kenyes/adatok/index.html");
}
?>
]]>
     </programlisting>
    </example>
    <example>
     <title>register_globals = off hasznlatval</title>
     <programlisting role="php">
<![CDATA[
<?php
if($HTTP_COOKIE_VARS['usernev']){
    // csak stiknt jhet, hamistva vagy pp ellenkezleg
    $jo_belepes = 1;
    fpassthru ("/nagyon/kenyes/adatok/index.html");
}
?>
]]>
     </programlisting>
    </example>
    Okosan hasznlva, mg azt kpes lehet jelezni, ha hamistst
    ksreltek meg. Ha elre tudhat, hogy mely vltozknak honnan
    kell rkeznik, akkor azt is megvizsglhatod, hogy vajon ms mdon nem
    prbltk-e elkldeni ezt a vltozt. Ez nem garantlja, hogy az adatok
    nem hamisthatk, azonban megkveteli a tmadtl, hogy az rtalljon
    a megfelel hamistsi mdszerre.
    <example>
     <title>Egyszer vltoz-tvtel felfedse</title>
     <programlisting role="php">
<![CDATA[
<?php
if ($HTTP_COOKIE_VARS['usernev'] &&
    !$HTTP_POST_VARS['usernev'] &&
    !$HTTP_GET_VARS['usernev'] ) {
    // egyb usernev azonostsok elvgzse ...
    $jo_belepes = 1;
    fpassthru ("/nagyon/kenyes/adatok/index.html");
} else {
   mail("admin@example.com", "Lehetsges betrsi ksrlet", $HTTP_SERVER_VARS['REMOTE_ADDR']);
   echo "Vdelmi szablyok megszegse, adminisztrtor rtestve.";
   exit;
}
?>
]]>
     </programlisting>
    </example>
    Termszetesen register_globals egyszer kikapcsolsa nem jelenti azt, hogy
    a kd biztonsgos. Minden berkez adatot valamilyen egyb mdon ellenrizni
    kell.
   </para>
  </sect1>

  <sect1 id="security.variables">
   <title>Felhasznltl rkez adatok</title>
   <para>
    A legtbb problma sok PHP programban nem a nyelvben rejlik, hanem
    abbl fakad, hogy a kd nem a biztonsgossgot szem eltt tartva
    kszlt. Emiatt mindig kell idt kell sznni annak ellenrzsre,
    hogy egy adott kdrszletre milyen hatssal lehet egy vratlan hibs
    adat.
    <example>
     <title>Veszlyes vltozhasznlat</title>
     <programlisting role="php">
<![CDATA[
<?php
// egy fjl trlse a user knyvtrbl... vagy
// taln valaki msbl?
unlink ($ordogi_valtozo);

// Az elrs naplzsa... vagy egy /etc/passwd bejegyzs?
fputs ($fp, $ordogi_valtozo);

// Valami egyrtelm dolog futtatsa.. vagy rm -rf *?
system ($ordogi_valtozo);
exec ($ordogi_valtozo);
?>
]]>
     </programlisting>
    </example>
    Mindig alaposan meg kell vizsglni a felhasznlk ltal beadott adatokat,
    feltve a kvetkez krdseket:
    <itemizedlist>
     <listitem>
      <simpara>
       Biztos, hogy ez a szkript csak a kvnt fjlokat fogja mdostani?
      </simpara>
     </listitem>
     <listitem>
      <simpara>
       Elfordulhat egy ponton, hogy szokatlan vagy nem kvnatos
       adat jelenjen meg?
      </simpara>
     </listitem>
     <listitem>
     <simpara>
       Hasznlhat-e az adott szkript nem kvnatos formban?
      </simpara>
     </listitem>
     <listitem>
      <simpara>
       Felhasznlhat-e ms szkriptekkel egytt egy negatv
       hats elrsre?
      </simpara>
     </listitem>
     <listitem>
      <simpara>
       Megfelelen naplzsra kerlnek-e a tranzakcik
       (elrsek, vltoztatsok)?
      </simpara>
     </listitem>
    </itemizedlist>
    Kellkppen tgondolva a fenti krdseket a szkript rsakor, megkmlhet
    attl, hogy ksbb vgiggondolva a problmkat szerencstlen mdon jra 
    kelljen rni a teljes kdot a vdelem nvelse rdekben. Ezzel sem lehet 
    garantlni a rendszer biztonsgt, de segthet annak nvelsben/
    fenntartsban.
   </para>
   <para>
    Szmtsba lehet venni a register_globals, magic_quotes s ms knyelmi 
    szolgltatsok kikapcsolsnak a gondolatt is, mivel ezek megfosztanak az
    adatok forrsnak, helyessgnek, tartalmnak ismerettl. A PHP*t 
    maximlis hibajelentsi szinten hasznlva - az error_reporting E_ALL 
    belltsval - figyelmeztetst ad elzetes rtk nlkli, definilatlan 
    vltozkrl, ezzel vdve attl, hogy vletlenl hibs adatokkal dolgozzon
    a program.
   </para>
  </sect1>

  <sect1 id="security.hiding">
   <title>A PHP elrejtse</title>
   <para>
    ltalban a rejtegetsen s flrevezetsen alapul vdelem az egyik
    leggyengbb formja a vdekezsnek, azonban nha minden apr tbblet
    kvnatos lehet.
   </para>
   <para>
    Nhny egyszer mdszerrel elrejthet, hogy PHP-t hasznlsz,
    gy lasstva le a tmadt, aki fel akarja derteni a rendszer
    gyenge pontjait. A php.ini-ben az expose_php = off belltssal
    cskkentheted ezeket az informcikat.
   </para>
   <para>
    Msik taktika a webszerver (pl. apache) olyan belltsa
    a .htaccess-en vagy az apache konfigurcis fjlban, hogy
    klnbz tpus fjlokat is PHP-n keresztl futtasson. Ms
    flrevezet fjlkiterjesztseket alkalmazsra plda:
    <example>
     <title>PHP elrejtse ms nyelvknt</title>
     <programlisting role="apache-conf">
<![CDATA[
# gy tnik, mintha PHP helyett ms szerver oldali alkalmazs futna 
AddType application/x-httpd-php .asp .py .pl
]]>
     </programlisting>
    </example>
     vagy egy teljesen ismeretlennel is eltakarhat:
    <example>
     <title>ismeretlen tpusok hasznlata PHP fjlok kiterjesztseknt</title>
     <programlisting role="apache-conf">
<![CDATA[
# PHP kdok teljesen ismeretlen tpusnak tnnek
AddType application/x-httpd-php .bop .foo .133t
]]>
     </programlisting>
    </example>
    vagy html tpus mg is elrejthetk a PHP fjlok, ami csekly 
    teljestmnycskkenst okoz, mivel minden html oldal tmegy a PHP-n:
    <example>
     <title>html tpus hasznlata PHP fjlkiterjesztsknt</title>
     <programlisting role="apache-conf">
<![CDATA[
# PHP kdok html tpusnak tnnek
AddType application/x-httpd-php .htm .html
]]>
     </programlisting>
    </example>
    Ahhoz, hogy ez jl mkdjn, minden PHP fjlt t kell nevezni
    a fenti kiterjesztsek valamelyiknek megfelelen. Mivel ez is az
    elrejtzsen / ismeretlensgen alapul vdelmi forma, kevs htrnya
    mellett csekly megakadlyoz intzkedst jelent.
   </para>
  </sect1>

  <sect1 id="security.current">
   <title>Fontos aktulisnak maradni</title>
   <simpara>
    A PHP, mint brmilyen ms nagy rendszer llandan vltozsok s
    fejlesztsek alatt ll. Minden j vltozat kisebb-nagyobb
    vltoztatsokat tartalmaz, feljesztve a nyelvet, kijavtva
    biztonsgi hibkat, belltsi kellemetlensgeket, s ms
    olyan elemeket, amik a teljes rendszer stabilitsra s
    biztonsgra hatnak.
   </simpara>
   <simpara>
    Mint ms rendszerszint nyelvek s programok esetben, a legjobb
    hozzlls a gyakori frissts, valamint a friss vltozatokrl, s
    a fellp vltozsokrl val informlds.
   </simpara>
  </sect1>
 </chapter>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->