Premiär! Fyndchans i SweClockers Månadens Drop

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

Permalänk
Medlem

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; } ?>

Permalänk
Medlem

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

Visa signatur

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

Permalänk
Medlem

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

Permalänk
Medlem
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.

Permalänk
Medlem

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.