Jump to content
php.lv forumi

Recommended Posts

Posted (edited)

Tātad nesen ievadzējās tādu kodu, nē kods kad nebūs tas pareizākais skaidrojums man vajag ideju, piemēram man ir līgums ar kkādu sms serveri, cilvēks pasūta sms kā pēc defulta viņam atnāk kods un tad sākas mans skripts piemēram viņš izvēlas progu, kuru lejupielādēs, un tad nu sākam, piemēram,

ja kods sakrīt (ko pircējis saņēma caur sms), viņam izlec kkāds logs un viņš var lejupielādēt programu, bet man vajag ko tādu, kas pasargātu to noteikto progu, kādam ir kādas idejas? sākumā ideja pavisam prasta saitaisīt kkādus desmit dirus un tad desmitajā iebāzst to progu "/dblassaaf/vdgasdgd/gsagds/asgsg/asgas/agds/prga.exe" apmr šādi, tas būtu pietiekami droši? Manuprāt kkāds ļēvais variants takā palīdziet!

 

 

ā nupatās radās ideja, nevar tā piemēram failus izņemt to webservera main dira, respektīvi www un ielikt iepriekšējā public_html,

tad jūzeris var viņām tikt klāt?

Edited by test2
Posted (edited)

Atkarīgs kā to realizē ja tev ir <a href="/dblassaaf/vdgasdgd/gsagds/asgsg/asgas/agds/prga.exe">download</a>, tad drošības tur pilnīgi nekādas :)

 

iesaku uztaisīt tādu kā download menedžeri, vispirms ievada kodu, ja kods sakrīt tad parādam pogu kur redzama download poga ar linku: <a href="download.php?fileId=5123&smsCode=ham3r">download</a>. tad download php nosaki vēlreiz pārbaudi vai kods ir pareizs, ja nav tad iedod kādu smagu video lai zin kā hakot :) bet ja ir tad pēc pēc faila id sameklē datubāzē attiecīgā faila mime/type un reālo atrašanās vietu, izsūti attiecīgos Content-type headerus un location pasniedz failu.

 

upd: netiks klāt! Var caurs ftp or smth...

Edited by Vebers
Posted

paldies, bet izsaukot download logu viņam nevar kkur apstīties linku uz failu?

Nēsmu īsti interesējies tāpēc arī nezinu!

Posted

Neizsauc to download logu. Bet vienkārši tam download.php failā ja kods ir pareizs izsūti headerus.

 

 

Content-type: application/pdf
Location: http://files.mysite.com/readers/pdf/foxit.exe

 

Ar headeriem varu kļūdīties bet domai vaidzētu būt skaidrai

Posted (edited)

tā ok skaidrs, man piemēram, pašlaik uz testa skripta ir šādi:

if($kods = $_POST['code']) {
header("Location: $row['link']");
}

es domāju tieši tas header, to koda pārbaudi vnk šitādu uzliku nepievērsiet uzmanību

tas ir pietiekami droši?

Edited by test2
Posted

Šādi tev redirektēs visu pārlūku uz to failu (idejiski addressbarā vaidzētu parādīties pilnajai faila adresei..)

Posted

Ir stulbi likt pilno faila adresi ieksh $_GET, jo tādā veidā jau uzreiz parādi kur ir pats fails. Tādā veidā nekad neatturēs failu lejupielādēt lietotājam otru reizi vai iedot pilno linku draugiem, kuri bezmaksas lejupielādēs failus un tava kompānija / firma cietīs zaudējumus :)

 

ieksh $_GET['file'] vari norādīt tikai faila ID (attiecīgi to kas glabājās datubāzē kā primary ID! :)

Posted

nu jā es tač to apzinos beidz piesities pie tik uber loģiskiem šitiem, es tev iedevu piemēru lai parādi kā to faila downlādi izsaukt, lai nevar piefiksēt linku...

Posted

Nu imho es jau tev visu idejiski esmu priekšā uzrakstījis un pat ļoti saprotami!! paskaties vēlreiz 4.postu.

 

Tie ūberļoģiskie šiti nemaz neizskatās ka būtu loģiski priekš tevis.

 

Piemers ja links ir download.php?id=124&code=1254fasf2

$r = mysql_query("select code from sms_codes where code = '".mysql_real_escape_string($_GET['code'])." and used <> 1'");
$res = mysql_fetch_assoc($r);

if(!empty($res)) {
$q = mysql_query("select location, mime_type from files where id = ".intval($_GET['id']));
$data = mysql_fetch_assoc($q);

mysql_query("update sms_codes set used = 1 where code = ".mysql_real_escape_string($_GET['code']));

header("Content-type: ".$data['mime_type']);
header("Location: ".$data['location']);


} else {
echo 'code already used';
}

 

Tiesa gan ar headeriemk varu kļūdīties, bet doma skaidra. un ja ne tad paskaties kādu download menedžera skriptos, tur 100% atradīsi to ko meklē.

Posted

Header("Location: ..."); ir parasts http headeris 302 (REDIRECT) kas padod Location parametru līdz ar to vienkārši redzams...

 

Attiecīgi ja netiek veiktas nekādas manipulācijas (fails dzēsts/movots utt) un fails atrodas webroota var neatkarīgi vilkt kaut vai 100 reizes un ir pofig ka kaut kāds skrips ir updeitojis SQL tabulu, jo "header("Location: ".$data['location']);" jāatgriež fiziska faila lokacija..

 

 

Taču iespējams taisīt savādāk:

1. Ar to pašu php nevis taisīt header() bet gan ar readfile() ( http://lv.php.net/manual/en/function.readfile.php ) vai file_get_contents() pa taisno gāzt no php (fiziski fails var atrasties ārpus webroota)..

2. Lai nebūtu jātransfērē fails ar php (kas pēc idejas ir diezgan resursprasīgi) praktiski visiem webserveriem ir tā saucāma X-Sendfile fīča - kur ar php iespējams veikt kaut kāda veida autorizāciju / pārbaudi taču pašu failu sendot ar webserveri sūtīšanas mehānismu: Apache http://tn123.ath.cx/mod_xsendfile/ lighttpd un nginx sendfile ir iebūvēts..

 

Lightam un nginxam ir vēl pāris iespējas aka mod_trigger_b4_dl http://trac.lighttpd.net/trac/wiki/Docs%3A...rBeforeDownload vai mod_secure_download bet nu tākā taisies ar biznesu nodarboties nebūtu tākā korekti visu uz paplātes pasniegt :)

×
×
  • Create New...