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 "configure" 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
"user" 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 "user"
nev felhasznl home knyvtrban lv
<filename role="dir">public_php</filename> knyvtrban. Ha a
"user" 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>
"configure" 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 "nobody") 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 "../etc/" s a "passwd". 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&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
-->
|