Avatar billede enetonline_dk Nybegynder
07. august 2005 - 18:42 Der er 11 kommentarer og
2 løsninger

Give nyheder ID og hente ID'en

Hej ekperter!
Jeg har programmeret et nyhedspostersystem, som giver registrerede brugere mulighed for at poste nyheder (tja, hva ellers?) - det er gået glimrende indtil videre!

Brugerne poster nyhederne, som bliver gemt i en MYSQL tabel (nyhed) - hvilket jo er fint nok

Se mit spørgsmål kommer nu- det omhandler brugen af MySQL. Jeg skal nemlig hente ID fra nyheds-tabellen (har angivet ID, som automatisk forøges, hver gang en bruger poster nyhed).

Hvordan laver jeg et script, som automatisk henter nyheden 1, hvis jeg skriver

http://www.enetonline.dk/login/nyheds_poster.php?side=vis?id=1

Indtil videre henter den kun alle postede nyheder:
http://www.enetonline.dk/login/nyheds_poster.php?side=vis

Mange tak for hjælpen :)

Med venlig hilsen
SkipperBent / Simon Sessingø
Avatar billede Slettet bruger
07. august 2005 - 18:47 #1
Det er ikke ?side=vis?id=1 du skal have fat i, men ?side=vis&id=1 (& i stedet for ?).

Du kan ændre din mysql-query så den henter med $_GET['id'], ved at skrive sådan:

mysql_query("SELECT * FROM nyheder WHERE id=". $_GET['id']) or die(mysql_error());

Men det er nok en god idé at tjekke, om id'et er et tal, så man ikke kan lave mysql-injections.
Avatar billede nielle Nybegynder
07. august 2005 - 18:48 #2
Du danner din SQL efter denne metode:

$id = (isset($_GET["id"])) ? $_GET["id"] : -1;

SQL = "SELECT * FROM nyheder";
if ($id != -1) $SQL .= " WHERE id=" . $id;
SQL .= " ORDER BY id"
Avatar billede Slettet bruger
07. august 2005 - 19:19 #3
Eller sådan her:

$id = (isset($_GET["id"])) ? $_GET["id"] : -1;

$SQL = "SELECT * FROM nyheder";
if ($id != -1) $SQL .= " WHERE id=" . $id;
$SQL .= " ORDER BY id"

$query = mysql_query($SQL) or die(mysql_error());

Der skal $ på variabler i php. ;o)
Avatar billede ksoren Nybegynder
07. august 2005 - 19:31 #4
for at gøre den injection sikker:

$id = (isset($_GET["id"])) ? (int)$_GET["id"] : -1;
Avatar billede Slettet bruger
07. august 2005 - 19:32 #5
tjah, eller:

$id = (isset($_GET['id']) && is_numeric($_GET['id'])) ? $_GET["id"] : -1;
Avatar billede nielle Nybegynder
07. august 2005 - 19:54 #6
Det er altid en god ide at beskytte mod SQL-injection :^)
Avatar billede enetonline_dk Nybegynder
07. august 2005 - 23:02 #7
Mange tak for hjælpen, er ret ny til SQL, så forstår ikke meget af det gøgl.
men hvad er SQL-injection??
Avatar billede Slettet bruger
07. august 2005 - 23:22 #8
Det er, at brugere f.eks. kan skrive ?id=TRUNCATE news, for på den måde at få direkte adgang til din server, uden at være logget ind.
Avatar billede nielle Nybegynder
08. august 2005 - 09:23 #9
SQL-Injection 101

Denne hackerteknik går ud på at en hacker får sneget skadelig SQL-kode ind i en applikation. Som regel er det en webapplikation, men det kunne ligeså godt være noget andet, blot der er en SQL database nedenunder.

Et eksempel: En bruger skal logge sig ind på et system, og angiver brugernavn og password. Disse tjekkes efterfølgende imod databasen med noget som kunne se sådan ud (i PHP):

$SQL = "SELECT * FROM brugere WHERE loginNavn='" . $_POST["loginNavn"] . "' AND password='" . $_POST["loginNavn"] . "'";

Hvis jeg er en lovlig bruger af systemet, så ville det med mine oplysninger indtastet kunne se sådan her ud:

$SQL = "SELECT * FROM brugere WHERE loginNavn='nielle' AND password='Wh65b02fc'";

- men hvis jeg nu var en hackertype, som ville skaffe mig adgang til systemet, så kunne jeg i stedet for finde på at skrive:

hacker' OR 1=1; --

- i navnefeltet. Når dette indsættes i SQL-sætningen, kommer den til at se sådan her ud:

$SQL = "SELECT * FROM brugere WHERE loginNavn='hacker' OR 1=1;--' AND password='suckers'";

SQL bruger ;-tegnet til at adskille SQL-sætninger, og ovenstående er derfor 2 SQL-kommandoer:

SELECT * FROM brugere WHERE loginNavn='hacker' OR 1=1;
--' AND password='suckers'

Sekvensen ”--” er en af måderne at angive at noget er en kommentar, så den sidste sætning kan vi se bort fra.

Men den første... Den vil skaffe hackeren adgang til systemet til trods for at vedkommende ikke har et lovligt login.

Ovenstående er et simpelt eksempel på hvad man kan gøre med SQL-injection, og der er mange andre muligheder. Der er også langt mere sofistikerede angreb end det beskrevne.

Sikkerhedshullet opstår fordi at en hacker kan få lov til at indsætte et '-tegn uden at der efterfølgende gøres noget ved dette. Et '-tegn er ikke i sig selv et ulovligt tegn, og det kan forekomme i helt normale situationer. Men da '-tegnet også bruges til at omgive tekststrenge, må der under alle omstændigheder tages forbehold imod situationer som denne:

$SQL = "SELECT * FROM brugere WHERE loginNavn='Byens' Pizza' AND password='PeberoniNr9'";

Hvis et '-tegn skal indgå i selve teksten, skal det escapes:

$SQL = "SELECT * FROM brugere WHERE loginNavn='Byens'' Pizza' AND password='PeberoniNr9'";

Man bør derfor altid efterbehandle input udefra, ved f.eks. at replace enkelt ’-tegn med 2 '-tegn. På den måde, så har man dels gjort sin applikation mere tolerant mht. hvilke loginnavne folk kan vælge, og man har desuden beskyttet sig mod de mest basale SQL-injection angreb.

Særligt i forbindelse med PHP bør man i øvrigt lige sætte sig ind i ”magic quotes” og se hvad disse gør ved dine '-tegn. Læs mere om emnet her:

http://myplace.dk/articles/stripslashes/

Det ovenstående har kun lige skrabet emnet, og der er mange flere ting som man bør vide om emnet. Heldigvis kan man jo altid google på SQL-injection (ca. 1.300.000 hits :^)
Avatar billede nielle Nybegynder
08. august 2005 - 09:23 #10
... og et svar :^)
Avatar billede enetonline_dk Nybegynder
08. august 2005 - 17:45 #11
Jeg kan ikke hitte ud af at  bruge kommandoen som henter ID fra tabellen nyheder..

Her er mit script:

if($_GET[side] == vis) {
// Hent først data ud
include('http://www.enetonline.dk/login/include.php');

$resultat = mysql_query("select * from $tabel order by id DESC");

// Kør så igennem for hver række
while ($raekke = mysql_fetch_array($resultat)) {
  echo "<table border=\"0\" bordercolor=\"#000000\" width=\"540\" height=\"25\">
    <tr>
        <td class=\"nyhedsbaggrund\" height=\"21\" width=\"540\">&nbsp;
<b><font face=tahoma style=\"font-size: 10pt\">".$raekke['emne']."
</b>&nbsp;&nbsp;&nbsp;<font size=1>".$raekke['tidspunkt']."</td>
    </tr>
</table><font size=1><b>Oprettet af</b> ".$raekke['forfatter']."<table border=\"0\" bordercolor=\"#000000\" width=\"540\" height=\"25\" id=\"table1\">
    <tr>
        <td height=\"21\" width=\"540\" bgcolor=\"#FFFFFF\"><font face=\"Tahoma\" style=\"font-size: 8pt\">
        &nbsp;<b><font face=tahoma style=\"font-size: 8pt\"><b>".$raekke['b_tekst']."</b></b><font color=\"#FFFFFF\"></font></td>
    </tr>
</table><table border=\"0\" bordercolor=\"#000000\" width=\"540\" height=\"25\" id=\"table1\">
    <tr>
        <td height=\"21\" width=\"540\" bgcolor=\"#FFFFFF\"><font face=\"Tahoma\" style=\"font-size: 8pt\">
        &nbsp;  ".$raekke['body']."<font color=\"#FFFFFF\"></font></td>
    </tr>
</table><table border=\"0\" bordercolor=\"#000000\" width=\"540\" height=\"25\" id=\"table1\">
    <tr>
    </tr>
</table><br>";
        mysql_close($conn);
}
}
Avatar billede nielle Nybegynder
08. august 2005 - 18:23 #12
Dette virker nok lidt bedre:

// Hent først data ud
// include('http://www.enetonline.dk/login/include.php');
include('/login/include.php');

$id = (isset($_GET["id"])) ? $_GET["id"] : -1;

$SQL = "SELECT * FROM nyhed";
if ($id != -1) $SQL .= " WHERE id=" . $id;
$SQL .= " ORDER BY id DESC"

$resultat = mysql_query($SQL) or die(mysql_error());

// Kør så igennem for hver række
while ($raekke = mysql_fetch_array($resultat))
{
    echo "
    <table border=\"0\" bordercolor=\"#000000\" width=\"540\" height=\"25\">
    <tr>
    <td class=\"nyhedsbaggrund\" height=\"21\" width=\"540\">
    <b><font face=tahoma style=\"font-size: 10pt\">" . $raekke['emne'] . "</b>&nbsp;&nbsp;&nbsp;<font size=1>" . $raekke['tidspunkt'] . "</td>
    </tr>
    </table>

    <font size=1><b>Oprettet af</b> " . $raekke['forfatter'] . "

    <table border=\"0\" bordercolor=\"#000000\" width=\"540\" height=\"25\" id=\"table1\">
    <tr>
    <td height=\"21\" width=\"540\" bgcolor=\"#FFFFFF\"><font face=\"Tahoma\" style=\"font-size: 8pt\">&nbsp;<b><font face=tahoma style=\"font-size: 8pt\"><b>" . $raekke['b_tekst'] . "</b></b></td>
    </tr>
    </table>

    <table border=\"0\" bordercolor=\"#000000\" width=\"540\" height=\"25\" id=\"table1\">
    <tr>
    <td height=\"21\" width=\"540\" bgcolor=\"#FFFFFF\"><font face=\"Tahoma\" style=\"font-size: 8pt\">&nbsp;" . $raekke['body'] . "
    </td>
    </tr>
    </table>

    <table border=\"0\" bordercolor=\"#000000\" width=\"540\" height=\"25\" id=\"table1\">
    <tr>
    </tr>
    </table>

    <br>";
}
mysql_close($conn);
Avatar billede Slettet bruger
08. august 2005 - 20:24 #13
Tak for point. ;o)
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