Debutanten Skrevet 30. juni 2020 Del Skrevet 30. juni 2020 Hei. Jeg har et problem med Javascript og PHP, hvor jeg allerede har etablert informasjon som er globalt hentet fram fra min SQL database. Altså, brukernavn, epost, osvosv. Problemet oppstår når jeg skal hente fram informasjon i real-time med Javascript, hvor disse PHP-variablene faller bort og jeg ikke får tak i informasjonen jeg tidligere helt fint har kunne hentet ut. Side-navigeringssystemet mitt består av den klassiske GET['page'] som blir vist ved å da vise .php-filen med en include("fil.php");. Her er problemstillingen i kodeformat: Quote <script type="text/javascript" src="http://ajax.googleapis.com/ajax/ libs/jquery/1.3.0/jquery.min.js"></script> <script type="text/javascript"> var auto_refresh = setInterval(function (){ $('#load_updates').load('./corridor/travel/travelMap.php').fadeIn("slow"); }, 0); // refresh every 10000 milliseconds </script> <div id="load_updates"> </div> Og her er da altså travelmap.php: Quote <?PHP include("../cg.php"); $query = $dbh->prepare("SELECT * FROM `tweet` WHERE `id` > '0' and `user` = '$c_name' ORDER BY id DESC LIMIT 19"); $query->bindParam(":to", $r['id'], PDO::PARAM_INT); $query->execute(); while($to = $query->fetch(PDO::FETCH_ASSOC)){ echo "<font size=3 color=orange><b>"; echo $to['user']; echo "</font></b> (<font color=lightblue>"; echo $to['time']; if($rank = '100'){ echo "<font color=\"red\"><a href=\"index.php?corr=side&slett_igl&id=$to[id]\"><b> [Slett]</b></a></font>"; } echo ""; echo '<br>'.$to['msg'].'<br>'; if(isset($_GET['id']) && $rank = '19') { $sql='DELETE FROM tweet WHERE `id` = "'.$_GET['id'].'" '; escape_value($sql); echo ' <script type="text/javascript" language="JavaScript"> setTimeout(function () { location.href = \'index.php?corr=house&mng=house\'; }, 0); </script> '; }} ?> PHP-variablen ville under normale forhold vist $c_name som brukerens navn, men når Javascript henter ut filen i real-time faller denne variablen bort og det kunne like så greit vært skrevet ingenting under "user". Jeg prøvde også å hente ut database-informasjon ved å lokalisere config-filen (noe jeg heller ikke har trengt tidligere), men dette funker bare halvveis ettersom jeg får kontakt med databasen - men ikke med de allerede etablerte variablene. Lenke til kommentar
Merko Skrevet 30. juni 2020 Del Skrevet 30. juni 2020 Bare for å forstå problemstillingen. Du har to filer. 1) "hovedside" som har Javascript koden. 2) en PHP-fil som henter informasjonen fra databasen. Når du åpner "hovedside", så vil du ved hjelp av JavaScript laste inn det PHP-filen laster ned inn i <div id="load_updates"> </div>? Får du feilmelding? Lenke til kommentar
Debutanten Skrevet 30. juni 2020 Forfatter Del Skrevet 30. juni 2020 (endret) 40 minutes ago, Merko said: Bare for å forstå problemstillingen. Du har to filer. 1) "hovedside" som har Javascript koden. 2) en PHP-fil som henter informasjonen fra databasen. Når du åpner "hovedside", så vil du ved hjelp av JavaScript laste inn det PHP-filen laster ned inn i <div id="load_updates"> </div>? Får du feilmelding? Nei, jeg tror ikke det. Hehe. Litt komplisert å forklare. Jeg har etablert alt av PHP-variabler å hente i config.php-filen min, som er included i index.php. Dette gjør at ALT som foregår innunder index.php kan hente fram ønsket informasjon etablert i config.php, som blant annet variablen $c_name - som henter fram brukernavn gjennom SQL SELECT. Men når jeg bruker AJAX til å hente ut informasjon slik som i koden overfor ($('#load_updates').load('./corridor/travel/travelMap.php').fadeIn("slow");), så forsvinner disse variablene /blir ubrukelige, slik at når $c_name blir brukt i travelpmap.php så fungerer den ikke på hovedsiden - ved bruk av javascript for å hente fram infoen i real-time. Endret 30. juni 2020 av Debutanten Lenke til kommentar
Emsal Skrevet 30. juni 2020 Del Skrevet 30. juni 2020 Kan det hende at pathen til config.php det er noe problem med? Altså sjekk om den finner filen når du kjører Ajax kallet? Lenke til kommentar
nomore Skrevet 30. juni 2020 Del Skrevet 30. juni 2020 Hva skjer om du prøver å laste travelMap.php direkte i nettleseren? Lenke til kommentar
Thorbear Skrevet 30. juni 2020 Del Skrevet 30. juni 2020 Oi, her var det mye rart på en gang. La oss begynne med å formatere koden din skikkelig, sånn at det er mulig for resten av oss å lese hva det er du har tenkt: <?PHP include("../cg.php"); $query = $dbh->prepare("SELECT * FROM `tweet` WHERE `id` > '0' and `user` = '$c_name' ORDER BY id DESC LIMIT 19"); $query->bindParam(":to", $r['id'], PDO::PARAM_INT); $query->execute(); while($to = $query->fetch(PDO::FETCH_ASSOC)){ echo "<font size=3 color=orange><b>"; echo $to['user']; echo "</font></b> (<font color=lightblue>"; echo $to['time']; if($rank = '100'){ echo "<font color=\"red\"><a href=\"index.php?corr=side&slett_igl&id=$to[id]\"><b> [Slett]</b></a></font>"; } echo ""; echo '<br>'.$to['msg'].'<br>'; if(isset($_GET['id']) && $rank = '19') { $sql='DELETE FROM tweet WHERE `id` = "'.$_GET['id'].'" '; escape_value($sql); echo ' <script type="text/javascript" language="JavaScript"> setTimeout(function () { location.href = \'index.php?corr=house&mng=house\'; }, 0); </script> '; } } ?> Ettersom du forteller at noen av variablene er definert i cg.php må vi bare gjøre noen antakelser om innholdet der, om du ikke ønsker å dele kildekoden. Jeg vil begynne med å nevne at ajax-kallet ditt til denne filen ikke spesifiserer noen GET-parametre: load('./corridor/travel/travelMap.php') Så om du forventer å finne noe som helst i $_GET[] så må dette spesifiseres her, i form av f.eks: load('./corridor/travel/travelMap.php?id=5') Videre foregår det noen rare ting med database-spørringen din, jeg ser du bruker PDO, som er veldig bra, men du bruker det på en rar måte, og ser ut til å ha med noe kode som ikke er i bruk. $dbh->prepare("SELECT * FROM `tweet` WHERE `id` > '0' and `user` = '$c_name' ORDER BY id DESC LIMIT 19"); Her legger du verdien av en variabel direkte inn i spørringen, dette må du absolutt ikke gjøre, bruk bindParam eller bindValue. I dette tilfellet bør du bytte ut med f.eks: $query = $dbh->prepare("SELECT * FROM `tweet` WHERE `id` > '0' and `user` = :cName ORDER BY id DESC LIMIT 19"); $query->bindValue(":cName", $c_name, PDO::PARAM_STR); Jeg ser du allerede har et kall til bindParam, men der refererer du til :to som jeg ikke ser noe sted i spørringen din, så denne gjør ingenting. Et stykke lenger ned ser jeg noe enda mer hårreisende: $sql='DELETE FROM tweet WHERE `id` = "'.$_GET['id'].'" '; escape_value($sql); Jeg kjenner ikke til at PHP har noen funksjon med navn escape_value(), så jeg regner med dette er noe hjemmesnekret. Uansett hva den funksjonen gjør, eller hvem som har skrevet den, så skal du slutte å bruke den umiddelbart. Her må du gjøre det samme som jeg har beskrevet over, med bindParam: $deleteStatement = $dbh->prepare('DELETE FROM tweet WHERE `id` = :id'); $deleteStatement->bindValue(":id", $_GET['id'], PDO::PARAM_INT); $deleteStatement->execute(); 3 Lenke til kommentar
ahw_ Skrevet 1. juli 2020 Del Skrevet 1. juli 2020 (endret) Jeg skulle ikke ha sett denne tråden rett før jeg skulle sove fordi dette gjorde vondt i sjelen og jeg fikk litt problemer med å sove etterpå. Du bør lese deg opp på grunnleggende sikkerhet på web, bl.a. CSRF, XSS og SQL injection som er et gjentagende problem i koden her (see innlegget til Thorbear). Du kan ikke stole på noen, i hvert fall ikke klienten. 18 hours ago, Debutanten said: echo "<font color=\"red\"><a href=\"index.php?corr=side&slett_igl&id=$to[id]\"><b> [Slett]</b></a></font>"; Hva skjer hvis jeg gir deg en lenke som ligner denne som du trykker på mens du er logget inn på din nettside? Dette forumet lar meg ikke legge dette inn som et bilde men det kunne man gjort andre steder og da ville nettleseren din ha sendt forespørselen automatisk og gjort skade (CSRF). Sannsynligvis sårbar for XSS: 18 hours ago, Debutanten said: echo '<br>'.$to['msg'].'<br>'; 18 hours ago, Debutanten said: Side-navigeringssystemet mitt består av den klassiske GET['page'] som blir vist ved å da vise .php-filen med en include("fil.php");. Jeg håper for all del at dette ikke gjøres på følgende måte uten å sjekke verdien: include/require $_GET['page'] . '.php'; Sammen med å ta et kurs eller lignende for sikkerhet vil jeg sterkt anbefale å bygge på grunnleggende koding fordi det ser ut som at koden her er skrevet av noen som ikke helt vet hva de holder på med. Endret 1. juli 2020 av ahw_ Skriveleif, CSRF, XSS. Lenke til kommentar
Debutanten Skrevet 2. juli 2020 Forfatter Del Skrevet 2. juli 2020 Takker for svar. Jeg er fullstendig klar over sikkerhetshullene. Jeg drev og redigerte gjennom gamle filer, og holder på å omkode alt til PDO. Lenke til kommentar
Thorbear Skrevet 2. juli 2020 Del Skrevet 2. juli 2020 3 minutes ago, Debutanten said: Takker for svar. Jeg er fullstendig klar over sikkerhetshullene. Jeg drev og redigerte gjennom gamle filer, og holder på å omkode alt til PDO. Men det å legge GET-parametrene inn i ajax-kallet fikset problemet med at verdiene ikke fantes? Eller har vi bare svart med masse som var urelatert til problemet ditt? Lenke til kommentar
Debutanten Skrevet 2. juli 2020 Forfatter Del Skrevet 2. juli 2020 (endret) 4 minutes ago, Thorbear said: Men det å legge GET-parametrene inn i ajax-kallet fikset problemet med at verdiene ikke fantes? Eller har vi bare svart med masse som var urelatert til problemet ditt? Nei, problemet var noe så komitragisk som at den AJAX-requeste .php-filen hadde feile kordinater til config.php. På den annen side; det du fortalte meg om _GET gir mening, men jeg forstår det virkelig ikke! Endret 2. juli 2020 av Debutanten Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå