Avatar billede mstorgaard Praktikant
04. november 2006 - 16:25 Der er 7 kommentarer og
1 løsning

Sikkerhed i login-script

Jeg har lavet et script, og vil gerne høre, hvor sikkert det er.
Her er mit script:
<?php
include('header.php');
if($_GET['action'] == 'send')
{
  $brugernavn = addslashes($_POST['brugernavn']);
  $result = mysql_query("SELECT * FROM brugere WHERE brugernavn = '{$brugernavn}'");
  $row = mysql_fetch_array($result);
  $kodeord = md5($_POST['kodeord']);
  if($brugernavn == '' || $_POST['kodeord'] == '')
  {
    echo "Udfyld venligst begge felter";
  }
  else
  {
    if($kodeord == $row['kodeord'])
    {
      $_SESSION['ok'] = "ok";
      $_SESSION['brugernavn'] = $brugernavn;
      if($row['klub'] == '1')
      {
        $startresult = mysql_query("SELECT * FROM klubber WHERE ejer = '{$row['id']}'");
        $startrow = mysql_fetch_array($startresult);
        echo "<META HTTP-EQUIV=Refresh CONTENT=\"0; URL=klub.php?klub_id=" . $startrow['id'] . "\">";
      }
      else
      {
        echo "<META HTTP-EQUIV=Refresh CONTENT=\"0; URL=opret.php\">";
      }
    }
    else
    {
      echo "<META HTTP-EQUIV=Refresh CONTENT=\"0; URL=logind.php\">";
    }
  }
}
else
{
?>
<form method="post" action="?action=send">
  <table style="border-collapse: collapse;">
    <tr>
      <td style="padding: 0px; width: 150px;">
        Brugernavn
      </td>
      <td style="padding: 0px; width: 150px;">
        <input type="text" class="post" name="brugernavn" style="width: 150px;">
      </td>
    </tr>
    <tr>
      <td style="padding: 0px; width: 150px;">
        Kodeord
      </td>
      <td style="padding: 0px; width: 150px;">
        <input type="password" class="post" name="kodeord" style="width: 150px;">
      </td>
    </tr>
    <tr>
      <td colspan="2" style="padding: 0px; width: 300px;">
        <input type="submit" class="post" name="submit" value="Send">
      </td>
    </tr>
  </table>
</form>
<?php
}
include('footer.php');
?>
Avatar billede udvikler Nybegynder
04. november 2006 - 16:38 #1
Har selv læst en del om sikkerhed og ved derfor en del om det, jeg kunne kun finde 1 fejl i din kode, den var i  en MySQL sætning. Du må _ALDRIG_ indsætte en POST eller GET værdi direkte ind i en MySQL kode, du skal først lave den om til en variabel og tjekke den.

Brug istedet dette:

<?php
include('header.php');
if($_GET['action'] == 'send')
{
  $brugernavn = addslashes($_POST['brugernavn']);
  $result = mysql_query("SELECT * FROM brugere WHERE brugernavn = '{$brugernavn}'");
  $row = mysql_fetch_array($result);
  $kodeord = md5($_POST['kodeord']);
  if($brugernavn == '' || $_POST['kodeord'] == '')
  {
    echo "Udfyld venligst begge felter";
  }
  else
  {
    if($kodeord == $row['kodeord'])
    {
      $_SESSION['ok'] = "ok";
      $_SESSION['brugernavn'] = $brugernavn;
      if($row['klub'] == '1')
      {
        $idnummer = mysql_real_escape_string($row['id']);
        $startresult = mysql_query("SELECT * FROM klubber WHERE ejer = '{$idnummer}'");
        $startrow = mysql_fetch_array($startresult);
        echo "<META HTTP-EQUIV=Refresh CONTENT=\"0; URL=klub.php?klub_id=" . $startrow['id'] . "\">";
      }
      else
      {
        echo "<META HTTP-EQUIV=Refresh CONTENT=\"0; URL=opret.php\">";
      }
    }
    else
    {
      echo "<META HTTP-EQUIV=Refresh CONTENT=\"0; URL=logind.php\">";
    }
  }
}
else
{
?>
<form method="post" action="?action=send">
  <table style="border-collapse: collapse;">
    <tr>
      <td style="padding: 0px; width: 150px;">
        Brugernavn
      </td>
      <td style="padding: 0px; width: 150px;">
        <input type="text" class="post" name="brugernavn" style="width: 150px;">
      </td>
    </tr>
    <tr>
      <td style="padding: 0px; width: 150px;">
        Kodeord
      </td>
      <td style="padding: 0px; width: 150px;">
        <input type="password" class="post" name="kodeord" style="width: 150px;">
      </td>
    </tr>
    <tr>
      <td colspan="2" style="padding: 0px; width: 300px;">
        <input type="submit" class="post" name="submit" value="Send">
      </td>
    </tr>
  </table>
</form>
<?php
}
include('footer.php');
?>
Avatar billede mstorgaard Praktikant
04. november 2006 - 16:41 #2
Er der ingen andre ting at påpege i koden?
Avatar billede udvikler Nybegynder
04. november 2006 - 16:41 #3
I du kan også bruge denne til at tjekke alle dine variabler der indeholder et id:

if (!preg_match("/[0-9]/", $var)) {
    //det indeholder IKKE tal
}else{
    //det indeholder tal
}

den fungere på den måde at den tjekker om variablen virkelig indeholder et tal eller bogstaver.
Avatar billede udvikler Nybegynder
04. november 2006 - 16:44 #4
Også kunne du vel gøre sådan at man blev sendt til en ny side hvor php koden blev afviklet, jeg kan ikke helt huske grunden til det, men det er vidst mere sikkert :-)
Avatar billede mstorgaard Praktikant
04. november 2006 - 16:45 #5
Jeg ved ikke om du fik læst 04/11-2006 16:41:31, men jeg spørger lige igen; Er der ingen andre ting at påpege i koden?
Avatar billede mstorgaard Praktikant
04. november 2006 - 16:45 #6
Okay, tak for hjælpen :)
Avatar billede udvikler Nybegynder
04. november 2006 - 16:45 #7
Jo jeg har læst det du skrev før, og jeg fandt 2 ting til jo.
Avatar billede udvikler Nybegynder
04. november 2006 - 16:46 #8
Og tak for point.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester