Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP: Upload-vika II

Sivun loppuun

Neme [25.12.2007 14:56:18]

#

Noniin, monet pyysivät että laittaisin koodin mukaan niin eiköhän sitä saisi tulla muistakaa että koodin kopiointi on ehdottomasti kielettyä mikäli tulen näkemään koodin niin sakkoja saa tulla tulemaan vaan.

Ongelmat:

1. Kun uploadaa kuvan niin sitten se tulee esimerkiksi tuohon malliin: http://palveluntarjoaja.com/~tunnus/upload// <- Tuossa oli suoraan yksi virhe, kaksi kauttamerkkiä.

2. Osoite tulee tälläiseen malliin: http://palveluntarjoaja.com/~tunnus/upload//kuvagif <- taas virhe joka on seuraavalainen elikkä kuvagif, mutta se on pääte gif siis siihen ei tule sitä pistettä .gif.

Tiedostot ovat tässä:

* class.php *

<?php

class imageupload
{
	// Julkiset variablet
	public $path = '';
	public $errorStr = '';
	public $imgurl = '';

	// Salaiset variablet
	private $_errors = array();
	private $_params = array();
	private $_lang = array();
	private $_maxsize = 1048576;

	public $_im_status = false;

	// Julkiset methodit
	public function __construct ()
	{
		require 'config.php';
		$this->_types = $types;
		$this->_lang = $lang;
		$this->_upload_dir = $upload_dir;
		$this->_maxsize = $maxsize;

		$this->path = $PHP_SELF;

		if (is_array($_FILES['__upload']))
		{
			$this->_params = $_FILES['__upload'];
			if (function_exists('exif_imagetype'))
				$this->_doSafeUpload();
			else
				$this->_doUpload();

			if (count($this->_errors) > 0)
				$this->_errorMsg();
		}
	}

	public function allowTypes ()
	{
		$str = '';
		if (count($this->_types) > 0) {
			$str = 'Sallitut tiedostot: (';
			$str .= implode(', ', $this->_types);
			$str .= ')';
		}

		return $str;
	}

	// Salaiset methodit
	private function _doSafeUpload ()
	{
		preg_match('/\.([a-zA-Z]+?)$/', $this->_params['name'], $matches);
		if (exif_imagetype($this->_params['tmp_name']) && in_array(strtolower($matches[1]), $this->_types))
		{
			if ($this->_params['size'] > $this->_maxsize)
				$this->_errors[] = $this->_lang['E_SIZE'];
			else
				$this->_im_status = true;

			if ($this->_im_status == true)
			{
				$ext = substr($this->_params['name'], -4);
				$this->new_name = md5(time()).$ext;

				move_uploaded_file($this->_params['tmp_name'], $this->_upload_dir.$this->new_name);

				$this->imgurl = 'http://'.$_SERVER['HTTP_HOST'].preg_replace('/\/([^\/]+?)$/', '/', $_SERVER['PHP_SELF']).$this->_upload_dir.$this->new_name;
			}
		}
		else
			$this->_errors[] = $this->_lang['E_TYPE'];
	}

	private function _doUpload ()
	{
		preg_match('/\.([a-zA-Z]+?)$/', $this->_params['name'], $matches);
		if(in_array(strtolower($matches[1]), $this->_types))
		{
			if ($this->_params['size'] > $this->_maxsize)
				$this->_errors[] = $this->_lang['E_SIZE'];
			else
				$this->_im_status = true;

			if ($this->_im_status == true)
			{
				$ext = substr($this->_params['name'], -3);
				$this->new_name = md5(time()).$ext;

				move_uploaded_file($this->_params['tmp_name'], $this->_upload_dir.$this->new_name);





				$this->imgurl = 'http://'.$_SERVER['HTTP_HOST'].preg_replace('/\/([^\/]+?)$/', '/', $_SERVER['PHP_SELF']).$this->_upload_dir.'/'.$this->new_name;
			}
		}
		else
			$this->_errors[] = $this->_lang['E_TYPE'];
	}

	function _errorMsg()
	{
		$this->errorStr = implode('<br />', $this->_errors);
	}
}

?>
* confing.php *

<?php

$title = 'Upload';

$types = array('jpg', 'gif', 'png', 'psd', 'pspimage');
$maxsize = 1024*1024;

$upload_dir = 'uploads/';

$lang['E_TYPE'] = 'Väärä tiedostotyyppi.';
$lang['E_SIZE'] = 'Tiedoston koko ei ole hyväksyttävä!';

?>
* index.php *

<?php
require 'class.php';
require 'config.php';
$im = new imageupload();
if ($_POST['__upload'])
{
	header('location: '.'http://'.$_SERVER['HTTP_HOST'].preg_replace('/\/([^\/]+?)$/', '/', $_SERVER['PHP_SELF']));
}
?>
		<h1>Valitse tiedosto:</h1>
		<form method="post" enctype="multipart/form-data" action="<?=$im->path?>">
			<input type="file" name="__upload" size="72" />
			<input type="submit" value="Upload" />
		</form>
		<p><?=$im->allowTypes();?></p>
		<div class="block">
			<?
				if ($im->_im_status == true)
				{
					echo '<h2>Lataus onnistui!</h2>
							<p class="codes">
					<label for="codebb">Foorumin allekirjoitus:</label><br />
					<input type="text" size="40" value="[url='.$im->imgurl.'][img='.$im->imgurl.'[/img][/url]" onclick="javascript:this.focus();this.select();" readonly="true" /><br />
					<label for="codedirect">Suora linkki:</label><br />
					<input type="text" size="40" value="'.$im->imgurl.'" onclick="javascript:this.focus();this.select();" readonly="true" /></p>';
				}
				elseif (!empty($im->errorStr))
				{
					echo '<div class="errors">'.$im->errorStr.'</div>';
				}
				else
				{
					echo '
					';
				}
			?>

Sitten tässä on mukana log.dat, ja kansio upload mutta niissä on tyhjää.
Mikäli auttaa niin siitä kiitos jo etukäteen ja mikäli haluaa neuvoa messengerin kautta niin listaan vaan tällänen pätkä: cx.sixpack@hotmail.com

Mod. edit: php-tagit

tsuriga [25.12.2007 16:50:03]

#

Ois tämä varmaan mahtunu ensimmäiseen lankaankin.

Tulostele noita arvoja ($this->new_name, $ext) suorituksen eri vaiheissa niin eiköhän se sillä selviä. Tiedoston päätteen voit hakea myös pathinfo-funktiolla, ja kuvan tyypin voisi hakea mime-tyypistä. Antaisit luokalle mieluummin parametrina nuo $types yms., luokasta saisi samalla useamman instanssin, nyt tuo toimii singletonin tapaan.

Neme [25.12.2007 17:12:20]

#

Äh, voitko laittaa nyt noi koodit että miten laitan?

Antti Laaksonen [25.12.2007 17:42:28]

#

Koodi näyttää ensinnäkin olevan suora kopio osoitteesta:
http://kreoton.net/php-image-upload-script

Funktiossa _doUpload on rivi:

$this->imgurl = 'http://'.$_SERVER['HTTP_HOST'].preg_replace('/\/([^\/]+?)$/', '/', $_SERVER['PHP_SELF']).$this->_upload_dir.'/'.$this->new_name;

Tämä voisi olla kohta, jossa kuvan osoitteeseen ilmestyy ylimääräinen kenoviiva. Kokeile siis muuttaa tämä rivi samanlaiseksi kuin funktiossa _doSafeUpload.

Lisäksi funktiossa _doUpload on rivi:

$ext = substr($this->_params['name'], -3);

Ongelmana on, että pääte lisätään tiedoston nimeen sellaisenaan, jolloin väliin ei myöskään tule pistettä. Tässäkin voisi toimia paremmin funktion _doSafeUpload tyyli:

$ext = substr($this->_params['name'], -4);

Tosin tämä toimii vain, jos tiedoston päätteessä on kolme kirjainta. Parempi ratkaisu on esim. tsurigan ehdottama pathinfo-funktio:

$pinfo = pathinfo($this->_params['name']);
$ext = "." . $pinfo["extension"];

Lumpio [25.12.2007 17:53:33]

#

Neme kirjoitti:

Noniin, monet pyysivät että laittaisin koodin mukaan niin eiköhän sitä saisi tulla muistakaa että koodin kopiointi on ehdottomasti kielettyä mikäli tulen näkemään koodin niin sakkoja saa tulla tulemaan vaan.

I lol'd

tsuriga [25.12.2007 18:08:49]

#

Jaaniin onhan tuossa mime-tyypin tarkistus nyt kun tarkemmin kahtuu. pathinfon voi myös korvata one-linerilla substr( $path, strrpos( $path, '.' ) ) (piste tulee mukaan), jos ei tarvitse tiedostopolusta muita osia.

Tzaeru [25.12.2007 18:12:19]

#

Lumpio kirjoitti:

Neme kirjoitti:

Noniin, monet pyysivät että laittaisin koodin mukaan niin eiköhän sitä saisi tulla muistakaa että koodin kopiointi on ehdottomasti kielettyä mikäli tulen näkemään koodin niin sakkoja saa tulla tulemaan vaan.

I lol'd

http://kapsi.fi/tzaeru/Minun_elite_PHP_koodia_By_TZAERU.txt

Tein ihan itse!

Neme [25.12.2007 18:29:54]

#

Ai että joku vielä pälli 28- vuotias kehtaa huijata rahaa vastaan perkele!

ajv [25.12.2007 18:43:39]

#

Ootko siis maksanu tuosta?

Neme [25.12.2007 19:12:14]

#

Olen.

Antti Laaksonen [25.12.2007 19:59:42]

#

Jos nyt ymmärsin tilanteen oikein, melko röyhkeää toimintaa poistaa koodista alkuperäisen tekijän tiedot, suomentaa tekstit surkeasti ("salaiset methodit") ja pyytää vielä rahaa toimimattomasta koodista. Toivottavasti koodin kaupustelija ymmärtää palauttaa rahat takaisin ja hävetä tekojaan.

neau33 [25.12.2007 20:23:39]

#

HEIPPA!

Jos nyt ymmärsin oikein niin 99.9999999 jne... % putkassakin esiintyvistä naamoista on saanut enemmän ideoita netistä, kuin pukannut takas puhtaasti omia (including me) & esitellessään 'ideoitaan' - kylmästi lyönyt alle oman nimensä jne...

Neme [25.12.2007 22:22:14]

#

Niin ja hänhän omistaa vielä kotisivun oliko se (http://tatsi.net) ja olikohan se Marko Tarvinen yms.

Tzaeru [26.12.2007 02:17:07]

#

neau33 kirjoitti:

HEIPPA!

Jos nyt ymmärsin oikein niin 99.9999999 jne... % putkassakin esiintyvistä naamoista on saanut enemmän ideoita netistä, kuin pukannut takas puhtaasti omia (including me) & esitellessään 'ideoitaan' - kylmästi lyönyt alle oman nimensä jne...

Niin. Samalla periaatteella mm. lumilautailijan saadessa ison hypyn nähdessään idean, että "hyppäänpä tuplasti pidemmälle siten, että teen triplasti enemmän voltteja kans!" on hän vain pahainen matkija.

Eri asia kopioida yksi yhteen kuin saada -idea-. "Näinpäs jonkun muun tekemän koodin, kopioinpa sen ja suomennan kommentoinnit.." on vähän eri asia kuin "Wau, demo jossa käytetään raytraceriä, teenpä samanlaisen."


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta