När körs PHP-kod i .php-fil blandad med html?
Det är främst om du genererar annan kod ex. sql eller php, som du måste kontrollera din input, använder du post-variabler direkt kan man då mata in skadlig kod som sedan körs.
Om du skapar html-kod kan man mata in ex. javascript eller bilder som innehåller exploits, och på så sätt infektera användare som tror de surfar på en säker site.
Om du inte genererar någon dynamisk kod är det rätt lungt även om de förr funnits buffer overflows i phps hantering av post/get/cookie-data (men det påverkas inte av din kod då).
Om du skapar html-kod kan man mata in ex. javascript eller bilder som innehåller exploits, och på så sätt infektera användare som tror de surfar på en säker site.
Om du inte genererar någon dynamisk kod är det rätt lungt även om de förr funnits buffer overflows i phps hantering av post/get/cookie-data (men det påverkas inte av din kod då).
- JimmyAndersson
- Inlägg: 26417
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
Men om man bortser från buffer overflow's så kan jag inte se hur något man matar in i ett textfält/formulär ska kunna köras om man inte har programmerat väldigt klantigt.
För att ta min kod som exempel (inte när det gäller klant-kodning alltså..)
Där skriver man in användarnamn, lösen, grupp-id (genereras automatiskt, 3000 har bara rätt att läsa och skriva i sin katalog), katalog (skapas automatiskt från /home/användarnamn). Alla uppgifter läggs in i en databas och därifrån hämtar ftp-servern inloggningsuppgifterna.
Ge gärna exempel på hur man skulle skriva i formulär-fälten för att köra annan kod på min server.
edit: För att förtydliga: användaren kan inte mata in något i grupp-id eller katalog.
Det är egentligen bara jag som kan komma åt sidan via en dator i det lokala nätverket, men i det här exemplet låtsas vi att den finns publikt på internet. Sidan har ingen som helst koll på tecknen, allt som skrivs in körs av mysql-kod som lägger till uppgifterna i databasen.
Förklara gärna hur ni skulle köra er egna kod på min server genom att mata in något i formulär-fälten.

För att ta min kod som exempel (inte när det gäller klant-kodning alltså..)

Där skriver man in användarnamn, lösen, grupp-id (genereras automatiskt, 3000 har bara rätt att läsa och skriva i sin katalog), katalog (skapas automatiskt från /home/användarnamn). Alla uppgifter läggs in i en databas och därifrån hämtar ftp-servern inloggningsuppgifterna.
Ge gärna exempel på hur man skulle skriva i formulär-fälten för att köra annan kod på min server.

edit: För att förtydliga: användaren kan inte mata in något i grupp-id eller katalog.
Det är egentligen bara jag som kan komma åt sidan via en dator i det lokala nätverket, men i det här exemplet låtsas vi att den finns publikt på internet. Sidan har ingen som helst koll på tecknen, allt som skrivs in körs av mysql-kod som lägger till uppgifterna i databasen.
Förklara gärna hur ni skulle köra er egna kod på min server genom att mata in något i formulär-fälten.

- JimmyAndersson
- Inlägg: 26417
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
Det kan jag gå med på
men på vilket sätt är det farligt annars?
Om vi plockar ut de viktiga bitarna:
Vad ska man skriva in i text-fältet för att någon ska kunna köra sin kod på min server?
Jag kan inte se hur INSERT INTO tabell (något farligt, osv) kan ställa till med något annat än att den tabellraden kan bli förstörd. Vilket inte är acceptabelt naturligtvis, men nu handlade det ju om hur någon skulle kunna köra sin kod på min sajt.
Koden jag skrivit här över är bara exempel. I den egentliga koden så escapar jag koden och kollar lite andra småsaker.

Om vi plockar ut de viktiga bitarna:
Kod: Markera allt
<input name="abc" id="abc" type="text" size="10" maxlength="16">
$abc = $_POST['abc'];
mysql_query("INSERT INTO tabell (abc, def,
Jag kan inte se hur INSERT INTO tabell (något farligt, osv) kan ställa till med något annat än att den tabellraden kan bli förstörd. Vilket inte är acceptabelt naturligtvis, men nu handlade det ju om hur någon skulle kunna köra sin kod på min sajt.

Koden jag skrivit här över är bara exempel. I den egentliga koden så escapar jag koden och kollar lite andra småsaker.
Gör om din kod till en giltig och fullständig:
mysql_query("INSERT INTO tabell (text) VALUES(\"<? echo $abc ?>\"")
Säg att $abc innehåller exakt:
"); TRUNCATE tabell; SELECT "
Inklusive ":en...
Då skulle summan bli (hoppas jag):
mysql_query("INSERT INTO tabell (text) VALUES(\"\"); TRUNCATE tabell; SELECT \"\"")
Inge bra va?
Även oavsiktligt kommer ":ar att orsaka problem. Därför escapas de, och andra "styrtecken".
mysql_query("INSERT INTO tabell (text) VALUES(\"<? echo $abc ?>\"")
Säg att $abc innehåller exakt:
"); TRUNCATE tabell; SELECT "
Inklusive ":en...
Då skulle summan bli (hoppas jag):
mysql_query("INSERT INTO tabell (text) VALUES(\"\"); TRUNCATE tabell; SELECT \"\"")
Inge bra va?
Även oavsiktligt kommer ":ar att orsaka problem. Därför escapas de, och andra "styrtecken".
- JimmyAndersson
- Inlägg: 26417
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
Då skulle summan bli (hoppas jag):
mysql_query("INSERT INTO tabell (text) VALUES(\"\"); TRUNCATE tabell; SELECT \"\"")
oh crap...
Min riktiga kod är lyckligtvis inte fullt så godkännande som i exemplen här.
Det som tillåts är a-z och 0-9.
Så det här med att köra egen kod på min server handlade alltså om kodrader. Jag tolkade det som att någon kunde köra hela program/sidor (.php-filer) på min server, men nu förstår jag hur ni menar.
mysql_query("INSERT INTO tabell (text) VALUES(\"\"); TRUNCATE tabell; SELECT \"\"")
oh crap...

Min riktiga kod är lyckligtvis inte fullt så godkännande som i exemplen här.
Det som tillåts är a-z och 0-9.
Så det här med att köra egen kod på min server handlade alltså om kodrader. Jag tolkade det som att någon kunde köra hela program/sidor (.php-filer) på min server, men nu förstår jag hur ni menar.
- JimmyAndersson
- Inlägg: 26417
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
Backen skrev tidigare:
Alla rader körs ju även första gången men &_POST['data']; är ju ingenting eftersom ingenting har skickats med POST. När filen körs efter att du tryckt på submit skickas ju även POST variablerna med.
Vill du ha flera formulär och köra olika kod beroende på vilket formular som skickats så kan du tex lägga till ett dolt formularfält med info om vilket formular som skickats.
<input type="hidden" name="formular" value="form1" >
Jag testade det, men det fungerar inget vidare.
Klippte ut de viktigaste delarna ur koden:
Ingen fullständig kod, men ni ser principen.
Problemet är att innan man hinner trycka Submit så innehåller ju inte $formtyp "search_edit", så "Formtyp returnerade inget" visas direkt så fort man kommer in på sidan.
Det skulle bli precis samma sak om jag hade formuläret i php-koden.
Det skulle bli samma sak om man bytte ut if $formtyp mot en koll av submit-knappen.
Jag provde även att lägga if ($formtyp) { innan if ($formtyp == "search_edit") men då hände inget alls när man skrev in ett användarnamn och tryckte Submit.
Så hur 17 gör man?
Alla rader körs ju även första gången men &_POST['data']; är ju ingenting eftersom ingenting har skickats med POST. När filen körs efter att du tryckt på submit skickas ju även POST variablerna med.
Vill du ha flera formulär och köra olika kod beroende på vilket formular som skickats så kan du tex lägga till ett dolt formularfält med info om vilket formular som skickats.
<input type="hidden" name="formular" value="form1" >
Jag testade det, men det fungerar inget vidare.
Klippte ut de viktigaste delarna ur koden:
Kod: Markera allt
<form action="<?echo $_SERVER['PHP_SELF']?>" method="POST">
<input name="search_user" id="search_user" type="text" size="10" maxlength="16">
<input type="hidden" name="formtyp" value="search_edit">
<input type="submit" name="submit" id="submit" value="Sök">
</form>
$forumtyp = $_POST['formtyp'];
$searchuser = $_POST['search_user'];
if ($formtyp == "search_edit")
{
$result = mysql_query("SELECT * FROM $tabell WHERE user = '$searchuser'");
if ($result)
{
echo "Resultatet av sökningen:<br><br>";
osv osv..
}
}
else { echo "Formtyp returnerade inget"; }
Problemet är att innan man hinner trycka Submit så innehåller ju inte $formtyp "search_edit", så "Formtyp returnerade inget" visas direkt så fort man kommer in på sidan.
Det skulle bli precis samma sak om jag hade formuläret i php-koden.
Det skulle bli samma sak om man bytte ut if $formtyp mot en koll av submit-knappen.
Jag provde även att lägga if ($formtyp) { innan if ($formtyp == "search_edit") men då hände inget alls när man skrev in ett användarnamn och tryckte Submit.
Så hur 17 gör man?
- JimmyAndersson
- Inlägg: 26417
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt: