När körs PHP-kod i .php-fil blandad med html?

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Som vad ?
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

EDIT: Jasså? Skulle jag läsa igenom de andra inläggen också...

Jag antar att tgr menar att man t.ex. kan göra "SQL Injection" t.ex..
Att exekvera kod från inmatningsfält blir svårt om man inte medvetet kör "eval" på det.
discomike
Inlägg: 445
Blev medlem: 22 juli 2007, 11:34:13
Ort: Göteborg

Inlägg av discomike »

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å).
Användarvisningsbild
JimmyAndersson
Inlägg: 26417
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

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
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. :)
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

..allt som skrivs in körs av mysql-kod
Det är ju precis detta som är det (enda?) farliga. Du *måste* escapea inmatade värdena genom mysql_real_escape_string innan du klistrar ihop dom med din SQL-kod.
Användarvisningsbild
JimmyAndersson
Inlägg: 26417
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Det kan jag gå med på :) men på vilket sätt är det farligt annars?

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, 
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.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

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".
Användarvisningsbild
JimmyAndersson
Inlägg: 26417
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Då skulle summan bli (hoppas jag):
mysql_query("INSERT INTO tabell (text) VALUES(\"\"); TRUNCATE tabell; SELECT \"\"")


oh crap... :lol:


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.
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Ah, OK. Då är jag med.
Jo, det är klart att man inte ska köra in WEB form-data direkt in i SQL
satserna på det där sättet... :-)
Användarvisningsbild
JimmyAndersson
Inlägg: 26417
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

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:

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&ouml;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"; }
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?
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

$forumtyp = $_POST['formtyp'];
if ($formtyp == "search_edit")

Kanske?
Användarvisningsbild
JimmyAndersson
Inlägg: 26417
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Så klart! :wall:

Jag får inte sitta så mycket vid forumet, det påverkar tillochmed vad man skriver. :lol:

Nu fungerar det. :D
Skriv svar