Permalänk
Medlem

Snabb fråga [php]

Jag har utvecklat ett simpelt närvarosystem för en skola jag jobbar på i php.

Allt är uppe & fungerar fint.

Men... Tidigare när jag var på väg hem kom jag att tänka på en sak!

info om systemet.

  1. Användaren loggar in. Session startas

  2. Användaren matar in uppgifter

  3. Uppgifterna skrivs till ett dokument

Nu till frågan.

Alla användare har samma lösenord & datan skrivs till samma fil för alla användare(text).

Vad händer om 2x eller kasnke 10x användare registrerar data samtidigt?

Kan data gå miste? Systemet kommer ha ca 600 användare(Föräldrar som registrerar tider för sina barn).

När data skrivs till dokumentet så har jag flaggat med 'Append'

Det vill säga att data läggs till & ska inte kunna försvinna.

Någon?

Tack

Visa signatur

[IT-Dept]
Ryzen 1700 OC - 32 - 1070

Permalänk
Medlem
Skrivet av martin_cs:

Jag har utvecklat ett simpelt närvarosystem för en skola jag jobbar på i php.

Allt är uppe & fungerar fint.

Men... Tidigare när jag var på väg hem kom jag att tänka på en sak!

info om systemet.

  1. Användaren loggar in. Session startas

  2. Användaren matar in uppgifter

  3. Uppgifterna skrivs till ett dokument

Nu till frågan.

Alla användare har samma lösenord & datan skrivs till samma fil för alla användare(text).

Vad händer om 2x eller kasnke 10x användare registrerar data samtidigt?

Kan data gå miste? Systemet kommer ha ca 600 användare(Föräldrar som registrerar tider för sina barn).

När data skrivs till dokumentet så har jag flaggat med 'Append'

Det vill säga att data läggs till & ska inte kunna försvinna.

Någon?

Tack

Det där är inge vidare bra design.
När filen öppnas för filskrivning blir den låst.

Du måste isåfall hantera det genom tex en whileloop där du kollar om filen är låst. Är den låst, vänta 100ms och försök igen. När låset är släppt, öppna för skrivning, spara, släpp lås.

Annars kan ju en bättre design vara en fil per user.
Eller använda databas; Då tar DBMSen hand om låsningar så att flera users kan inserta samtidigt.

Skickades från m.sweclockers.com

Permalänk
Medlem

varför skriver du inte bara emot en mysql databas? då försvinner dina problem

Visa signatur

Min dator: Silent Base 600 | 1700X @ 3.9Ghz | MSI Gaming X 1080TI | RM750X | 512Gb M2 | 16Gb 3200mhz Ram | S34E790C @ 3440x1440
Tjejens dator: Define r4 | i5 3570k @ 4.2ghz | GTX Titan | 750w Supernova | 240gb SSD | 32gb ram
Citera/Tagga för svar!

Permalänk
Medlem
Skrivet av martin_cs:

Alla användare har samma lösenord & datan skrivs till samma fil för alla användare(text).

Vad händer om 2x eller kasnke 10x användare registrerar data samtidigt?

Då kommer ditt program inte fungera som tänkt. När en process skriver till en fil så låser processen filen för skrivning (för att förhindra att andra processer skriver över datan). Det du då behöver göra är att kontrollera om det överhuvudtaget går att skriva till filen i ditt program eller ej. DOCK så är ditt system väldigt dumt konstruerat från början. Varför använder du inte bara en SQL-databas? Då uppstår inga sådana här problem och det går dessutom betydligt fortare att göra uppslag om vi talar om många användare. Vill du absolut inte använda dig av databaser (vilket jag avråder dig från att inte göra) är mitt andra råd att varje användare har en egen fil.

Om din fil nu av någon anledning skulle råka bli korrupt så ligger hela systemet nere. Är datan utspridd på flera filer och en fil blir korrupt så påverkar det inte övriga användare av systemet. Sedan undrar jag lite över din roll i det hela. Har du blivit tilldelad denna uppgift av skolan och är det faktisk något de kommer att använda sig av i sin verksamhet de bedriver? För i så fall är det otroligt viktigt med säkerhet, tillgänglighet etc.

Av ditt inlägg låter det lite som att du inte har hållt på med programmering eller systemutveckling speciellt länge, och jag undrar om du egentligen är lämpad att skriva ett program som skall driftsättas och brukas av många användare (jag menar inget illa med detta, men exempelvis så MÅSTE du lägga otroligt mycket vikt vid just säkerhet, tillgänglighet etc. så att användare inte kan manipulera andras data eller rent av hacka ditt system då det skulle få förödande konsekvenser).

Visa signatur

Citera för svar!

Stationär: Fractal Design Define R6 | Asus Z370-P | Intel i7 8700k @ 3.7 Ghz | Corsair Vengeance LPX 32GB CL15 @ 3000 Mhz | Asus STRIX GTX960 4GB | Fractal Design Celsius S24 | 5 TB HDD | 250GB SSD (Samsung 850 EVO), 128GB SSD (Crucial M4) | Corsair HX 850W | W10
Bärbar: Sony Vaio Pro 13.3" | i7-4500U | 8GB RAM | 256GB SSD | Ubuntu

Permalänk
Medlem

Tack för svar.

Jag överdrev lite. det är inte 600 på en fil.

Det är ca 20 filer med kanske 25 skrivningar till varje fil.

Jag kollar självklart om det går att öppna filen med en simpel if sats.

dock ska jag lägga till en loop som någon ovanstående sa.

Varför jag inte använder databaser?

Jag kan helt enkelt inte.

Jag har för vana att jobba i Java & c++, & har knappt jobbat med webbutveckling alls. PhP är något jag börjat leka med på senare tid!

En fil per user fungerar inte i det här fallet. Då datan ska registreras klass vis!

Hursomhelst har jag flera månader på att göra systemet så bra som möjligt

Som det ser ut nu så behöver användaren ett lösenord, för att komma till nästa sida. Sidan går inte att komma åt utan lösenord.

Detta har inget med mina riktiga sysslor att göra egentligen, utan var för skoj skull & för att underlätta verksamheten,

Visa signatur

[IT-Dept]
Ryzen 1700 OC - 32 - 1070

Permalänk
Skrivet av martin_cs:

Hursomhelst har jag flera månader på att göra systemet så bra som möjligt

Då borde du verkligen ta och sätta dig in i databaser. MySQL är superenkelt att använda och kommer lösa de här problemen. Att flera användare ska kunna skriva mot samma fil samtidigt är vansinnigt dålig design, upplagt för problem.

Finns obegränsat med guider där ute och om du behöver mer hjälp finns nog många här på forumet som kan ställa upp

Permalänk
Medlem
Skrivet av martin_cs:

Varför jag inte använder databaser?

Jag kan helt enkelt inte.

Jag har för vana att jobba i Java & c++, & har knappt jobbat med webbutveckling alls. PhP är något jag börjat leka med på senare tid!

Okej, databaser är ju dock långt ifrån en teknik som endast används på webben. Men mitt förslag är att du sätter dig in i SQL och kanske mer specifikt MySQL om det är det du vill använda i samband med PHP och därefter skriver om ditt system mot att använda sig av det istället för att lagra allt på fil. Jag hoppas även att du saniterar all input innan ditt program hanterar indatan så att ingen får för sig att utföra någon form av injection eller annat mindre trevlig. Antag ALLTID att all data som användaren skickar är, cookies som du läser etc. är skadlig. Det är otroligt enkelt för någon med ytterst liten kunskap att manipulera forms och den data som ditt program behandlar. Skulle någon lyckas med detta skulle det som sagt kunna få förödande konsekvenser. Jag hoppas även att du dagligen (minst) tar backup på filerna.

Sedan funderar jag lite över vad du menade i ditt första inlägg med att alla användare har samma lösenord? Om min användare t.ex. heter redretro och din martin_cs, har båda våra användare då t.ex. lösenorde "kaka"? Om så är fallet, hur säkert är då detta? Om låt säga en elev skulle lyckas klura ut lösenordet (kan ju alltid finnas någon förälder som råkar dela med sig av det) så skulle ju då eleven kunna gå in och rapportera närvaro för samtliga elever i hela skolan. Det är inte speciellt säkert.

Visa signatur

Citera för svar!

Stationär: Fractal Design Define R6 | Asus Z370-P | Intel i7 8700k @ 3.7 Ghz | Corsair Vengeance LPX 32GB CL15 @ 3000 Mhz | Asus STRIX GTX960 4GB | Fractal Design Celsius S24 | 5 TB HDD | 250GB SSD (Samsung 850 EVO), 128GB SSD (Crucial M4) | Corsair HX 850W | W10
Bärbar: Sony Vaio Pro 13.3" | i7-4500U | 8GB RAM | 256GB SSD | Ubuntu

Permalänk
Medlem
Skrivet av Full Strike:

Då borde du verkligen ta och sätta dig in i databaser. MySQL är superenkelt att använda och kommer lösa de här problemen. Att flera användare ska kunna skriva mot samma fil samtidigt är vansinnigt dålig design, upplagt för problem.

precis, ditt nuvarande system osakar bara problem. plus att mysql är lättare att lära sig än själva php.
med mysql kan du även göra så att varje elev/lärare/förälder har egna inlogg och därför kan du lättare lagra data. vilket uppskattas av föräldrar som lätt glömmer lösenorden.
sen kan du strukturera upp datan väldigt mycket mer och göra så att alla 600 pers skulle kunna skriva samtidigt, istället för att 1 öppnar filen och låser den.

och btw, om alla har samma lösenord, då kan ju alla se vad andras ungar har för information, hur aktiva och sånt det är? hur schysst och säkert är det?

Visa signatur

Min dator: Silent Base 600 | 1700X @ 3.9Ghz | MSI Gaming X 1080TI | RM750X | 512Gb M2 | 16Gb 3200mhz Ram | S34E790C @ 3440x1440
Tjejens dator: Define r4 | i5 3570k @ 4.2ghz | GTX Titan | 750w Supernova | 240gb SSD | 32gb ram
Citera/Tagga för svar!

Permalänk
Medlem

jag tackar för svar & åsikter!

ska börja kolla lite på databaser & säkerhet. Det skadar ju aldrig.

Jag kommer att jobba vidare med detta. Såg det mest som ett projekt för att utvecklas.

Känner att jag har fått svar på mina frågor! tack & godnatt!

Visa signatur

[IT-Dept]
Ryzen 1700 OC - 32 - 1070

Permalänk
Medlem
Skrivet av martin_cs:

En fil per user fungerar inte i det här fallet. Då datan ska registreras klass vis!

Hursomhelst har jag flera månader på att göra systemet så bra som möjligt

Angående säkerhet, så är det inga hemliga uppgifter som kan orsaka konsekvenser över huvudtaget.

Som det ser ut nu så behöver användaren ett lösenord, för att komma till nästa sida. Sidan går inte att komma åt utan lösenord.

Detta har inget med mina riktiga sysslor att göra egentligen, utan var för skoj skull & för att underlätta verksamheten,

Såg att du lagt till ovanstående efter att jag svarat senast. Givetvis kan du ju lagra på en fil per user även om datan skall registreras klassvis? Allt beror ju på hur du valt att designa ditt system. Ett logiskt upplägg för mig vore att du har en mapp för varje klass samt en fil för varje elev i klassen. Men återigen, sätt dig in i MySQL och använd INTE filer för att lagra datan i.

Även om det inte är några hemliga uppgifter som lagras så kan det ju fortfarande få konsekvenser. Nu vet jag inte vad det är för skola som du jobbar på, men åtminstone på gymnasiet är ju närvarorapporter kopplat till CSN-bidrag. Tror inte det skulle vara speciellt roligt om CSN upptäcker att skolan fuskat med sådan rapportering. Även i grundskolan förmodar jag att närvarorapporter fyller någon form av viktig funktion, annars finns det ju inget skäl att utföra dem.

Angående att sidan inte går att komma åt utan lösenord, hur garanterar du detta? Vilka åtgärder har du vidtagit för att en användare inte skall kunna komma åt sidan utan lösenord? Har du saniterat datan? Hur sparar du om en användare är inloggad eller ej?

Om systemet är live just nu skulle jag råda dig från att stänga ner det, implementera systemet m.h.a. databaser istället samt se över säkerheten. Därefter skulle jag be någon med lite kött på benen att se över systemet, eventuellt försöka penetrera det.

Visa signatur

Citera för svar!

Stationär: Fractal Design Define R6 | Asus Z370-P | Intel i7 8700k @ 3.7 Ghz | Corsair Vengeance LPX 32GB CL15 @ 3000 Mhz | Asus STRIX GTX960 4GB | Fractal Design Celsius S24 | 5 TB HDD | 250GB SSD (Samsung 850 EVO), 128GB SSD (Crucial M4) | Corsair HX 850W | W10
Bärbar: Sony Vaio Pro 13.3" | i7-4500U | 8GB RAM | 256GB SSD | Ubuntu

Permalänk
Medlem
Skrivet av RedRetro:

Såg att du lagt till ovanstående efter att jag svarat senast. Givetvis kan du ju lagra på en fil per user även om datan skall registreras klassvis? Allt beror ju på hur du valt att designa ditt system. Ett logiskt upplägg för mig vore att du har en mapp för varje klass samt en fil för varje elev i klassen. Men återigen, sätt dig in i MySQL och använd INTE filer för att lagra datan i.

Även om det inte är några hemliga uppgifter som lagras så kan det ju fortfarande få konsekvenser. Nu vet jag inte vad det är för skola som du jobbar på, men åtminstone på gymnasiet är ju närvarorapporter kopplat till CSN-bidrag. Tror inte det skulle vara speciellt roligt om CSN upptäcker att skolan fuskat med sådan rapportering. Även i grundskolan förmodar jag att närvarorapporter fyller någon form av viktig funktion, annars finns det ju inget skäl att utföra dem.

Angående att sidan inte går att komma åt utan lösenord, hur garanterar du detta? Vilka åtgärder har du vidtagit för att en användare inte skall kunna komma åt sidan utan lösenord? Har du saniterat datan? Hur sparar du om en användare är inloggad eller ej?

Om systemet är live just nu skulle jag råda dig från att stänga ner det, implementera systemet m.h.a. databaser istället samt se över säkerheten. Därefter skulle jag be någon med lite kött på benen att se över systemet, eventuellt försöka penetrera det.

Systemet kommer användas sällan. 3ggr per år ca.

Det är inte närvaro för varje dag. Utan vilka dagar ungen är där under ett lov.

Just nu använder jag session för inloggning.

Men som du säger. Jag måste se över inloggning. Kan ju som sagt bli jobbigt om ett barn får för sig att lägga in massor av strunt.

Att hacka sidan kommer nog alltid att gå för den som har kunskap. Det blir ju även dom säkraste sidorna.

Allvarligt talat så förstår jag inte varför man skulle vilja hacka den lilla 'skit' sidan. Men finns ju folk till allt.

Jag tackar igen för svar och säger godnatt

Skickades från m.sweclockers.com

Visa signatur

[IT-Dept]
Ryzen 1700 OC - 32 - 1070

Permalänk
Medlem
Skrivet av martin_cs:

Systemet kommer användas sällan. 3ggr per år ca.

Det är inte närvaro för varje dag. Utan vilka dagar ungen är där under ett lov.

Just nu använder jag session för inloggning.

Men som du säger. Jag måste se över inloggning. Kan ju som sagt bli jobbigt om ett barn får för sig att lägga in massor av strunt.

Att hacka sidan kommer nog alltid att gå för den som har kunskap. Det blir ju även dom säkraste sidorna.

Allvarligt talat så förstår jag inte varför man skulle vilja hacka den lilla 'skit' sidan. Men finns ju folk till allt.

Jag tackar igen för svar och säger godnatt

Skickades från m.sweclockers.com

En liten skitsida är perfekt för en ny scriptkiddie som nyss lärt sig om SQL injektion att få belöning för det han "åstadkommit". Ger honom motivation att fortsätta etc.

Visa signatur

AW3423DW QD-OLED - Ryzen 5800x - MSI Gaming Trio X 3090 - 64GB 3600@cl16 - Samsung 980 Pro 2TB/WD Black SN850 2TB

Permalänk
Medlem
Skrivet av martin_cs:

Systemet kommer användas sällan. 3ggr per år ca.

Det är inte närvaro för varje dag. Utan vilka dagar ungen är där under ett lov.

Just nu använder jag session för inloggning.

Men som du säger. Jag måste se över inloggning. Kan ju som sagt bli jobbigt om ett barn får för sig att lägga in massor av strunt.

Att hacka sidan kommer nog alltid att gå för den som har kunskap. Det blir ju även dom säkraste sidorna.

Allvarligt talat så förstår jag inte varför man skulle vilja hacka den lilla 'skit' sidan. Men finns ju folk till allt.

Jag tackar igen för svar och säger godnatt

Skickades från m.sweclockers.com

Ah okey, trodde att det var veckovis rapportering eller liknande. Om systemet skall användas sällan kanske det inte är samma krav på t.ex. tillgänglighet, men säkerheten bör åtminstone vara densamma. När det kommer till säkerhet brukar jag alltid tänka: "Hur mycket tid (och i praktiken pengar) är det värt att lägga ner på att säkra upp applikationen/programmet?" och sedan väga in variabler som hur många som skall använda systemet, hur känslig datan som lagras är, samt ungefär vilken kunskap användaren kan tänkas ha för att kringå säkerheten. I ditt fall är det ju trots allt inte överdrivet många användare som skall använda systemet, datan i sig är kanske inte känslig, men konsekvenserna av att datan är felaktig kan ju trots allt ses som rätt allvarlig och egentligen kan man förmodligen förvänta sig att kunskapsnivån hos barnen är relativt låg (medan den hos föräldrarna kan vara större). Det gäller alltså att hitta en balans mellan kostnad och en rad andra variabler och därmed avgöra på vilken nivå man skall lägga säkerheten.

I ditt fall skulle jag definitivt se över inloggningen (vilket du nämnt att du skall göra), sanitera och filtrera all typ av input som kommer från användaren (POST, GET, Cookies och HTTP-headers), använda mig av prepared statements samt tillämpa ett "least privilege"-tänk när du sätter upp databasen (och möjligtvis ett separat konto för just den databas som hanterar detta system). Dessa åtgärder bör förhindra de mest vanliga typer av angrepp och hålla ungar som hittat någon "rolig" kodrad på nätet i schack.

God natt och sov gott!

Visa signatur

Citera för svar!

Stationär: Fractal Design Define R6 | Asus Z370-P | Intel i7 8700k @ 3.7 Ghz | Corsair Vengeance LPX 32GB CL15 @ 3000 Mhz | Asus STRIX GTX960 4GB | Fractal Design Celsius S24 | 5 TB HDD | 250GB SSD (Samsung 850 EVO), 128GB SSD (Crucial M4) | Corsair HX 850W | W10
Bärbar: Sony Vaio Pro 13.3" | i7-4500U | 8GB RAM | 256GB SSD | Ubuntu

Permalänk
Medlem

http://dbwebb.se/oophp/
https://www.youtube.com/playlist?list=PL458DB83F8CDFA904

Det tar nog inte mycket mer än en helg att gå igenom materialet såpass att du kan fixa en fungerande databas till din sida.

Permalänk
Datavetare

Till alla som anser att det är självklart att man ska logga data i en relationsdatabas, vad vinner jag på att göra detta med en relationsdatabas?
Detta får mig att tänka på denna

Övergripande funktion är detta

  1. Användaren loggar in. Session startas

  2. Användaren matar in uppgifter

  3. Uppgifterna skrivs till ett dokument

Nu är detta inget system med några prestandakrav, men vad jag förlorar på att dra in en databas för att göra något som effektivt sett handlar om att skriva en sekvens med faktum till beständig lagring är ett par tiopotenser i prestanda. Lär inte heller bli några SQL-injections problem om man inte har en databas.

Det som beskrivs här måste väl ändå kunna lösas med någon hyfsat standardiserat metod där man i slutändan faktisk bara får detta loggat till en fil på ett effektivt, säkert (inga race-conditions) och korrekt sätt (t.ex. med garantier kring när data faktiskt är lagrat). Tyvärr är filsystemet hjärndöd designat i Windows, varför ska man inte kunna läsa en fil som ett annat program har öppet (det fungerar i rätt många andra OS...), men sådant borde vara abstraherat om det finns färdigpaketerade lösningar.

Är för dåligt insatt i PHP för att föreslå en lösning, i t.ex. Node JS hade man ju enkelt kunna skapat en "worker-process" som är den enda som jobbar mot filen och alla HTTP-sessioner skulle då använda meddelanden för att kommunicera med processen som hanterar filen. Endera gör man detta asynkront, d.v.s HTTP-sessionen kör fire-and-forget vilket då inte garanterar att data faktiskt ligger på fil innan sessionen är klar (men detta är väldigt snabbt och skalbart) eller så gör man det synkront där "worker-processen" skickar tillbaka ett meddelande när den är klar med ett visst jobb (fortfarande inga problem att ha väldigt många samtida sessioner "in-flight", så högre latens men fortfarande skalbart).

Å andra sidan finns det saker här som ändå kräver en databas, att koppla användarnamn till saker som vilken klass de tillhör, deras rättigheter, lösenord etc är typiska saker som har en relation och därmed är en perfekt match för att organiseras m.h.a. en relationsdatabas.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer