Jump to content
GSForum - Segélyvonal

PHP feltöltés


sandor676
 Share

Recommended Posts

sandor676

Sziasztok!

Az alábbi űrlapos fájlfeltöltésben szeretnék segítséget kérni:

HTML fájl egy kicsit egyszerűsítve:

 

 

<form action="feldolgozo.php" method="post" enctype="multipart/form-data">
<p align="center">
<label for="nev">Név:</label>
<input type="text" name="nev" id="nev" />
</p>
<p align="center">
<label for="email">E-mail cím:</label>
<input type="text" name="email" id="email" />
</p>
<p align="center">
<label for="feltolt">Feltöltés</label>
<input type="file" name="feltolt" />
<button type="submit">Elküldés</button>
</form>

 

PHP:

<?php
include 'con.php';
$nev = $_REQUEST['nev'];
$email = $_REQUEST['email'];
$feltolt = $_REQUEST['$feltolt'];
if (strpos($_FILES["feltolt"]["type"],'msword') != false) {
$kiterjeszters="doc";
}
if (strpos($_FILES["feltolt"]["type"],'vnd.openxmlformats-officedocument.wordprocessingml.document') != false) {
$kiterjeszters="docx";
}
if (strpos($_FILES["feltolt"]["type"],'pdf') != false) {
$kiterjeszters="pdf";
try{
$pdo = new PDO("mysql:host=$host; dbname=$db_n", $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare("insert into table(nev, email, feltolt) values(:nev, :email, :feltolt)");
$stmt->execute(array(':nev'=>$nev, ':email'=>$email, ':feltolt'=>$feltolt));
echo 'Adatok elmentve';
}
catch(PDOException $e) {
echo $e->getMessage();
}
$cel="foldername";
move_uploaded_file($_FILES["feltolt"]["tmp_name"], $cel);
?>

 

 

Mit javítsak még a kódban, hogy működjön a fájl feltöltés + a megadott adatokat mentse el a program az adatbázisban is?

Előre is köszönöm a segítségeteket!

Link to comment
Share on other sites

payskin

Mi a probléma?

Link to comment
Share on other sites

kléni

Mi a probléma?

- align:center

- table nevű tábla

- kiterjesztés nélküli cél megadás, ami valóban egy mappa neve.

- strpos használata fix adatok ellenőrzésére

- a file type-jének vizsgálata a kiterjesztés kinyerésére

- a PDO nem injection-védett használata

- az adatok nem ellenőrzése

- $_REQUEST használata $_POST helyett

- a move_uploaded_file nem jó helyen, és nem megfelelő használata.

 

Válogathatsz. :)

Link to comment
Share on other sites

payskin

Jó, kezdjük ott, hogy nincs normálisan formázva a kód, innentől nagyon bele sem ástam magam, meg nem akartam rögtön ráborítani az asztalt. De a kérdés nem erre vonatkozott, hanem, hogy neki mi baja van? Nem működik? Hibaüzenetet ír ki? Ha igen, mi az? Mégis, mi lenne most a mi teendőnk? Már megint gondolatolvasó-tanfolyam kéne ahhoz, hogy kitaláljam, a drága delikvens mit szeretne... Halálom.

 

Apropó, szerinted hogy injection-védett a PDO? Szerintem így is az.

Link to comment
Share on other sites

sandor676

Nem ír ki hibát.

A probléma ott van, hogy nem illeszti be az adatokat az adatbázisba, valamint nem töltödik fel a fájl a megadott mappába.

Ezen kívül: az adatbázist szeretném levédeni Injection támadás ellen, valamint a feltöltött fájlokat is védetten szeretném tárolni.

Link to comment
Share on other sites

kléni

Ne használj keyword-öt az SQL-ben, adj meg rendes fájlnevet a move_uploaded_file függvénynek, és kövest amit belinkeltem. Ezzel megoldódnak a hibák amiket írtál.

Link to comment
Share on other sites

payskin

 

Bocs, hogy ezt mondom, de ez egy nagy rakás baromság. :D

 

Az első:

 

However, imagine that later the application retrieves your username from the database, and uses string concatenation to include that value a new query.

 

Tehát feltételezzük azt a kódot, ami az adatok első rögzítésekor prepared statementen keresztül ment, de később lekérdezi ezt az adatot, hogy egy másik lekérdezésbe pedig konkatenálja? Ööö... meglehetősen valószínűtlen. Másrészt nem látom, hogy hogyan nem fog MySQL hibába futni? Legjobb tudomásom szerint a PDO nem enged több MySQL-parancsot futtatni egy menetben (kivéve talán az exec?) tehát, például, a Little Bobby Tables eset akkor sem működne, ha nem volna prepared statementben a paraméter.

 

A második:

 

$pdo->query('SET NAMES gbk');

 

Na jó. :fetreng:

 

Ennyi erővel töröljük le a francba az egész adatbázist, nem? De most komolyan, használtál életedben más -- egzotikus -- kódolást, mint a sima ascii, a latin2 vagy az utf8? Mert ha nem, akkor benne vagy a válasz végén a felsorolásban:

 

Don't use a vulnerable character set for connection encoding (you only use utf8 / latin1 / ascii / etc)

 

Ok, pipa, mehetünk tovább. De azért is érdemes kikapcsolni az emulált prepared statementeket (nálunk ki is van), mert a mysqlnd csak így adja vissza helyes típussal a lekérdezett adatokat. (Mármint az int-eket számként.)

 

A harmadik, ami a tábla nevét REQUEST-ből illeszti be, az már a legalja. :)

 

Szóval, nem vagyok meggyőzve. ;)

 

 

Link to comment
Share on other sites

payskin

Nem ír ki hibát.

A probléma ott van, hogy nem illeszti be az adatokat az adatbázisba, valamint nem töltödik fel a fájl a megadott mappába.

Ezen kívül: az adatbázist szeretném levédeni Injection támadás ellen, valamint a feltöltött fájlokat is védetten szeretném tárolni.

  1. Kezdd azzal, hogy beformázod rendesen a kódot, hogy olvasni lehessen. Amíg ez nincs meg, én biztos nem kezdek el benne hibát keresni.
     
  2. Ellenőrizni kéne a hibajelzés (error_reporting) beállításait. Ha direkt beleírsz valami hülyeséget az elejébe, vagy lehagysz egy pontosvesszőt, kapsz hibát?
     
  3. Az adatbázis-kezelésnél vagy lefut a try rész, vagy jön a catch-ből a hibaüzenet, olyan nincs, hogy nem ír bele az adatbázisba, de nincs hibaüzenet. Magyarul, idáig valószínűleg nem jut el a program futása. Akkor pedig stratégiailag elhelyezett echo('WTF?'); parancsokkal ki kéne deríteni, hol hal meg. De a legjobb volna az elején egy error_reporting(-1); parancsot beküldeni.
     
  4. Mit tudunk a szerverről? Hányas PHP-t használunk?

Link to comment
Share on other sites

kléni

Akkor én nem olvastam el elég figyelmesen. De én az elsőt választottam, és a DSN-ben megadom a karakterkódolást minden esetben. Ez biztosan nem árt, és nem kell arra hagyatkozni, hogy nem lesz ufó-kódolású a tábla.

Link to comment
Share on other sites

payskin

Igazad van, megnézem majd én is. :oké:

Link to comment
Share on other sites

arpsoft

Van az adatbázisodban "table" nevű tábla?

Van "foldername" nevű könyvtárad?

 

Fogadok, hogy valahonnan másoltad a kódot és ezeket hozzá kéne passzítani a te rendszeredhez.

Link to comment
Share on other sites

payskin

Pacsi, arpsoft, ritkán jársz felénk! :)

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...