Gå til innhold

Lageret - Tråden hvor forslag til gjenbrukbar PHP-kode legges


Anbefalte innlegg

Videoannonse
Annonse

Ja såklart =) hadde det meget travelt da jeg skrev posten, så jeg glemte det helt...

 

Dette scriptet laster opp og organiserer filer på en enkel måte.. Du velger filen du vil laste opp, deretter velger du katergori filen tilhører, og deretter laster du den opp. Denne filen vil bli plassert i mappen som tilhører kategorien. Du har også mulighet til å slette filer som er lastet opp ved å trykke på et lite rødt ikon.

 

Hele poenget med dette scriptet er at det ikke skal være behov for en database. På denne måten kan mange bruke det uten å måtte bruke penger på et webhotell + database.

 

Jeg velger å ikke offentliggjøre demoen da scriptet ikke har noen form for sikkerhet.

 

PS: Lenke sendt per PM

Lenke til kommentar

Med sessionstyrt innlogging rundt, så vil du jo få en god løsning. Om det var det du mente ang. sikkerhet. Eller er du rett for xss-angrep o.l.?

 

Men ja; kjørte opp koden på localhost, for å leke meg. Mulighet for å administrere kategoriene hadde jo også vært kjekt; er jo ikke vanskelig å opprette mapper eller scanne etter nye mapper med php heller ;)

Lenke til kommentar

Ja, koden min er ekstremt mottakelig for xss angrep :hrm:

 

Ja det var det jeg hadde tenkt som neste steg.. pluss at jeg skal flytte det meste av 'logikken' fra index.php inn i klassene og organisere de litt bedre slik at den blir lettere å migrere til andre servere.

 

Men har ikke alt for mye fritid nå til dags.. Jobben i Forsvaret tar alt for mye av tiden min, så jeg får se om jeg orker å fortsette på det.

 

Takk for heads-up uansett :)

Emil

Lenke til kommentar

Den passer inn her, men kanskje ikke i den tråden hvor alt skal lagres etterhvert.

 

Dette er området for diskusjon rundt script, og kode som blir lagt ut, uansett type, sikkerhet, størrelse, funksjon osv. - Vil bare si at scriptet er nyttig for folk som ikke har en trang for sikkerhet, for folk som er i begynnelsen av og programmere/kode i php, og vil kanskje kunne lære av scriptet, siden det benytter mange funksjoner som så oftes blir brukt heller skjeldent enn ofte.

 

Det jeg skulle ønske var at noen som faktisk drev med dette som jobb, og hadde erfaring fra å jobbe med dette til daglig, hadde postet en kode. - Spesielt jeg som er mye interessert i OOP og ekstra spesielt interessert i Joomla! moduler som er kodet for phun :p - Da tiden min i framtiden kommer til og gå ekstra mye med til akkurat dette CMS'et.

Lenke til kommentar
  • 2 uker senere...
  • 2 måneder senere...
  • 2 måneder senere...
Noen som har en meget god innloggnings klasse? - topp sikkerhet osv. :p

"Topp sikkerhet osv" ... nei, dette høres nå snedig ut.

 

 

Innlogging kan foregå på temmelig mange ulike måter. Mange nettsteder (facebook, google, etc) benytter cookies til å holde på brukerinfo. Mer kritiske nettsteder baserer seg på sessions. Da enten i form av at sesjonen avsluttes etter f.eks. fem minutter uten forespørsler til server, eller så termineres sesjonen når nettleseren stenges.

 

Trafikken mellom maskinene kan sendes i klartekst (http) eller kryptert (https), og det er ikke uvanlig å verifisere med sertifikater (skandiabanken). Nevnte bank tilbyr også sms-verifisering for å sjekke at du er nettopp deg (noe også chess, netcom m.fl. gjør). Egentlig finnes uendelig mange ulike måter å verifisere brukere på.

 

Men det du ønsker deg er vel heller en implementasjon av pålogging - og ikke en utgreiing over hvilke løsninger som finnes. Så la oss si man skal lage et helt simpelt påloggingsscript. En enkel løsning kan være basert på .htaccess. Da vil serveren (Apache) ta seg av hvorvidt bruker skal ha tilgang til systemet eller ei. Men siden vi er i en PHP-tråd, er det vel mest interessant å diskutere php-baserte løsninger?

 

Et eller annet lurt sted må korrekt brukernavn og/eller passord være lagret. Normalen er at begge deler trengs for å bli verifisert. Og slik info blir av de fleste dynamiske systemer lagret i en database. Passordet er gjerne hashet (md5, sha1, etc), slik at ikke en gang systemadministrator kan hente ut passordet fra databasen. Alternativet er å lagre passordet i f.eks. flatfiler (eller direkte i .php-fila), men det blir nå opp til utviklers valg. Dumt er det iallefall å putte brukernavn og passord i en fil som er tilgjengelig for andre enn php-scriptet!

 

Vel, tenkte jeg skulle avslutte her med at gode kode-eksempler finner du på google. Men av to tilfeldige artikler jeg gikk inn på, bekymret den ene forfatteren seg for om man hadde feltlengde på 40 eller 225 tegn i "password"-feltet i databasen (med sha1-kryptering får man ikke lengre strenger enn 40 tegn), og den andre artikkelen hadde slett validering av sql + viste til funksjoner som ble deprecated i 5.3.0 (og er fjernet fra og med PHP 6)

 

Så i mangel av gode treff; nei, ingen som har noen god klasse til deg :tease:

Lenke til kommentar

Mitt beste svar til det, må bli å benytte et rammeverk som håndterer slik for deg. Prepared Statements finnes det temmelig mange ulike løsninger for, og absolutt noe jeg anbefaler deg å ta en titt på :-)

 

Forøvrig hjelper det lite om ett script på siden er "sikkert", hvis annen kode er åpen for SQL-injections. Man er aldri sterkere enn det svakeste ledd ;-)

Lenke til kommentar
  • 2 uker senere...

Enig, og har sett på ulike rammeverk hvordan dem har gjort det og hvordan dem har prøvd på forhinde f.eks. sql-injections.

 

Uansett, ny $_REQUEST[]! (eller $_GET[] ? :p )

 

CSS kode cache script, pluss cache script til innhold (tittel, ingress, body). - Noen som har lyst og dele? :D

Lenke til kommentar

Kanskje på tide med en kodesnutt her?

/**
* Deletes $path and anything it contains recursively. Though it will work
* with relative paths, absolute paths are recommended as functions like chdir
* will change PHPs working directory, thus also changing where the relative
* path is.
*
* @param $path string Directory to delete
* @return boolean Returns true if everything went well, false if not
*/
function deleteDirectoryRecursive($path)
{
//To prevent error messages to appear, when $path doesn't exist we just
// return false right away
if (file_exists($path) === false)
	return false;

//If $path is a directory (which it should be), we will scan it and delete
// anything that exists in it before we delete the directory itself.
elseif (is_dir($path) === true)
{
	$dir = scandir($path);
	for ($i = 0, $len = count($dir); $i < $len; $i++)
	{
		$element = $dir[$i];
		$elementPath = $path.'/'.$element;

		//We should probably skip current level and the level above
		if ($element === '.' || $element === '..')
			continue;

		//If the element is a directory, we'll make a recursive call to this
		// function to make sure we delete any content before deleting the
		// directory itself.
		elseif (is_dir($elementPath) === true)
		{
			if (deleteDirectoryRecursive($elementPath) === false)
				return false;
		}
		elseif (unlink($elementPath) === false)
			return false;
	}
	//We've deleted any content in the directory. Now we can safely delete
	// the directory $path.
	return rmdir($path);
}
//We'll delete $path even if it's not a directory
// (i.e. misuse of this function)
else
	return unlink($path);
}

Kjapt snekret sammen på natta. Utestet i Windows, men bør fungere i og med at jeg ikke bruker unlink på mapper (mener å huske det ikke helt fungerer). Fungerer iallfall i Linux (dvs. strengt tatt bare testet i Fedora). Uansett, returnerer true hvis mappen + innhold blir slettet og false hvis mappen ikke eksisterer eller ikke ble slettet. Den vil forøvrig også stoppe straks noe går galt.

Lenke til kommentar
  • 1 måned senere...

Viste jeg ikke det da? Endret litt på den, nytt eksempel følger.

 

 

<?php

class MySQL {

	private $mysqlAddress;
	private $mysqlUsername;
	private $mysqlPassword;
	private $mysqlDatabase;

	private $mysqlConnection;
	private $mysqlErrors = array ();
	private $mysqlQueries = array ();
	private $mysqlNumQueries = 0;
	private $mysqlNumRows = 0;
	private $mysqlAffectedRows = 0;
	private $mysqlTotalTime = 0;

	public function __construct ( $address, $username, $password, $database ) {
		$this -> mysqlAddress  = $address;
		$this -> mysqlUsername = $username;
		$this -> mysqlPassword = $password;
		$this -> mysqlDatabase = $database;
	}

	public function Connect () {
		if ( is_resource ( $this -> mysqlConnection ) )
			return true;
		elseif ( $this -> mysqlConnection = mysql_connect ( $this -> mysqlAddress,
															$this -> mysqlUsername,
															$this -> mysqlPassword, true ) )
			if ( $this -> SelectDB ( $this -> mysqlDatabase ) )
				return true;
		else
			throw new Exception ( 'Unable to connect to the MySQL-server.' );
	}

	public function SelectDB ( $database ) {
		if ( !is_resource ( $this -> mysqlConnection ) )
			throw new Exception ( 'Not connected to any MySQL-server.' );
		if ( mysql_select_db ( $database, $this -> mysqlConnection ) )
			return true;
		else
			throw new Exception ( 'Unable to select the database.' );
	}

	public function GetNext ( $query, $type = MYSQL_ASSOC ) {
		if ( array_key_exists ( $query, $this -> mysqlQueries ) )
			return mysql_fetch_array ( $this -> mysqlQueries[$query], $type );
		$this -> mysqlQueries[$query] = $this -> Run ( $query );
		return $this -> GetNext ( $query, $type );
	}

	public function Run ( $query ) {
		if ( is_array ( $query ) )
			return array_map ( array ( &$this, 'run' ), $query );
		if ( !$this -> Connect () )
			throw new Exception ( 'Unable to run query while not connected to any MySQL-server.' );
		$time = microtime ( true );
		$resource = mysql_query ( $query, $this -> mysqlConnection );
		if ( !$resource )  
			throw new Exception ( 'Query failed.' );
		else {
			$this -> mysqlNumQueries++;
			$this -> mysqlTotalTime += microtime ( true ) - $time;
			if ( stristr ( $query, 'select' ) )
				$this -> mysqlNumRows = mysql_num_rows ( $resource );
			if ( stristr ( $query, 'insert' ) ||
				 stristr ( $query, 'update' ) ||
				 stristr ( $query, 'delete' ) ||
				 stristr ( $query, 'replace' ) )
				$this -> mysqlAffectedRows = mysql_affected_rows ( $this -> mysqlConnection );
			return $resource;
		}
	}

	public function GetRow ( $query, $type = MYSQL_ASSOC ) {
		return mysql_fetch_array ( $this -> run ( $query ), $type );
	}

	public function GetNumRows () {
		return $this -> mysqlNumRows;
	}

	public function GetAffectedRows () {
		return $this -> mysqlAffectedRows;
	}

	public function GetMysqlConnection () {
		return $this -> mysqlConnection;
	}

	public function GetNumQueries () {
		return $this -> mysqlNumQueries;
	}

	public function GetTotalQueryTime () {
		return $this -> mysqlTotalTime;
	}

	public function GetLastId () {
		return mysql_insert_id ( $this -> mysqlConnection );
	}

	public function Escape ( $string ) {
		return mysql_real_escape_string ( $string, $this -> mysqlConnection );
	}

	public function __destruct () {
		if ( is_resource ( $this -> mysqlConnection ) )
			mysql_close ( $this -> mysqlConnection );
	}

}

?>

 

<?php

try {

	$database = new MySQL ( 'address', 'username', 'password', 'database' );

	while ( $nextRow = $database -> GetNext ( 'SELECT * FROM whatever' ) );
		print_r ( $nextRow );

	print_r ( $database -> GetNext ( 'SELECT * FROM whatever LIMIT 1' ) );

} catch ( Exception $error ) {

	die ( 'An MySQL error occured: ' . $error -> getMessage () );

}

?>

Endret av Jonas
Lenke til kommentar

Ikke helt finpusset, men lar deg hvertfall kryptere strenger/array osv klart til å legges inn i en fil/database osv.

CIK ene er hovednøkler, i tillegg så har brukeren en egen nøkkel ($ckey).

 

define('CIK', '001'); // Define what CIK we are currently using to encrypt data
define('CIK_001', 'ensuperhemmelihnokkel');


/**
* @param string $data Serialized array with encrypted data from @link encrypt()
* @param string $ckey User crypto key
* @return mixed Decrypted data
*/
function decrypt($srldata, $ckey) {
 $data = unserialize($srldata);
 if(isset($data['iv']) && sizeof($data) == 5) {
// We got some of it, hopefully all of it.
$td = mcrypt_module_open($data['algo'], '', $data['mode'], '');
$iv = base64_decode($data['iv']);
$ks = mcrypt_enc_get_key_size($td);

$key = crypto_get_key($ks, $ckey, constant('CIK_'.$data['cik']));

mcrypt_generic_init($td, $key, $iv);

$decrypted = unserialize(mdecrypt_generic($td, base64_decode($data['cdata'])));
if(is_array($decrypted)) {
  $decrypted['crypto_algo'] = $data['algo'];
  $decrypted['crypto_mode'] = $data['mode'];
}
 } else {
if($data) {
  $decrypted = $data;
} else {
  $decrypted = $srldata;
}
 }

 return $decrypted;
}

/**
* @param mixed $data Data to encrypt
* @paramstring $ckey User crypto key
* @return string Serialized array with encrypted data and metainformation
*/
function encrypt($data, $ckey='') {
 if(!empty($ckey)) {
$td = mcrypt_module_open('rijndael-256', '', 'cbc', '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
$ks = mcrypt_enc_get_key_size($td);

$key = crypto_get_key($ks, $ckey, constant('CIK_'.CIK));

/* Intialize encryption */
mcrypt_generic_init($td, $key, $iv);

/* Encrypt data */
$encrypted['cdata'] = base64_encode(mcrypt_generic($td, serialize($data)));
$encrypted['algo']  = 'rijndael-256';
$encrypted['mode']  = 'cbc';
$encrypted['iv']	= base64_encode($iv);
$encrypted['cik']   = CIK;
/* Terminate encryption handler */	

mcrypt_generic_deinit($td);
mcrypt_module_close($td);

return serialize($encrypted);
 } else {
return serialize($data);	
 } 

}

function crypto_get_key($ks, $ckey, $cik) {
 /* Create key */
 $key1 = md5($ckey);
 $key2 = md5($cik);

 $key = substr($key1, 0, $ks/2) . substr(strtoupper($key2), (round(strlen($key2) / 2)), $ks/2);
 $key = substr($key.$key1.$key2.strtoupper($key1),0,$ks);

 return $key;
}

Lenke til kommentar
  • 4 uker senere...

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...