Jump to content
php.lv forumi

Optimālais drošības līmenis


zxspectrum

Recommended Posts

Līdz šim lapu laižu dalītā režīmā - php faili uz Servera pie provaidera, MySQL serveris pie manis paša. Gribu lūgt servera adminam uzlikt (dot man pieeju) pie MySQL uz Servera. Mani pārāk neuztrauc tas, ka manu paša lapu varētu uzlauzt (no kļūdām jāmācās), bet ir svarīgi, lai manas neuzmanības rezultātā kāds neuzlauž pašu MySQL (lietotāju privilēģijas) un citiem piederošās datubāzes. Tātad - kad griezīšos pie admina ar lūgumu, man būs jāpierāda, ka esmu veicis nepieciešamos drošības pasākumus.

 

Var mājai durvis aizslēgt ar 3 atslēgām, var arī ar 23. Arī mašīnas ar superdārgu signalizāciju tiek nozagtas.

Tātad - kāds ir tas optimālais drošības sākuma līmenis (var jau visu laiku likt kaut ko klāt), kurš būtu jāievēro, lai naktīs varētu mierīgi gulēt? :)

 

Pirms iepostot šo topiku, vēlreiz pārlasīju Bubu sarūpēto satura rādītāju, kā arī ieskatījos manuālī. Par drošības tēmu runāts tiek daudz un dikti. Salasot visu kopā, man iznāca tāds kā iespējamo/vēlamo aizsardzības pasākumu plāns. Gribu lūgt, lai jūs tajā ieskatāties. Priecāšos, ja dosiet atsauksmes.

 

Kaklz ir teicis: "Internetā ir pārāk daudz lapu, lai visas nedrošās tiktu uzlauztas".

Delfins saka: "Nav nevienas metodes, kas pasargātu 100%".

 

 

Tātad: kas te ir par daudz un kas vēl trūkst?

 

0. Vizuālie gļuki tiek apzināti un novērsti (wordwrap, strip_tags utml.).

1. Mainīgos pēc iespējas nodot caur POST.

2. Ja nevar citādi un mainīgie tomēr jānodod caur GET, tad kriptēt.

3. Protams, lapas izmantotāji konektējas caur lietotāju ar lasīšanas tiesībām, un tikai atsevišķos gadījumos (piem. gestbukā postojot) - caur lietotāju ar rakstīšanas/modificēšanas tiesībām uz konkrēto tabulu (lauku?)

4. Katra skripta sākumā uzlikt error_reporting(0) - uz servera gan jau ir display errors=OFF, bet dubults neplīst.

4. Palūgt servera adminam uzstādīt globals uz OFF (kā par brīnumu ir ON... admins nezina, vai?)

5. Useru paroles kriptēt 2x ar md5 + random salt

6. Ierobežot (?) no vienas IP konektus diennaktī

7. Pārbaudīt usera submitojamos datus, lai ierobežotu SQL injekcijas:

a. vai dati, kam jābūt skaitlim, tiešām ir skaitlis

b. laist cauri tikai labos simbolus. Te datiem varētu uzlaist virsū sekojošo (visu minēto? cik saprotu, visu nav jēgas, jo šis tas dublējas?)

- strip_tags()

- addslashes() (? Serverim magic quotes jau ir enabled ?)

- htmlspecialchars() ar ENT_QUOTES

- nl2br()

- mysql_escape_string()

- preg_replace()/preg_match_all()

 

100. Lietot SSL ;-)

 

 

To, ka daudzi citi ir pieredzējušāki un gudrāki, es nenoliedzu. Ko lai dara - 50 gadu vecumā viss lēnām pielec :P Lūdzu to man īpaši neaizrādīt. Par atsauksmēm - paldies. Laimīgu Jauno gadu!

Link to comment
Share on other sites

- imo nav starpība post vai get, kam tiešām vajadzēs dabūs/pamainīs abus.

- kriptēt get datus nezinu priekš kam tas vajadzīgs raksts=I#%R@%d2 vai raksts=123

- ja vairāki mainīgie tiek padoti un gribi pamaisīt galvu urķiem-mainīgo mainītājiem,tad pieliec cheksumu tiem mainīgajiem kurus useris neievada ar roku.

- laikam ar md5 taisa hashus(kontrolsummas) nevis kriptē, jo md5 parasti mirstīgie nevar atkriptēt.

 

par mysql uzlaušanu - saki ka adminim jāiedot tavas lapas mysql userim pēc iespējas mazākas tiesības pieslēgties tikai no webservera ip, nekādi drop table utt..

Link to comment
Share on other sites

Mysql vismaz 2 dazaadi lietotaaji

lapai tiesiibas Tikai taas kas tieshaam nepiecieshamas, peec iepeejas mazaak + pieslegties tikai

no konkreetas adreses...

otrs adminam ..

Pie logoshanaas lapu nepaarmest uz reiz bet peec dazaam sekundeem.... stipri tiek apgruutinaats skriptu piemekleeshana... (teisim parmet uz lapu peec 2-5 sek starpaa izvadot kautko , Lapa tiek ielaadeeta )

neviens skripts nevarees kautcik reaalaa laikaa piemekleet paroli...

(ja taa buutu teiksim 3-10 megjinaajumi sekundee tad ar laika nobidi tikai 20 meginaajumi minuutee :) )

 

ievadot pareizu useri un nepareizu paroli var uzlik kontrolsummu (cik nepareizi megjinaajumi var buut) peec kuras sasniegsanas dotajaa sessijaa..... pieslegties vairs nevar... (izdzeesis kokijus un megjinaas velreiz)

Link to comment
Share on other sites

tas jau sāk kļūt par paranoju!!!

galvenās lietas, kurām vajadzētu pievērst uzmanību:

skriptos:

1. SQL injection attack (magic quotes enable / mysql_escape_string)

2. globals off (lai nevar feikot variabļus)

3. uploadi, ja tādi ir (max stingra kontrole, kas tiek uploadēts)

4. paroles glabājam neatkriptējamā formā (md5() vienu reizi pietiks atliektiem galiem, ja neesi FIB db turētājs :DD)

 

serverī:

1. register globals off

2. mysql pieejas tiesības juzveriem (publiskajam tikai standartu bez dropiem)

3. visus portus, visu lieko nafig ciet

 

moš ko būšu ātrumā piemirsis...

Link to comment
Share on other sites

md5 var atšifrēt 1 - 11 stundu ilgumā. Tā, ka es šifrētu

md5(sha1($pass.'salt')) - kur salt nav random!

 

"md5 parasti mirstīgie nevar atkriptēt." <-- parasti mirstīgie nemaz nezin, kas tas tāds.

 

par 7. punktu, mana funkcija, vairāk neko citu neizmantoju:

/****************************************************************************/
function MakeSafe($value)
{
	// Sataisa < > u.c. par &amp, &nd;
	$value = htmlspecialchars($value);
   // Stripslashes
   if (get_magic_quotes_gpc()) {
	   $value = stripslashes($value);
   }
   // Quote if not integer
   if (!is_numeric($value)) {
	   $value = "'" . mysql_real_escape_string($value) . "'";
   }
   return $value;
} /* MakeSafe */
/****************************************************************************/

Edited by Toms
Link to comment
Share on other sites

Toms: imo nav vajadzīgs pirms glabāšanas db ' > < & un ko vēl pārvērst par kaut ko citu.

ir vajadzīgas vismaz divas f-jas caur kurām laist cauri textus, viena prieks ieliksanas sql'ā (principā tā pate mysql_real_escape_string) un otra priekš texta ielikšanas htmlā, te atklal kautk as kā htmlspecialchars.

Edited by v3rb0
Link to comment
Share on other sites

Nu, es liekot iekš HTMLa nelaižu nekādus htmlspecialchars vairs....

 

bubu: runa iet par ierindas lietotāju parolītēm. Un, protams, zinu, ka nevis atšifrēšana, bet kolīzijas.

Ja paurbsies bik dziļāk, tad sapratīsi, ka md5 vairs nav nekas īpašs.

Link to comment
Share on other sites

labāk htmlspecialčarus uzrīdīt uzreiz pie insertiem/updeitiem - nu nafig lieki gruzināt serveri pie izvades (piemēram jāizvada 40 palieli komentāri).

 

Toms - dova atšifrē! varbūt iegūsi pasaules slavu atšifrējot md5 :D

protams ne jau ar salīdzināšanu if ( $realhash == md5($testpass) ) :DD

 

toms - "Ja paurbsies bik dziļāk, tad sapratīsi, ka md5 vairs nav nekas īpašs."

hmm. kā tad tā - pēkšņi md5 vairs nav derīgs nekam... gribu tuvāku paskaidrojumu

Link to comment
Share on other sites

hmnc, nevis atšifrēt, bet atrast kolīziju!!! Es par kolīzijām runāju, tas ir - atrast tādu tekstu, kas veido tādu pašu hash kā meklējamais!

 

Un kolīziju var atrast ~10 stundās. Tātad nav vajadzības atšifrēt. Ja Tava parole būs "manaparole", tad es atradīšu tekstu "adjfkuad28ad", kuram būs tāda pati hash vērtība. Radās saprašana?

 

Man slinkums tagad googlee meklēt sīkāku info, lai jums pierādītu...

Link to comment
Share on other sites

Nav man vēlēšanās tērēt laiku, lai pierādītu, palasi mazliet un pats sapratīsi, ka "nepūšu pīlītes".

Patiesiibaa pie lielas veeleeshanaas tas notiek viss veel aatraak. Bet nu rainbow taable uz charset [ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_+=~`[]{}|\:;"'<>,.?/ ] ir 64 GB..

Nez kam tev tur jaabuut (webbankai) lai mirstigais juzeris ar ko taadu njemtos.

 

Pie kam njem veeraa ka tas anyway ir bruteforce. Un ja tu uzmani savu mysql serveri (proti limitee piekljuvi tikai no fikseetaam adreseem) tad idejiski ja nav sql injekcijas iespeeja pie tiem md5 heshiem jau neviens netiek un iisti nav ko laust (ar ko saliidzinaat)..

 

 

Ja gribas droshinaaties tad driizaak jaaskataas uz kaut kaadu Hardened php http://www.hardened-php.net/ un Apaches mod_security http://www.modsecurity.org/projects/modsec...ache/index.html

Link to comment
Share on other sites

×
×
  • Create New...