Anders Moen Skrevet 2. februar 2007 Skrevet 2. februar 2007 (endret) Bare lurte på hvordan sikkerheten er i disse scriptene mine? hente_ut_fra_database.php Klikk for å se/fjerne innholdet nedenfor <?php $con = mysql_connect("localhost","brukernavn","passord"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("db_navn", $con); function bbcode($tekst) { $tekst = str_replace("\n", "<br />", $tekst); return $tekst; } $result = mysql_query("SELECT * FROM comments ORDER BY `id` DESC LIMIT 0, 10"); echo "<div style='width: 600px; margin: 0 auto; text-align: left;'>"; while($row = mysql_fetch_array($result)) { echo "<div style='background-color: transparent; background-image: url(images/S.jpg);'>"; echo "<p style='padding: 15px;'>"; echo "<span style='background-color: #DFDFDF;'>"; echo "<em>"; echo " Written by "; echo "<a href='mailto:$row[epost]'>$row[navn]</a> "; echo "</em>"; echo "</span>"; echo "<br />"; echo "<br />"; echo "".bbcode($row[innhold]).""; echo "</p>"; echo "<p>"; echo " "; echo "</p>"; echo "</div>"; echo "<br />"; } echo "</div>"; mysql_close($con); ?> legg_inn_i_database.php Klikk for å se/fjerne innholdet nedenfor <?php $db=mysql_connect("localhost", "brukernavn", "passord"); mysql_select_db("db_navn", $db); // trenger jeg disse 2 linjene egentlig? if(isset($_POST['submit'])) { $con = mysql_connect("localhost","brukernavn","passord"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("db_navn", $con); $sql="INSERT INTO comments (navn, epost, innhold) VALUES ('$_POST[navn]','$_POST[epost]','$_POST[innhold]')"; if (!mysql_query($sql,$con)) { die('Error: ' . mysql_error()); } echo "Your comment was added. Please go back <a href='index.php'>home</a> again."; } else { echo " <form action='' method='post'> <p>Your name<br /><input type='text' name='navn' size='50' /></p> <p>Your message<br /><textarea cols='37' rows='10' name='innhold'></textarea></p> <p>Your email<br /><input type='text' name='epost' size='50' /></p> <p> <br /><input type='submit' name='submit' value='Legg til' /></p> </form> "; } ?> logg_inn.php Klikk for å se/fjerne innholdet nedenfor <?php if ($_SESSION['online']) { echo " <meta http-equiv=\"refresh\" content=\"3;url=members/index.php\" /> Welcome " . $_SESSION['bruker'] . " "; } else if (isset($_POST['bruker']) && isset($_POST['pass'])) { $db=mysql_connect("localhost", "brukernavn", "passord"); mysql_select_db("db_navn", $db); $bruker = htmlentities($_POST['bruker']); $pass = htmlentities($_POST['pass']); $bruker = mysql_real_escape_string($bruker); $pass = mysql_real_escape_string($pass); $query = mysql_query("SELECT bruker, pass FROM Members WHERE bruker = '$bruker' AND pass = '$pass'"); if(mysql_num_rows($query) == 1) { $_SESSION['online'] = true; $_SESSION['bruker'] = $bruker; echo " <meta http-equiv=\"refresh\" content=\"3;url=members/index.php\" /> Welcome $bruker! "; mysql_close($db); } if(mysql_num_rows($query) == 0) { $_SESSION['online'] = false; echo " Incorrect username or password! <br /> Please <a href=\"login.php\">try again</a>, and if you don't have an account, <a href=\"register.php\">register</a> one. "; mysql_close($db); } } else { ?> <form action="" method="post"> <p>Username</p> <input type="text" name="bruker" /> <br /> <p>Password:</p> <input type="password" name="pass" /> <br /> <br /> <input type="submit" name="submit" value="Login" /> </form> <?php } ?> en_side_som_sjekker_om_logget_inn=sant.php (tror denne er lik den over?) Klikk for å se/fjerne innholdet nedenfor <?php if ($_SESSION['online']) { echo " <a href=\"logout.php\">Log out</a><br /> Welcome " . $_SESSION['bruker']; } else if (isset($_POST['bruker']) && isset($_POST['pass'])) { $db=mysql_connect("localhost", "brukernavn", "passord"); mysql_select_db("db_navn", $db); $bruker = htmlentities($_POST['bruker']); $pass = htmlentities($_POST['pass']); $bruker = mysql_real_escape_string($bruker); $pass = mysql_real_escape_string($pass); $query = mysql_query("SELECT bruker, pass FROM Members WHERE bruker = '$bruker' AND pass = '$pass'"); if(mysql_num_rows($query) == 1) { $_SESSION['online'] = true; $_SESSION['bruker'] = $bruker; echo " Hello $bruker! "; mysql_close($db); } } else { ?> <form action="" method="post"> <p>Username</p> <input type="text" name="bruker" /> <br /> <p>Password:</p> <input type="password" name="pass" /> <br /> <br /> <input type="submit" value="Login" /> </form> <?php } ?> sok.php Klikk for å se/fjerne innholdet nedenfor <?php $con = mysql_connect("localhost","brukernavn","passord"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("db_navn", $con); if (isset($_POST[submit])) { $check = mysql_real_escape_string($_POST['check']); if (empty($check)) { die('Fyll ut alle feltene!'); } echo "Du søkte på: {$check} <br />"; echo "<br />"; echo "<br />"; echo "<b>Du fikk"; $result = mysql_query("SELECT * FROM nyheter_1 WHERE tittel LIKE '%$check%'"); echo " " . mysql_num_rows($result) . " resultat(er).</b>"; while ($row = mysql_fetch_array($result)) { echo "<br />"; echo "<h3>"; echo "<a href=\"$row[id].php\"><i>".$row['tittel']."</i></a>"; echo "</h3>"; echo "<br />"; } } ?> Endret 2. februar 2007 av Andy-Pandy
ze5400 Skrevet 2. februar 2007 Skrevet 2. februar 2007 Betydelig dårligere nå sum du har lagt det ut Husker du å escape alt du setter inn i databasen? (Er så lat at jeg ikke orker å lese igjennom ) mysql_select_db("db_navn", $db); // trenger jeg disse 2 linjene egentlig? Både ja og nei, er en fordel at du definerer hvilken database du vil jobbe i med mindre du elsker å skrive dbname.tabell i hver eneste spørring istedenfor tabell. Jeg foretrekker mysql_select_db("Dbnavn") or die("En feil oppstod"); Vær så snill å ikke skyt meg om jeg sa noe dumt eller galt.
Anders Moen Skrevet 2. februar 2007 Forfatter Skrevet 2. februar 2007 Med å escape, er det her koden? mysql_real_escape_string og så noe mer?
xqus Skrevet 2. februar 2007 Skrevet 2. februar 2007 Kommentarer er sårbar for SQL injection og XSS? Ser ikke noe escaping før data brukes i SQL spørring. Heller ikke noe escaping av HTML før kommentarer vises heller? sok.php er også sårbar for XSS. Ingen escaping før søkeordet vises på siden?
Anders Moen Skrevet 2. februar 2007 Forfatter Skrevet 2. februar 2007 Og hvordan gjør jeg at den ikke er sårbar for XSS?
PHPdude Skrevet 2. februar 2007 Skrevet 2. februar 2007 Og hvordan gjør jeg at den ikke er sårbar for XSS? 7856281[/snapback] XSS: Funksjoner som strip_tags() og htmlentities() hjelper vel mye. Ellers så har du masse småfeil og heller grove feil som "$row[navn]". Når du skriver dette så bruker du konstanten "navn" og den er ikke definert så derfor lages det en feil. For å bruke tekststrengen "navn" så må du skrive sånn: "$row['name']" Set error_reporting(E_ALL | E_STRICT) så unngår du sånne feil.
eigan Skrevet 2. februar 2007 Skrevet 2. februar 2007 Nå orker jeg ikke lese så mye av kodene så jeg sier noe annet Når du skal velge bruker til databasen, er det alltid triks å lage en bruker som kun skal bruke de funksjonen du skal ha i scriptet... Hvis en person får tak i brukernavnet og passordet, eller gjør en injection, så kan han plutserlig gjøre større ting en det du aldri hadde tenkt til med den brukeren, eks, lage flere brukere, lage tabbeler, osv Lykke til videre
Anders Moen Skrevet 2. februar 2007 Forfatter Skrevet 2. februar 2007 Ok, skjønte ikke helt hva du mente, men takk likevel
stian90_2 Skrevet 3. februar 2007 Skrevet 3. februar 2007 1: ta og bruk htmlspecialchars() på det du setter inni databasen 2: på søk, ta og ta str_replace("%", "", $strign); for hvist ikke kan en søke på % og få listet opp alt som eksisterer i tabellen, noe som ikke alltid er ønskelig, men for all del 3: bruk WHERE pass='$pass' AND bruker='$bruker' for OM du skulle få en mysql injection vil ikke dette bli påvirket. Litt vannskelig og forklare akuratt den, men du skjønner sikkert poenget
Anders Moen Skrevet 3. februar 2007 Forfatter Skrevet 3. februar 2007 1: ta og bruk htmlspecialchars() på det du setter inni databasen 2: på søk, ta og ta str_replace("%", "", $strign); for hvist ikke kan en søke på % og få listet opp alt som eksisterer i tabellen, noe som ikke alltid er ønskelig, men for all del 3: bruk WHERE pass='$pass' AND bruker='$bruker' for OM du skulle få en mysql injection vil ikke dette bli påvirket. Litt vannskelig og forklare akuratt den, men du skjønner sikkert poenget 7862612[/snapback] Takk! Det beste svaret hittil Skal prøve å få gjort dette
xqus Skrevet 3. februar 2007 Skrevet 3. februar 2007 1: ta og bruk htmlspecialchars() på det du setter inni databasen Gjør det heller før du skriver det ut til nettleser.. På en måten, har du fremdeles originalversjonen i databasen.
Matsemann Skrevet 4. februar 2007 Skrevet 4. februar 2007 1: ta og bruk htmlspecialchars() på det du setter inni databasen 7862612[/snapback] Og hva hjelper det? Bruk heller funksjonen magic_quotes (google), da den escaper farlig input, og hindrer SQL-injection. htmlspecialchars og htmlentities er når du skal skrive ut til bruker, for å hindre XSS. Det Mr.Chief mente var å sette restriksjoner på hva database-brukeren kan gjøre, slik at om det mot formodning skulle være noen sikkerhetshull, så vil de kun få ødelagt/endret på databasen som tilhører den koden.
PHPdude Skrevet 4. februar 2007 Skrevet 4. februar 2007 1: ta og bruk htmlspecialchars() på det du setter inni databasen 7862612[/snapback] Og hva hjelper det? Bruk heller funksjonen magic_quotes (google), da den escaper farlig input, og hindrer SQL-injection. htmlspecialchars og htmlentities er når du skal skrive ut til bruker, for å hindre XSS. Det Mr.Chief mente var å sette restriksjoner på hva database-brukeren kan gjøre, slik at om det mot formodning skulle være noen sikkerhetshull, så vil de kun få ødelagt/endret på databasen som tilhører den koden. 7871623[/snapback] magic_quotes? Nei, for all del! Ekstremt viktig med escaping av input til databasen, men å basere seg på magic_quotes = on blir et helvete. Er en grunn til at magic_quotes er disabled i PHP5 og fullstendig fjernet i PHP6. Benytt heller et rammeverk som har en løsning for disse problemene, eller escape data med funksjonen til database-modulen. f.eks mysql_escape_string()
Manfred Skrevet 4. februar 2007 Skrevet 4. februar 2007 Ellers så har du masse småfeil og heller grove feil som "$row[navn]". Når du skriver dette så bruker du konstanten "navn" og den er ikke definert så derfor lages det en feil. For å bruke tekststrengen "navn" så må du skrive sånn: "$row['name']" 7856795[/snapback] Nå er det DU som tar helt feil her da.. Så lenge ikke serveren krever en STRICT kode, så er "$row[navn]" helt ok det... Så lenge du er inne i en ", så funker det å skrive tekststringene slik. "$row[navn]" blir da det samme som $row['navn'] eller $row["navn"] Hjem og les leksene dine nå
PHPdude Skrevet 4. februar 2007 Skrevet 4. februar 2007 (endret) Ellers så har du masse småfeil og heller grove feil som "$row[navn]". Når du skriver dette så bruker du konstanten "navn" og den er ikke definert så derfor lages det en feil. For å bruke tekststrengen "navn" så må du skrive sånn: "$row['name']" 7856795[/snapback] Nå er det DU som tar helt feil her da.. Så lenge ikke serveren krever en STRICT kode, så er "$row[navn]" helt ok det... Så lenge du er inne i en ", så funker det å skrive tekststringene slik. "$row[navn]" blir da det samme som $row['navn'] eller $row["navn"] Hjem og les leksene dine nå 7872282[/snapback] Sant det! Tenkte ikke på at det blir annerledens inne i "". Men du tar nok feil du også Fordi det har ingenting med STRICT å gjøre. Tydelig at PHP inne i "" tolker $row[name] akkurat som $row["name"] ellers. For det lages ikke noen E_STRICT, selv pleier jeg alltid å skrive det som {$row['name']}, men ser at det ikke er nødvendig nei. Endret 4. februar 2007 av PHPdude
Anders Moen Skrevet 4. februar 2007 Forfatter Skrevet 4. februar 2007 Ja, ja... Ikke mer av det nå, please? Vil jo bare ha litt hjelp her! hehe
Matsemann Skrevet 4. februar 2007 Skrevet 4. februar 2007 magic_quotes? Nei, for all del! Ekstremt viktig med escaping av input til databasen, men å basere seg på magic_quotes = on blir et helvete. Er en grunn til at magic_quotes er disabled i PHP5 og fullstendig fjernet i PHP6. Benytt heller et rammeverk som har en løsning for disse problemene, eller escape data med funksjonen til database-modulen. f.eks mysql_escape_string() 7871978[/snapback] Beklager, stor tenkebom, har ikke skrevet PHP på uker. Mente såklart funksjonen quote_smart... En slags smart måte å bruke mysql_escape_string på
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å