Avatar billede Slettet bruger
08. juni 2009 - 16:49 Der er 13 kommentarer og
1 løsning

Problem med mine forespørgsler tilsyneladende :S

Hola eksperter...

Jeg har fået lavet en slette funktion til mine kommentarer som virker efter hensigten. Men for at sikre sig mod at "almindelige" brugere på sitet (med rank = 0) ikke kan benytte sig af det har jeg lavet nogle forespørgsler..

Af en eller anden grund virker de dog ikke efter hensigten og jeg har selv stirret mig for blind på kodningen lige nu :/

Siden ser sådan her ud:

---------------------------------------------------------------------------
<?php

include_once 'includes/config.sql.php';

$db_rank = mysql_query("SELECT * FROM members_regi WHERE id='".$_SESSION['SESS_MEMBER_ID']."'") or die(mysql_error());
$rettigheder = mysql_fetch_array($db_rank);

function deletecomment($id){
    ($result=mysql_query("SELECT id FROM blogs_comments WHERE parent_id=".$id)) or die(mysql_error());
    while($row = mysql_fetch_assoc($result)){
        deletecomment($row['id']);
    }
    mysql_query("DELETE FROM blogs_comments WHERE id=".$id) or die(mysql_error());
}
if($rettigheder['rank'] == '0' || !isset($_SESSION['SESS_MEMBER_ID']) || (trim($_SESSION['SESS_MEMBER_ID']) == '')) {
header("Location: index.php");
exit();
}
else{
deletecomment($_GET['id']);
header("location:".$_SERVER['HTTP_REFERER']);
exit();
}
?>
---------------------------------------------------------------------------

Efter min bedste overbevisning burde man kunne slette en kommentar, hvis man ikke har rank = 0 (dvs. man er mere end blot bruger) og hvis ens login sessions er sat.. Det er dog ikke tilfældet.. Uanset hvilken rank man har, om man er logget ind eller ej, redirecter den blot til index.php og sletter derfor heller ikke noget..

Hvordan kan det være :S?
Avatar billede Slettet bruger
08. juni 2009 - 18:06 #1
$rettigheder = mysql_fetch_array($db_rank);
bør vel være
$rettigheder = mysql_fetch_row($db_rank);

Anyway, det ser generelt lidt rodet ud. Vil din kode ikke slette alle kommentarer tilføjet af en given bruger?
Avatar billede Slettet bruger
08. juni 2009 - 18:10 #2
Hov... Du tjekker forresten ikke password til din session-baserede bruger-id - hvilket vil sige, at en hvilken som helst skummel hacker kan sende tilfældige bruger-id'er i sessionen, indtil han får brugerrettigheder over 0 og således kan lave en del revage på siden.
Avatar billede Slettet bruger
08. juni 2009 - 18:34 #3
Altså funktionen virker fint nok uden de forespørgsler og sletter det den skal ;) Den sletter de kommentarer, der svarer til hinanden også, hvis man sletter den første af dem..

Kan egentlig godt se det med session id'en nu hvor du siger det :S Flere steder på siden bruger jeg blot følgende til at tjekke om man er logget ind eller ej:

if(!isset($_SESSION['SESS_MEMBER_ID']) || (trim($_SESSION['SESS_MEMBER_ID']) == '')) {
  så er man ikke logget ind..
    }

Så i princippet kan en "hacker" vel også her automatisk genere et brugerid og dermed være logget ind eller? I så fald - har du en nem måde man kan ændre det på? Jeg tænker lidt at man evt. kan lave en session med password også når man logger ind og tjekker på om den svarer til brugerens session.. Er bare ikke helt sikker på hvordan jeg skal gøre dette :/

Det er denne guide jeg har taget udgangspunkt i med loginsystemet og bygget det op på nogenlunde samme måde bare med mere sikkerhed i form af kryptering osv.:
http://www.phpeasystep.com/workshopview.php?id=6
Avatar billede Slettet bruger
08. juni 2009 - 19:03 #4
Mht. sikkerheden kan du rigtigt nok tjekke både brugernavn og password fra session... Som følgende:

function CheckLogin()
{
  if (!isset($_SESSION["brugernavn"]) || !isset($_SESSION["kodeord"]))
    return false;
  $string = "SELECT password FROM brugere WHERE brugernavn=".$_SESSION["brugernavn"];
  $query = mysql_query($string);
  if (!$query || kodeord != mysql_result($query, 0))
    return false;
  return true;
}
// Forbind til databaser her
if (!CheckLogin())
  header("location: http://failblog.org/"); // Error: User fails at hacking

Husk dog kun at bruge ovenstående på sider, hvor brugeren SKAL være logget på :)
Avatar billede Slettet bruger
08. juni 2009 - 19:05 #5
Det kan gøres kortere!

  if (!$query || kodeord != mysql_result($query, 0))
    return false;
  return true;

Kan være

  return ($query && kodeord == mysql_result($query, 0))
Avatar billede Slettet bruger
08. juni 2009 - 21:51 #6
Synes desværre ikke helt jeg kunne få det til at virke efter hensigten, men jeg ved et eller andet sted heller ikke om det ville være smart :S

Jeg har nemlig også cookies på sitet til loginsystemet og her har jeg valgt ikke at smide password i disse, hvis en "hacker" skulle få fat i nogle bruger cookies.. Derfor tror jeg at jeg vil få problemer med at implementere funktionen, da jeg gerne vil undgå passwords i mine cookies..

Men er det så let for en hacker at sende tilfældige bruger-id'er i sessionen som du nævner? For så kan jeg da godt ske at der skal ske et eller andet med login systemet.. Det kom bare lidt bag på mig
Avatar billede Slettet bruger
08. juni 2009 - 22:18 #7
Ja, det er MEGET let at manipulere session-variable.

Jeg vil foreslå, at du

a) krypterer dataen i dine cookies
b) kun gennem username i dine cookies og kræver, at brugeren for hver ny session indtaster password, hvorefter det gemmes, til sessionen afsluttes
Avatar billede Slettet bruger
09. juni 2009 - 12:32 #8
Ja okay.. Jeg havde også tænkt på at smide krypteret data i cookies - i hvert fald passwords, hvis de skal deri.. Har dog læst mig frem til at det også kan være farligt, men det er vel ikke ligeså farligt som mine session-variable ser ud nu så.. Forstår desværre ikke helt hvad du mener med b)

Men til koden igen så..

function CheckLogin()
{
  if (!isset($_SESSION["min_brugernavnssession"]) || !isset($_SESSION["mine_kodeordsssession"]))
    return false;
  $string = "SELECT password FROM min_brugertabel WHERE brugernavn=".$_SESSION["min_brugernavnssession"];
  $query = mysql_query($string);
  if (!$query || kodeord != mysql_result($query, 0))
    return false;
    return true;
}

if (!CheckLogin()){
  echo "ikke logget ind";
}
else {
  echo "logget ind";
}

Burde det stykke der ikke virke? For det synes jeg desværre ikke rigtig det gør :S
Avatar billede Slettet bruger
09. juni 2009 - 13:22 #9
Jo, det burde virke. Prøv at teste det med en form som følger:

<html>
<head>
<title>Test-form</title>
</head>
<body>
<center>
<form action="din_php-side_til_test_af_login.php" method="post">
<p>
<label for="username">Username:</label><br>
<input type="text" id="username">
</p>
<p>
<label for="password">Password:</label><br>
<input type="password" id="password">
</p>
<input type="submit" value="Log ind">
</form>
</center>
</body>
</html>

Så skal du lige have smidt variablene fra POST til SESSION - så i din_php-side_til_test_af_login.php skal stå:

function CheckLogin()
{
  if (!isset($_SESSION["min_brugernavnssession"]) || !isset($_SESSION["min_kodeordssession"]))
    return false;
  $string = "SELECT password FROM min_brugertabel WHERE brugernavn=".$_SESSION["min_brugernavnssession"];
  $query = mysql_query($string);
  return ($query && $_SESSION["min_kodeordssession"] == mysql_result($query, 0));
}

$_SESSION["min_brugernavnssession"] = $_POST["username"];
$_SESSION["min_kodeordsssession"] = $_POST["password"];

if (!CheckLogin()){
  echo "ikke logget ind";
}
else {
  echo "logget ind";
}
Avatar billede Slettet bruger
09. juni 2009 - 13:23 #10
Hov...
if (!$query || kodeord != mysql_result($query, 0))
kodeord skal være sessionsvariablen for kodeordet - jeg har rettet det i koden i posten ovenfor :)
Avatar billede Slettet bruger
09. juni 2009 - 16:11 #11
Jeps okay, det var der fejlen lå ;)

Så er det så bare cookie-delen, der skal ordnes.. Her bliver jeg så nødt til at smide det krypterede password i cookien, men det var også sikkert nok at gøre eller hvordan og hvorledes? Jeg har krypteret det med salts, så det er vel sjældent at en potentiel hacker både får fat i en bruger cookie + filerne på serveren med krypteringen+salts :) ?

Men hvad var det du mente med:

b) kun gennem username i dine cookies og kræver, at brugeren for hver ny session indtaster password, hvorefter det gemmes, til sessionen afsluttes

:D?

Altså når man logger ud så unsettes de forskellige login sessions, inkl. password - men er ikke sikker på om det var det du mente :) ?
Avatar billede Slettet bruger
17. juni 2009 - 16:27 #12
Går ud fra du har overset spørgsmålet :S

Anyways... Har nu fået implementeret din funktion og det fungerer efter planen.. Dog fungerer det stadig ikke i slette scriptet :(

<?php

include_once 'includes/config.sql.php';
include_once('includes/config.functions.php');

    $db_rank = mysql_query("SELECT * FROM members_regi WHERE id='".$_SESSION['SESS_MEMBER_ID']."'") or die(mysql_error());
    $rettigheder = mysql_fetch_array($db_rank);

    function deletecomment($id){
        ($result=mysql_query("SELECT id FROM blogs_comments WHERE parent_id=".$id)) or die(mysql_error());
        while($row = mysql_fetch_assoc($result)){
            deletecomment($row['id']);
        }
        mysql_query("DELETE FROM blogs_comments WHERE id=".$id) or die(mysql_error());
    }
    if (!CheckLoginRank()){
    header("Location: index.php");
    exit();
    }
    else{
    deletecomment($_GET['id']);
    header("location:".$_SERVER['HTTP_REFERER']);
    exit();
}
?>

Uanset om man er logget ind som normal bruger, ikke logget ind, eller logget ind som administrator så smides man bare til index.php når man prøver at slette kommentarer.. Det virker meget mystisk i mine øjne, da checkloginrank funktionen virker som den skal andre steder på siden :|
Avatar billede Slettet bruger
20. juni 2009 - 06:43 #13
Ser ud til at forummet er kørt helt død, så jeg prøver at oprette et nyt forfra ;)

Hvis du vil have points må du lige smide et svar hf2ke.. Ellers trækker jeg dem bare selv tilbage, hvis du ikke samler
Avatar billede Slettet bruger
21. juni 2009 - 12:42 #14
Jeg klarer 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
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