Avatar billede Morten Professor
23. maj 2017 - 21:13 Der er 8 kommentarer og
1 løsning

SQL injektion åben eller ikke åben

Hej Eksperter

Jeg har lige et spørgsmål, vil denne kode være åben for sql injektion.
<?php
$res=$con->query("SELECT * FROM tbl_menu");
while($row=$res->fetch_array())
{
?>
<li><a href="#"><?php echo $row['menu']; ?></a>
<?php
$res_pro=$con->query("SELECT `sub_menu_id`, `menu_id`, `sub_menu` FROM tbl_sub_menu WHERE menu_id=".$row['id']);
?>
        <ul>   
  <?php 
  while($pro_row=$res_pro->fetch_array())
  {
  ?><li><a href="#"><?php echo $pro_row['sub_menu']; ?></a></li><?php
  }
  ?>
Og vis jo hvad kan jeg så gøre, har prøvet med prepare Men der vil den lave for meget rod i koden, så jeg ikke kan få det til at virke.

På den måde den er nu, virker min dynamic menu.

Det er den der driller mig -------> menu_id=".$row['id']);
Men er det kun tekst fælder man skal være opmærksom på, at man ikke lige roder dem sammen. For ved, det skal man helst undgå. Så der ikke er åben.

Med venlig hilsen
Morten
Avatar billede Slettet bruger
23. maj 2017 - 21:32 #1
Som udgangspunkt er der kun åbent for injektion, hvor det er muligt for en bruger at lave input, som bliver brugt i SQL. Det sker ikke i den kode, vi ser her.

Hvis id fra tbl_menu er en streng, som en bruger kan vælge selv (via et andet sted i din kode) så kan der være en risiko på det sted, men hvis det felt er sat til at være en talværdi, skulle du være sikker for så vidt angår koden her.
Avatar billede Morten Professor
23. maj 2017 - 21:48 #2
Tak for hjælpen og den gode forklaring.
Så kan jeg godt arbejde videre med projektet.

Du må have en rigtig god aften :)
Avatar billede arne_v Ekspert
24. maj 2017 - 02:49 #3
Jeg ville ikke arbejde videre med koden som den er.

Kode skal ikke kun skrives den skal ogsaa vedligeholdes.

Saa du skal ikke kun sikre dig at den er sikker idag, men ogsaa at diverse vedligehold de naeste mange aar ikke goer den usikker.

Saa du vil vaere noed til at skrive en laengere beskrivelse i koden om hvorfor det ikke er et problem. Og tilfoeje en bemaerkning i dit database design dokument om at det felt skal forblive integer og at ellers skal koden rettes.

Jeg vil haevde at det er hurtigere at faa prepare til at virke end at dokumentere hvorfor prepare ikke er noedvendig og sikre at det forbliver saadan.
Avatar billede arne_v Ekspert
24. maj 2017 - 02:53 #4
Udover den manglende brug af prepare er det en anden ting som er lidt ulden. Du udfoerer de indre queries paa samme connection som du stadig laeser fra i den ydre query. Det virker kun hvis hele resultatet af den ydre query er hentet og cachet foer den foerste indre query udfoeres.

Det kan undgaaes med 2 connections.

Eller ved kun at have en query med en JOIN.
Avatar billede Morten Professor
24. maj 2017 - 08:39 #5
Hej arne_v

Hvordan vil du så gøre det, for at sikre mig.
Har prøvet med prepare men kan ikke få det til at virke.
Der kommer for mange "}" og så går det galt.

Jeg forventer ikke at du laver det for mig, men nogen kode stumper vil hjælpe mig godt på vej.

Med venlig hilsen
Morten
Avatar billede Morten Professor
24. maj 2017 - 09:44 #6
Her er koden som jeg forsøger at lave men ikke kan få det sidste på plads:

<div id="menu">
<ul>
<?php
    /* Menu */
    if ($stmt = $con->prepare('SELECT `id`, `menu` FROM `tbl_menu`' )) {

        /* Eksekver forespørgslen */
        $stmt->execute();

        /* Bind resultatet */
        $stmt->bind_result($id, $menu);
       
        while ($stmt->fetch()) {
?>
<li><a href="#"><?php echo $menu; ?></a>
<?php
    /* Sub menu */
    if ($stmt = $con->prepare('SELECT `sub_menu_id`, `menu_id`, `sub_menu` FROM `tbl_menu` WHERE id = ?' )) {
        /* Bind parametre */
        $stmt->bind_param('i', $sub_id);

        /* Sæt værdier på parametrene */
        $sub_id = $id;

        /* Eksekver forespørgslen */
        $stmt->execute();

        /* Bind resultatet */
        $stmt->bind_result($sub_menu_id, $menu_id, $sub_menu);
       
        ?>
        <ul>   
  <?php
  while ($stmt->fetch()) {
  ?><li><a href="#"><?php echo $sub_menu; ?></a></li><?php
  }
  ?>
</ul>
</li>

    <?php
}
?>
</ul>
</div>

Jeg kommer til at mangle nogle { men hvis jeg sidder dem, virker koden ikke, og det gør den heller ikke nu.
Avatar billede Morten Professor
24. maj 2017 - 09:47 #7
Fatal error: Call to a member function fetch() on boolean in C:\wamp64\www\dynamic_menu_test\index.php on line 22 Hvis jeg gør sådan her:
<div id="menu">
<ul>
<?php
    /* Menu */
    if ($stmt = $con->prepare('SELECT `id`, `menu` FROM `tbl_menu`' )) {

        /* Eksekver forespørgslen */
        $stmt->execute();

        /* Bind resultatet */
        $stmt->bind_result($id, $menu);
       
        while ($stmt->fetch()) {
?>
<li><a href="#"><?php echo $menu; ?></a>
<?php
    /* Sub menu */
    if ($stmt = $con->prepare('SELECT `sub_menu_id`, `menu_id`, `sub_menu` FROM `tbl_menu` WHERE id = ?' )) {
        /* Bind parametre */
        $stmt->bind_param('i', $sub_id);

        /* Sæt værdier på parametrene */
        $sub_id = $id;

        /* Eksekver forespørgslen */
        $stmt->execute();

        /* Bind resultatet */
        $stmt->bind_result($sub_menu_id, $menu_id, $sub_menu);
       
        ?>
        <ul>   
  <?php
  while ($stmt->fetch()) {
  ?><li><a href="#"><?php echo $sub_menu; ?></a></li><?php
  }}} <------------- Problem
  ?>
</ul>
</li>

    <?php
}
?>
</ul>
</div>
Avatar billede arne_v Ekspert
24. maj 2017 - 18:00 #8
Det mix af PHP og HTML er jo ulaeseligt. Brug en enkelt PHP blok og lidt mere echo.

Utestet:


<div id="menu">
<ul>
<?php
    /* Menu */
    if ($stmt = $con->prepare('SELECT `id`, `menu` FROM `tbl_menu`' )) {

        /* Eksekver forespørgslen */
        $stmt->execute();

        /* Bind resultatet */
        $stmt->bind_result($id, $menu);
     
        while ($stmt->fetch()) {
            echo "<li><a href='#'>$menu</a>\r\n";
            /* Sub menu */
            if ($stmt = $con->prepare('SELECT `sub_menu_id`, `menu_id`, `sub_menu` FROM `tbl_menu` WHERE id = ?' )) {
                /* Bind parametre */
                $stmt->bind_param('i', $sub_id);
       
                /* Sæt værdier på parametrene */
                $sub_id = $id;
       
                /* Eksekver forespørgslen */
                $stmt->execute();
       
                /* Bind resultatet */
                $stmt->bind_result($sub_menu_id, $menu_id, $sub_menu);
             
                echo "<ul>\r\n"; 
                while ($stmt->fetch()) {
                    echo "<li><a href='#'>$sub_menu</a></li>\r\n";
                }
                echo "</ul>\r\n";
            }
            echo "</li>\r\n";
        }
    }
?>
</ul>
</div>
Avatar billede Morten Professor
24. maj 2017 - 19:37 #9
Hej arne_v

Jeg fik lavet et nyt spørgmål, og havde sat det op i prepare, fik det til at virke, med noget hjælp, havde simpelhen ikke fået del variablerne op så jeg havde alt for mange stmt og con, så fik lavet der var i den første del con og stmt og den anden del con1 og stmt1 så kom det til at virke her er koden:

<div id="menu">
<ul>
<?php
    /* Menu */
    if ($stmt = $con->prepare('SELECT `id`, `menu` FROM `tbl_menu`' )) {

        /* Eksekver forespørgslen */
        $stmt->execute();

        /* Bind resultatet */
        $stmt->bind_result($id, $menu);
   
        while ($stmt->fetch()) {
?>
<li><a href="<?php echo $id; ?>"><?php echo $menu; ?></a>
<?php
    /* Sub menu */
    if ($stmt1 = $con1->prepare('SELECT `sub_menu_id`, `menu_id`, `sub_menu` FROM `tbl_sub_menu` WHERE menu_id = ?' )) {
        /* Bind parametre */
        $stmt1->bind_param('i', $sub_id);

        /* Sæt værdier på parametrene */
        $sub_id = $id;

        /* Eksekver forespørgslen */
        $stmt1->execute();

        /* Bind resultatet */
        $stmt1->bind_result($sub_menu_id, $menu_id, $sub_menu);
   
        ?>
        <ul>
  <?php
  while ($stmt1->fetch()) {
  ?><li><a href="<?php echo $sub_menu_id; ?>"><?php echo $sub_menu; ?></a></li><?php
  }}
  ?>
</ul>
</li>

    <?php
    }}
?>
</ul>
</div>

Mange tak for hjælpen og din tid til at hjælpe mig.
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

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



IT-JOB