Gå til innhold

PHP og lagring av variabler


Anbefalte innlegg

Hei!

Driver med et lite skoleprosjekt her med MySQL og PHP. Hensikten er å lage en hjemmeside som gjør enkelte ting med en database og jeg sliter litt med sending av variabler i PHP.

Jeg har lagd en login side hvor man oppgir brukernavn og passord for å logge inn i databasen og det fungerer greit hvor data fra skjemaet blir da sendt inn i POST funksjonen i PHP og man får da opp index.php:

<?php
$username = $_POST [username]; 
$password = $_POST [password]; 
session_register($username); 
session_register($password); 
$con = mysql_connect("localhost",$username,$password);
if (!$con)
 {
echo "<h1>You provided wrong username and password!</h1>"; 

die('Could not connect: ' . mysql_error());


 }
else {
mysql_select_db("project", $con);

echo "Database connected, what would you like to do now?"; 
echo '</br>'; 
echo '<a href="select.php">view all movies/a> '; 
}

(Ja jeg ser det mangler en '<' på den siste html link taggen der).

 

Det er når man klikker på select.php problemene oppstår. Jeg ønsker på en måte at man ikke skal kunne se alle filmene i databasen uten at man har logget inn og kommet inn til index.php (jeg har ikke så mye erfaring med PHP og serverprogrammering generelt, bare Java). Som dere ser her så lagrer jeg brukernavn og passordet i noen session variabler som jeg antageligvis trenger for å kunne ta i bruk disse to og "sende" de videre til select.php.

Koden for select.php er ikke ferdig enda, hensikten er bare foreløpig å se om denne videresendelsen fungerer (noe den ikke gjør)

<html>
<body>

<?php
session_start(); 
require ("index.php"); 

echo "Hello World!";
?>

</body>
</html> 

 

Når jeg da klikker på denne får jeg feilmelding, fordi jeg vet at variablene ikke blir videresendt.

You provided wrong username and password!

Could not connect: Access denied for user 'www-data'@'localhost' (using password: NO)

 

Det er brukernavnet, passordet og databaseserveren fra index.php som ikke blir lagret på en skikkelig måte. Noen ideer? (Jeg hardkodet localhost inn som dere kan se, så den jeg bare putte inn i en variabel).

 

Alternativt, er å putte alt inn i index.php og bruke forskjellige variabler for brukervalg slik at alt kan gjøres inni index.php.

Endret av William_S
Lenke til kommentar
Videoannonse
Annonse
Gjest Slettet+9871234

Det er brukernavnet, passordet og databaseserveren fra index.php som ikke blir lagret på en skikkelig måte. Noen ideer? (Jeg hardkodet localhost inn som dere kan se, så den jeg bare putte inn i en variabel).

Det ser ut som at du bruker MySQL lokalt og da har du gjerne installert XAMPP. Du må sette et passord i MySQL.

 

Les mer på slutten av punkt 1.2 i denne

 

http://www.oopschool.com/phpBB3/viewtopic.php?f=11&t=174

 

tråden i avsnittet som begynner med:

 

By default, when you install XAMPP there is no password set for the 'root' MySQL user.

Kanskje det hjelper deg.

Lenke til kommentar

 

Det ser ut som at du bruker MySQL lokalt og da har du gjerne installert XAMPP. Du må sette et passord i MySQL.

 

Les mer på slutten av punkt 1.2 i denne

 

http://www.oopschool.com/phpBB3/viewtopic.php?f=11&t=174

 

tråden i avsnittet som begynner med:

 

By default, when you install XAMPP there is no password set for the 'root' MySQL user.

Kanskje det hjelper deg.

 

Nei bruker nok ikke XAMPP, alt er installert seperat om du skjønner. Og ja jeg har satt et passord på MySQL serveren og det fungerer prikkfritt å logge inn på databasen ved hjelp av et skjema. Det er når jeg ønsker å benytte loginen videre det skjærer seg litt. Login vinduet er strengt tatt ikke krav heller så jeg kan heller gjøre det enkelt og i stedet bare lage en index side hvor man blir spurt om hva man ønsker å gjøre også ta det derifra på hver enkelt side.

Lenke til kommentar
Gjest Slettet+9871234

Det er brukernavnet, passordet og databaseserveren fra index.php som ikke blir lagret på en skikkelig måte. Noen ideer?

Jeg har ikke opplevd det på en lokal testserver, men jeg har opplevde det på delte webservere, ved at jeg må sette skrive adgang på mappe og fil. I dreamwaever Mx 2004

 

chmod 777

 

Det oppnås ved å sette permissions ved å høyreklikke på filen / mappen i remote view. Må installere et tillegg i Mx 2004. I nyere versjoner er det bare å høyreklikke i remote view.

 

Jeg vet at noe tilsvarende kan hende på Vista maskiner om man intallerer MySQL / Php i program files folderen.

 

Jeg har ikke sett på koden din så langt, da jeg har erfaring med at dette ikke har med kode å gjøre.

Lenke til kommentar

William_S: Du har en virkelig grunnleggende feil i designet ditt. Med mindre du benytter HTTP med SSL-kryptering blir MySQL-passordet sendt i klartekst. Er dette noe du virkelig ønsker?

 

Uansett, problemet ditt er at du ikke har noen session når du setter variablene. Dessuten benytter du en høyst utdatert måte å sette session-variabler på (session_register er markert utdatert i PHP 5.3), og du benytter den heller ikke korrekt (du måtte kjørt session_register('password') og session_register('username') for å få lagret det unna). En bedre måte å løse ting på er derfor følgende:

<?php
session_start(); //Denne funksjonenen initialiserer session

$_SESSION['foo'] = 'bar'; //Dette er en mer korrekt måte å sette verdier i session på

Du kan så i en annen side gjøre følende:

session_start(); //Ny init. av session siden du ønsker tilgang til verdiene

echo "Elementet foo i session har verdi: ".$_SESSION['foo'];

Endret av Ernie
Lenke til kommentar

Ikke lagre passord i sessions!

 

Letteste er bare å lagre bruker id i en session og om den er satt så er brukeren logget inn, ellers så er han ikke

if(!isset($_SESSION['user_id'))
// send til login siden

 

(edit) (det under her ble med cookies:P)

Et alternativ er å lagre brukerid og en sessionkey i cookie. Når en side lastes så sjekkes det om id'en som er lagret i cookien stemmer overens med dens sessionkey i databasen og cookie[session_key].

 

Da har du

Cookie:

user_id

session_key

 

Database tabellen

id

brukernavn, epost, etc etc.

sessionkey

 

Siden lastes og du tar en sjekk i databasen:

Select bruker where id = (cookie[user_id]) and sessionkey = (cookie[session_key])

 

om den finner noe så er brukeren logget inn, ellers send til innloggingsskjema.

 

Innloggingskjema kan være som før, men ved en godkjent innlogging så oppdaterer du brukeren i databasen med ny sessionkey og setter cookie[session_key] og cookie[session_id] til riktig verdier

 

Forståelig?

Alt er psuedo kode, så ikke veldig brukanes.

 

Lykke til :)

Endret av eigan
Lenke til kommentar

Hei!

Angående sikkerhet så er ikke det så farlig siden dette er bare et lokalt skoleprosjekt og ikke noe som skal ut i den store verden eller online. Jeg er fullstendig klar over at passordet blir sendt i klartekst. Tror kanskje jeg gjør det litt annerledes og litt mer basic, da jeg er helt nybegynner i PHP og kanskje gaper over litt for mye på en gang her.

Lenke til kommentar

Ikke lagre passord i sessions!

 

Får spørre.. Noen spesiell grunn til det? Eller, man skal ikke ha behov for å lagre passordet til brukeren i klartekst noen plasser, med riktig design (noe hovedposteren definitivt ikke har, men det er en annen sak). Men verden vil ikke gå under hvis du lagrer et passord i session.

 

Din "løsning" er .. uhm .. rar. Du bygger et session system på det eksisterende session systemet? Hvorfor?

Lenke til kommentar

Ikke lagre passord i sessions!

 

Får spørre.. Noen spesiell grunn til det?

Fordi sessions lagres som filer på serveren og kan lett leses.

 

Din "løsning" er .. uhm .. rar. Du bygger et session system på det eksisterende session systemet? Hvorfor?

Hm ja ser det nå :p Dette er systemet jeg bruker med cookies hvor du kan lagre sessionkeyen i cookies ikke session. Så bytte ut session med cookies så er det mer riktig.

*oppdatere post*

Endret av eigan
Lenke til kommentar

Ikke lagre passord i sessions!

 

Får spørre.. Noen spesiell grunn til det?

Fordi sessions lagres som filer på serveren og kan lett leses.

 

 

Det er hovedsaklig bare et problem i shared hosting scenarioer, og vil tro bare hvis hosteren ikke bruker noe a la suexec.. Og hvis alle php scripts kjører under samme host, alle på serveren tilgang til php filene dine også, inkludert de filene der sql bruker / passord blir lagret. Så jeg ser ikke helt den store forskjellen. Man kan forresten også endre hvordan session blir implentert.

 

http://phpsec.org/projects/guide/5.html

 

Den viser også en ganske nifty måte å lagre DB brukernavn og passord på en sikker måte, men igjen - krever support fra hosteren (siden det, etter det jeg forstår, må lagres i httpd config filen).

Lenke til kommentar

På mine egne sider lagres brukernavn og en random string på 50 chars som en "key" i sessionvariabler etter man har logget inn.

Key'n lagres også i sqlservern knyttet opp mot brukernavnet, som matches og byttes ut ved hver sidevisning.

 

Samtidig sjekkes også om IP'n er den samme som ved forrige sidevisning og selvfølgelig tid mellom hver sidevisning for å logge ut gamle sessions..

 

Vet ikke om det er overkill / svakheter ved dette men nå er det ikke så mange som bruker dette systemet, og har funket grei sålangt :)

Lenke til kommentar

Hei!

Lagde loginen litt annerledes enn det jeg hadde tenkt, men nå har jeg en løsning som fungerer greit for mitt bruk. Nå er det heller slik at jeg logger inn på selve sidene i stedet for inn i databasen (som man blir logget inn i etter at man har logget inn på sia).

Og sessionvariablene fungerer aldeles utmerket selv med timeout. :) Er egentlig intet krav i oppgaven til at man må ha login i det hele tatt.

Endret av William_S
Lenke til kommentar

Når du først holder på, kan det være greitt å gjøre ting skikkelig. Like greit å komme inn i den vanen med en gang :)

 

Passord hashing : http://phpsec.org/articles/2005/password-hashing.html

 

Han bruker forresten en modul kalt DB for databasen, som kan være greit å bli vant med å bruke (enten det, eller PDO). Brukt riktig vil den også hjelpe med SQL Injection problemer.

Endret av Terrasque
Lenke til kommentar
Gjest Slettet+9871234

Filen (konfigureringsfilen) med passord bør jo også for å gjøre det sikrere lagres en mappe opp (nærmere roten) i forhold til der prosjektet ligger.

 

PDO + "prepared statements" gjør også ting sikrere. SQL injections er (nesten) umulige.

 

Har du løst problemet? Var det så enkelt som å høyreklikke på fil / mappe og endre lese til skriveadgang? Jeg har ikke hatt tid til å se på koden din. Andre gjør tydeligvis det.

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...