HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL Kandidatnr: Eksamensdato: 11. mai 2004 Varighet: Fagnummer: Fagnavn: Klasse(r): 3 timer LV197D Webprogrammering med PHP FU Studiepoeng: 6 Faglærer(e): Svend Andreas Horgen tlf: 73 55 92 69 Hjelpemidler: Oppgavesettet består av: Alle skriftlige hjelpemidler 4 oppgave, på totalt 6 sider (inkludert forsiden) Merknad: Oppgaveteksten kan beholdes av studenter som sitter eksamenstiden ut. Viktig: Les hele oppgaveteksten for hver oppgave før du setter i gang. Planlegg tiden godt. Hvis du føler det blir vanskelig å skrive kode, er det bedre å skissere logikken med pseudokode eller ord enn ikke å gjøre noe. Lykke til! Side 1 av 8
Oppgave 1 Behandling av skjema (11%) Et skjema har denne HTML-koden: <h1>personlig informasjon</h1> <form action="farge.php" method="get"> Hva er ditt navn? <input type="text" name="navn"><br> Din alder? <input type="text" name="alder" size="2"><br> Hva er din favorittfarge?<br> <input type="radio" name="favorittfarge" value="rød"> Rød er best<br> <input type="radio" name="favorittfarge" value="gul"> Gult er kult<br> <input type="radio" name="favorittfarge" value="grønn"> Grønt er skjønt<br> <p> <input type="submit" name="knapp" value="vis oppsummering"> </form> Lag et så enkelt script som mulig for å lage følgende oppsummering: Svar: Fort å glemme at knappen overføres, og at stor bokstav må brukes. Bruk av foreach er nok enklest, men GET direkte fungerer også. For dette skjemaet blir det hipp som happ, men et større skjema med mange elementer er gevinsten stor. <?php echo "<h1>oppsummering</h1>"; foreach($_get as $nokkel => $verdi) { if( $nokkel <> "knapp"){ //skriver ikke ut info om knappen echo "<b>". ucfirst($nokkel). ":</b> $verdi <br>"; //slutt foreach?> Side 2 av 8
Oppgave 2 Filbehandling (25%) Lag et script som produserer tabellen vist til høyre basert på tekstfilen til venstre. Hint: Funksjonen trim($tekststreng) returnerer en tekststreng hvor alle mellomrom, \n, \t og liknende som er i starten og slutten av $tekststreng, er fjernet. Svar: Det er lurt å lese inn like timer i en assosiativ matrise. Det er en elegant måte å telle opp like linjer på. Deretter er det bare å skrive ut matrisen. Det fins andre måter også, men assosiativt har vi fokusert mye på i kurset. <?php $fp = fopen("timeliste.txt", "r"); // åpner tekstfil i lesemodus $matrise = array(); //klargjør matrise for bruk while ( $linje = trim(fgets($fp)) ) { //trim fjerner /n fra en linje if (!isset($matrise[$linje]) ) { $matrise[$linje] = 1; else { $matrise[$linje]++; //alternativt kan if-else-testen sløyfes helt, //og feilmelding undertrykkes, vha en alfa foran: //@$matrise[$linje]++; //slutt while-løkke echo "<table border='1'>"; echo "<tr><th>antall timer</th><th>antall forekomster</th></tr>"; foreach ($matrise as $nokkel=>$verdi) echo "<tr><td>$nokkel</td><td align='center'>$verdi</td></tr>"; echo "</table>";?> Side 3 av 8
Oppgave 3 En handlekurvløsning (40%) Du skal nå spille oppgaven som konsulent som har fått i oppdrag å lage en handlekurvløsning for en nyoppstartet nettbutikk som selger klær. Følgende krav er ønskelig: Den besøkende (heretter kunden) skal få listet opp varer i form av navngitte lenker, og kunne trykke på lenkene for å få mer informasjon om aktuell vare. Det skal også være en knapp ved siden av hver vare, og når den klikkes legges en ny forekomst av varen i kundens handlekurv. Nettstedet forventer høye besøkstall. Det eksisterer en database per i dag som skal brukes. Den har blant annet en tabell med navn varetabell med de navngitte feltene vareid, varenavn, pris, kategori og beskrivelse. Varene er strukturert etter tre ulike kategorier, nemlig kvinner, menn og barn. Anta at brukernavn er user, passord pass, og at host er localhost. Det er ikke tid til å lage hele systemet under denne eksamen, men du skal svare på følgende spørsmål: a) Skisser den koden i PHP som henter ut informasjon om de varene fra databasen som tilhører valgt kategori og lager et skjermbilde som vist under. Du skal ikke lage siden for å velge kategori, men får vite at kategorien er oppgitt i spørrestrengen kvinner i dette eksempelet. Et klikk på lenken skal lede til mer informasjon om den aktuelle varen (se oppgave b), mens trykk på knappen skal føre til at varen blir lagt til i kundens handlekurv (se oppgave c). Svar: Trenger ikke lage funksjon som gjort her. Det er ikke noe poeng. function nyvare($navn, $enid) { echo "<form action='handlekurv.php' method='post'>\n"; echo "<p>varenavn: <a href=visinformasjon.php?id=$enid'> //Lenken må ha et argument med vareid i seg. $navn</a> \n "; echo "<input type='submit' name='knapp' value='legg til i handlekurv'>\n"; echo "<input type='hidden' value='$enid' name='verdi'></p>\n"; echo "</form>\n\n"; //slutt, skrive ut ny vare Side 4 av 8
$db = mysql_connect("host", "mysql_user", "mysql_password"); mysql_select_db("varedatabase", $db); //viktig å huske å ikke hardcode kvinner. Kategorien skal hentes //fra spørrestrengen, ellers er ikke løsningen særlig //dynamisk/fleksibel. $sql = "SELECT * FROM varetabell WHERE kategori = ". $_GET['kat']; $resultat = mysql_query($sql, $db); while ($rad = mysql_fetch_array($resultat)) { $navn = $rad['varenavn']; $ID = $rad['vareid']; nyvare($navn, $ID); b) Når lenken for en vare fra skjermbildet i oppgave a) ble klikket på, skal all informasjon om den vises. Lag et lite script som gjør dette. Svar: Ser her at tilkoblingen kan generaliseres ut i en funksjon, men på den annen side oppnås ikke så mye med det. Målet med denne oppgaven er å vise at en behersker å hente ut data fra en database, samt at id som ble oversendt fra forrige side benyttes. //visinformasjon.php vil motta id i spørrestrengen. $db = mysql_connect("host", "mysql_user", "mysql_password"); mysql_select_db("varedatabase", $db); $sql = "SELECT * FROM varetabell WHERE vareid = ". $_GET['ID']; $resultat = mysql_query($sql, $db); $rad = mysql_fetch_array($resultat); //bare en rad echo "Varenavn: ". $rad['varenavn']; echo "<br>pris: ". $rad['pris']; echo "<br>kategori: ". $rad['kategori']; echo "<br>beskrivelse: ". $rad['beskrivelse']; //feilsjekking kan også med fordel foretas. c) Når kunden legger varer i handlekurven, skal dette registreres. Gjentas dette flere ganger skal antallet øke. For å kjøpe tre kjoler må altså den øverste knappen trykkes tre ganger. For å sikre brukervennlighet skal trykk på knappen vise at varen er registrert, samtidig som samme side vises. Lag et script som realiserer dette. Side 5 av 8
Svar: Denne delen kan med fordel ligge øverst i samme script. Sjekk på om knappen eksisterer, hvis den gjør det har brukeren lagt til noe i handlekurven. Vis varene uansett. <?php session_start(); //echo "<pre>"; //var_dump($_post); if (!empty($_post['knapp']) ) { //registrer en vare i handlekurv $vareid = "varenr_". $_POST['verdi']; if (!isset ($_SESSION[$vareId]) ) { $_SESSION[$vareId] = 1; else { $_SESSION[$vareId]++; echo "Varen ".$_POST['varenavn']." ble lagt til"; //koden fra oppgave a) kommer her. d) Hvilke sikkerhetsmessige aspekt er det viktig å tenke på i en slik løsning? Hvilke tiltak kan gjøres? Eksemplifiser. Svar: Noen elementer er: Løsningen er enkel, noe som skyldes at eksamen er på 3 timer. I en virkelig løsning (en slik løsning) vil det være viktig å tenke på sikkerhet. Sensitive opplysninger bør overføres med SSL. Noen nettbutikker krever innlogging av kunden før kjøp kan foretas. I så fall må brukernavn og passord lagres på tjeneren, og personopplysninger bør ikke komme ut. Lagring av passord i klartekst bør unngås. Validere inngangsdata for å unngå SQL-injection. Eksempel bør være med, de har hatt mye om dette. Kan for eksempel sjekke om strengen har semikolon og start på SQL-kommentar i seg, regulært uttrykk er å foretrekke. Funksjonen mysql_escape_string() er også aktuell. Bruke sessions i stedet for cookies til selve handlevognsløsningen, for å ikke avvise de som har cookies avslått. Side 6 av 8
Oppgave 4 Flervalgsoppgave (24%) Under finner du noen spørsmål og påstander. Kryss av for bare ett alternativ, det du vurderer til å passe best. For hvert riktig svar får du 2 poeng, for hvert galt svar får du -1 poeng, og krysser du av Vet ikke får du 0 poeng på spørsmålet. Du får ikke uttelling for å begrunne svarene dine. Riv ut denne siden og lever den sammen med resten av besvarelsen din, eller skriv opp oppgavenummer og ditt alternativ på form: - c 1. Hva er riktig? a. Cookies er en nødvendighet for å få sessions til å fungere b. Cookies er spesifisert i protokollen HTTP c. Cookies lagres både på tjeneren og på klienten 2. Sikkerheten med sessions a. er avhengig av hvorvidt ID-ene kan holdes hemmelig b. fungerer bra siden ID-en er vanskelig å gjette c. er fullgod siden informasjonen lagres på tjeneren og ikke på klienten 3. Bruk av date("d", 1106042012) vil returnere a. dagen for tidspunktet 11.juni 2004 klokka 20:12 b. teksten Tue siden tallet i andre argument er et tidsstempel c. en feilmelding fordi andre argument er positivt 4. Vil bruk av cookies sikre at informasjon om en besøkende kan langtidslagres? a. ja, for nettlesere deler cookies seg i mellom b. nei c. ja, men det er ikke lurt å lagre sensitive opplysninger i cookies 5. PHP opererer ikke med datatyper! a. Riktig, for eksempel vil alt som overføres med GET være tekst b. Feil, men de deklareres ikke nødvendigvis eksplisitt c. Riktig, her skiller PHP seg fra de fleste andre programmeringsspråk 6. Hva skjer i denne koden? $i = 0; while ($i<12) { if ($i = 8) { echo $i*2; else { echo $i; $i++; a. Alle tall mellom 0 og 11 skrives ut på en ny linje. b. 12345671691011 vises i nettleseren. c. Ingen av de to punktene over, i hvertfall! 7. En stor norsk nettavis vil at den besøkende skal bli opplyst om dagens dato. Dersom det er den 25. april 2004 og scriptet som forespørres har setningen echo date("i dag er det den d. M"). "<br>"; a. vil ikke programmereren ha oppnådd målet sitt b. vil teksten I dag er det den 25. april vises i nettleseren c. vil teksten I dag er det den 25. Apr vises i nettleseren 8. Hva er riktig? For at en funksjon skal kunne endre flere argumenter a. må kodeordet global brukes inne i funksjonen b. må argumentet overføres som referanse ved hjelp av & operatoren c. må flere return-setninger forekomme etter hverandre a b c Vet ikke Kommentarer til noen spørsmål: Side 7 av 8
2: Dersom en hacker får tak i en session-id, er informasjonen tilgjengelig. Han/hun vil da overta dine data. Mer informasjon: Søk etter referer-headeren. 3. Dette er et timestamp, på tross av at det ser ut som om dette kan være et tidspunkt. Leksjonene forklarer hvordan tidsstempel brukes i datofunksjonene i PHP. 4. Cookies kan være avslått, og da vil ikke informasjonen langtidslagres som forventet. 6. Uendelig while-løkke, tilordning skjer inne i if-ens hode. 7. Prøv selv. Husk at det fins en rekke bokstavkoder for datoer. For å skrive ut ønsket tekst, må koden bli: echo date("\i \d\a\g \e\r \d\e\t \d\e\n d. M"). "<br>"; Side 8 av 8