Säkerhet i enkelt PHP-script (hämta data från txt-filer)

Trädvy Permalänk
Medlem
Plats
Örebro
Registrerad
Jun 2006

Säkerhet i enkelt PHP-script (hämta data från txt-filer)

Hej!

Är väldigt grön på PHP och håller på att göra följande:

- Två textfiler innehållandes x-antal rader med information
- Tre funktioner på sidan.

  1. Hämta och visa en slumpmässig rad text från dokument1.txt

  2. Hämta och visa en slumpmässig rad text från dokument2.txt

  3. Hämta och visa en slumpmässig rad text från antingen dokument1.txt eller dokument2.txt

Allt fungerar perfekt. Men eftersom jag är nybörjare i PHP-träsket tänkte jag höra mig för om jag gjort många nybörjarmisstag när det gäller säkerhet i koden? Själva textfilerna kommer nog till slut innehålla uppemot några tusen rader styck. Kan det bli för mycket att ladda varje gång? Bör jag kanske använda en databas istället?

Koden följer här nedanför:

<?php echo "<form action='' method='post'><input type='submit' name='dokument1' value='Dok 1' /></form>"; echo "<form action='' method='post'><input type='submit' name='dokument2' value='Dok 2' /></form>"; echo "<form action='' method='post'><input type='submit' name='any' value='Slumpa' /></form>"; if(isset($_POST['dokument1'])) { $f_contents = file('dokument1.txt'); $result = $f_contents[rand(0, count($f_contents) - 1)]; echo $result; } if(isset($_POST['dokument2'])) { $f_contents = file('dokument2.txt'); $result = $f_contents[rand(0, count($f_contents) - 1)]; echo $result; } if(isset($_POST['any'])) { $dokument1 = file('dokument1.txt'); $line_dokument1 = $dokument1[rand(0, count($dokument1) - 1)]; $dokument2 = file('dokument2.txt'); $line_dokument2 = $dokument2[rand(0, count($dokument2) - 1)]; $both = array($line_dokument1, $line_dokument2); $result = $both[rand(0, count($both) - 1)]; echo $result; } ?>

Trädvy Permalänk
Medlem
Registrerad
Okt 2011

Ser inga säkerhetshål i koden. Akta dig bara från att köra något i stil med

file($_POST['fil'] .'.txt');

, då kan folk läsa vilka filer de vill genom att tex skicka in "../../../../../passwords%00". %00 är en null byte och gör att resten av text strängen ('.txt') försvinner. Så då skulle koden köra file('../../../../../passwords').

Programmerare -> PHP | HTML | CSS | JS | Java.

Trädvy Permalänk
Medlem
Plats
Lund
Registrerad
Nov 2003

Inga säkerhetshål men du kanske vill ändra på dina if-satser. Fundera på vad som händer om någon anropar

POST /?dokument1&dokument2&any

edit: stavfel

Trädvy Permalänk
Medlem
Plats
Örebro
Registrerad
Jun 2006
Skrivet av Psyence:

Inga säkerhetshål men du kanske vill ändra på dina if-satser. Fundera på vad som händer om någon anropar

POST /?dokument1&dokument2&any

edit: stavfel

Hur menar du att jag kan ändra på dem? Dokumenten som anropas heter egentligen t.ex. dokument_text.txt. Kan jag döpa om dem för att göra det säkrare på något sätt?

Fick även tipset att lägga till:

echo htmlspecialchars($result);

Om någon skulle få för sig att bråka med och lägga in data i txt-filerna.

txt-filerna skyddas förövrigt via htaccess med deny all på *.txt, vilket jag gissar är tillräckligt.

Trädvy Permalänk
Medlem
Plats
Finland
Registrerad
Maj 2004

Jag antar att Psyence syftar på att du borde byta till else if, så att inte alla filer returneras om man POST-ar alla 3.

I ditt fall ändras ju aldrig innehållet i filerna, därför har ingen föreslagit att escapea texten. Skulle detta däremot vara möjligt så bör du också escapea med någon lämplig metod då texten sparas.