Avatar billede charlie22 Juniormester
04. september 2020 - 01:41 Der er 9 kommentarer og
1 løsning

php header

Jeg forsøger at lære lidt php. Det er meningen at dette skript skal modtage et nummer, hente et link fra databasen, sende brugeren videre til dette link.
Jeg får dog bare forskellige fejlmeddelser i denne linje:
header('Location: $row["cl_url"]');



<?php
$idlink=$_GET['id'];
$link=mysqli_connect("xxxxxxxxxxx","xxxx","xxxxx","xxxxx") or die(mysql_error());

$result = mysqli_query($link,"SELECT * FROM catal_links_links WHERE cl_lid=$idlink);

while ($row=mysqli_fetch_array($result))
{
header('Location: $row["cl_url"]');
}
/* Make sure that code below does not get executed when we redirect. */
exit;
?>
Avatar billede arne_v Ekspert
04. september 2020 - 02:45 #1
header('Location: '  . $row['cl_url']);

?
Avatar billede charlie22 Juniormester
04. september 2020 - 03:22 #2
Nej det giver også fejl

Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting '-' or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING)
Avatar billede arne_v Ekspert
04. september 2020 - 03:33 #3
$result = mysqli_query($link,"SELECT * FROM catal_links_links WHERE cl_lid=$idlink");
Avatar billede charlie22 Juniormester
04. september 2020 - 03:58 #4
Ja nu virker det. Tak
Avatar billede Slater Ekspert
04. september 2020 - 07:10 #5
Skal vi ikke lige med det samme nævne, at man aldrig nogensinde må putte data fra GPC, som f.eks. $_GET-variabler, direkte ind i en SQL query?

Det er ikke direkte relateret til spørgsmålet, men gør dig selv en tjeneste og lær at bruge parameteriserede queries. Se f.eks. eksemplerne her:
https://www.php.net/manual/en/mysqli-stmt.bind-param.php
Avatar billede arne_v Ekspert
04. september 2020 - 14:21 #6
Helt enig.

Den brugte konstruktion er en tikkende bombe.
Avatar billede charlie22 Juniormester
05. september 2020 - 00:38 #7
Handler det om hacking eller sabotage?

Altså at man kan manipulere url selv, altså ændre på get variablken direkte i browseren
Avatar billede Slater Ekspert
05. september 2020 - 08:08 #8
Du skal altid tage højde for at brugerens input ikke er troværdigt, og at alle kan ændre variabler. Dvs. aldrig give adgang til låst indhold udelukkende pga. et fortløbende id i URL'en og lignende.

Men dette går langt videre end det. SQL injection, som du har åbnet for her, lader selv de mest amatøragtige hackere se, manipulere og slette indhold fra din database.

Tag f.eks. din query:

"SELECT * FROM catal_links_links WHERE cl_lid=$idlink"

Du forventer at $idlink er et tal, men hvad hvis en person i stedet sender strengen:
"1; DROP TABLE catal_links"?

Så vil din query først hente linket ud fra id 1, og derefter slette hele tabellen.

Og tro mig, så snart du lægger noget som helst på nettet som søgemaskiner kender til, bliver du bombarderet med den slags automatiserede requests, der forsøger at finde huller i din side.
Avatar billede charlie22 Juniormester
05. september 2020 - 08:51 #9
Findes der en enkel løsning på dette hvis man anvender ovenstående eksempel?
Avatar billede Slater Ekspert
05. september 2020 - 09:32 #10
Løsningen er altid at bruge parameteriserede queries, hvis der er en variabel i din query som på nogen måde kan indflydes af en bruger.

Hvis du er i gang med at lære php, så gør dig selv den tjeneste at læse linket før, forstå det og brug det i fremtiden. Det første eksempel på siden er rimelig simpelt.
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