23. maj 2017 - 21:13Der 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.
Hvordan tiltrækker og fastholder man it-talenter i et konkurrencepræget arbejdsmarked?
21. marts 2024
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.
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.
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.
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);
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`' )) {
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);
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);
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`' )) {
Mange tak for hjælpen og din tid til at hjælpe mig.
Synes godt om
Ny brugerNybegynder
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.