Gå til innhold

Symbol replace, upload


Anbefalte innlegg

Har litt problemer med å få lastet opp filer som inneholder symbol '

Hvis filen heter I'm super vil den hete "m super" etter upload.

 

Prøvd alle måter replacement :( men tror det ligger i at filen allerede har navnet

"m super" før replacement funksjonen kommer inn.

 

Kan noen se hvordan jeg kan gjøre dette?

 

<?php
$target = "upload/";
$target = $target . basename( $_FILES['uploaded']['name']);


if(move_uploaded_file($_FILES['uploaded']['tmp_name'], $target))
{
echo "The file ". basename( $_FILES['uploadedfile']['name']). " has been uploaded";
}
else
{
echo "Sorry, there was a problem uploading your file.";
}
}

 

fra HTML fila;

 

<form enctype="multipart/form-data" action="upload.php" method="POST">
Please choose a file: <input name="uploaded" type="file" /><br />
<input type="submit" value="Upload" />
</form>

Lenke til kommentar
Videoannonse
Annonse

La meg tippe at du kjører på windows?

 

sannsynligvis står magic_quotes_gpc på, og filnavnet ditt blir da endret til: "I\'m super" av PHP.

 

basename i windows tolker både / og \ som katalog skiller, og derfor får du ut 'm super fra basename funksjonen.

 

du får se litt på stripslashes og get_magic_quotes_gpc. Poenget med magic_quotes er å beskytte skriptet ditt mot data fra brukeren, så ', ", \ og NUL blir escapet med en \ forran.

 

Edit:

Et tips er å faktisk sjekke hvilke verdier du faktisk får inn, før du bruker noen funksjonskall på dem.

 

printf("<pre>%s</pre>\n", htmlspecialchars(print_r($_FILES, true)));

Endret av footnote
Lenke til kommentar
Skal vel også sies at å bruke annet enn a-zA-Z0-9 i filnavn på nettet er fyfy (punktum er selvfølgelig lov)

 

 

Har prøvd str replace og div annet, får bare ikke med meg noe av det som er før ' om det skulle være i filnavnet. Har prøvd et script som bare lar meg bruke a-z og 1-9 også. Men har dere evt noen scripts på det :) ?

Lenke til kommentar

ingen plasser, jeg testa bare str_replace

i din kode:

<?php
$target = "upload/";
$target = $target . basename( str_replace("'",'',$_FILES['uploaded']['name']));


if(move_uploaded_file($_FILES['uploaded']['tmp_name'], $target))
{
echo "The file ". basename( $_FILES['uploadedfile']['name']). " has been uploaded";
}
else
{
echo "Sorry, there was a problem uploading your file.";
}
}
?>

Lenke til kommentar
ingen plasser, jeg testa bare str_replace

i din kode:

<?php
$target = "upload/";
$target = $target . basename( str_replace("'",'',$_FILES['uploaded']['name']));


if(move_uploaded_file($_FILES['uploaded']['tmp_name'], $target))
{
echo "The file ". basename( $_FILES['uploadedfile']['name']). " has been uploaded";
}
else
{
echo "Sorry, there was a problem uploading your file.";
}
}
?>

 

Det der funka dårlig =/ akkurat samme resultat.. =( Men, er det noen måte jeg kan begrense det til at man bare kan bruke a-z, 1,9 -, _, (, ) og & eller noe :)

Lenke til kommentar

Gi faen i str_replace og se mer nøye på hva Footnote prøver å fortelle deg. Deretter var_dump-er du et par variabler for debug purposes og viser oss hva som skjer.

 

Edit: For å være litt mer konkret: Jeg setter en tier på magic_quotes_gpc er på og at å stripslashe input vil fikse alt.

 

<?php

if ( get_magic_quotes_gpc () ) {

	function stripslashes_deep ( $value ) {
		return is_array ( $value ) ? array_map ( 'stripslashes_deep', $value ) : stripslashes ( $value );
	}

	$_GET	 = array_map ( 'stripslashes_deep', $_GET );
	$_POST	= array_map ( 'stripslashes_deep', $_POST );
	$_COOKIE  = array_map ( 'stripslashes_deep', $_COOKIE );

}

?>

Endret av Jonas
Lenke til kommentar
Gi faen i str_replace og se mer nøye på hva Footnote prøver å fortelle deg. Deretter var_dump-er du et par variabler for debug purposes og viser oss hva som skjer.

 

Edit: For å være litt mer konkret: Jeg setter en tier på magic_quotes_gpc er på og at å stripslashe input vil fikse alt.

 

<?php

if ( get_magic_quotes_gpc () ) {

	function stripslashes_deep ( $value ) {
		return is_array ( $value ) ? array_map ( 'stripslashes_deep', $value ) : stripslashes ( $value );
	}

	$_GET	 = array_map ( 'stripslashes_deep', $_GET );
	$_POST	= array_map ( 'stripslashes_deep', $_POST );
	$_COOKIE  = array_map ( 'stripslashes_deep', $_COOKIE );

}

?>

 

Av en eller annen grunn jonas sa ikke det scriptet ditt meg så mye :p

men prøvde å bruke dette;

 

if (!get_magic_quotes_gpc()){

$_GET = array_map('addslashes', $_GET);

$_POST = array_map('addslashes', $_POST);

$_COOKIE = array_map('addslashes', $_COOKIE);

$_REQUEST = array_map('addslashes', $_REQUEST);

}

 

fortsatt samme, hvis dere ser her, brukte dette i scriptet

"printf("<pre>%s</pre>\n", htmlspecialchars(print_r($_FILES, true)));"

og fikk tilbake

Array

(

[uploaded] => Array

(

[name] => ve got the power.mp3

[type] => audio/mpeg

[tmp_name] => C:\xampp\tmp\php8587.tmp

[error] => 0

=> 4996473

)

 

)

 

 

Prøvde å laste opp en fil med navnet "01 I've got the power.mp3" som test :)

Lenke til kommentar

Dere har hjulpet meg godt i riktig retning :) takk for det, enda ikke funnet noen løsning, men byttet om til GET method i uplastning greia bare for å se, da kommer følgene i get;

 

....php?uploaded=01+I've+got+the+power.mp3&submit=Last+opp

 

Når jeg poster den fra get igjen får jeg; 01 I\'ve got the power.mp3

så er absolutt method='POST' som gjør at problemet oppstår, men er det noen vei jeg kan gå rundt, evt skru av get_magic_quotes_gpc la den være på get, og hente navnet til filen via get istedet for post e.l? :)

 

 

Edit: Prøvd litt forskjellig nå, på en måte fått det til, men ser ut til at det å til og med få det til, skaper litt problemer andre stedet også. Har dere noe script som bare tillater a-z, 1-9 =)?

Endret av TobiasG
Lenke til kommentar

Gjorde litt research, og det viser seg at dette er en liten bug i PHP @ Windows. Windows ser på backslash som en directory seperator, og dermed blir naturligvis bare siste delen av filnavnet tatt med.

 

http://bugs.php.net/bug.php?id=38245

http://bugs.php.net/bug.php?id=31398

 

Er du riktig heldig, så er dette fikset i en nyere versjon. Hvis ikke, så skru av magic_quotes_gpc i PHP.ini.

 

Edit: Uff, ser nå at en av utviklerne ser på dette som intensjonell oppførsel...

Endret av Jonas
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...