Gå til innhold

Hvordan er sikkerheten i disse scriptene?


Anbefalte innlegg

Skrevet (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 av Andy-Pandy
Videoannonse
Annonse
Skrevet

Betydelig dårligere nå sum du har lagt det ut :p

 

Husker du å escape alt du setter inn i databasen? (Er så lat at jeg ikke orker å lese igjennom :p)

 

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.

Skrevet

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?

Skrevet
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.

Skrevet

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 :thumbup:

Skrevet

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 :)

Skrevet
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

Skrevet
1: ta og bruk htmlspecialchars() på det du setter inni databasen :)

 

Gjør det heller før du skriver det ut til nettleser.. :p

 

På en måten, har du fremdeles originalversjonen i databasen.

Skrevet
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.

Skrevet
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()

Skrevet
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å ;)

Skrevet (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å :p 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. :hmm:

Endret av PHPdude
Skrevet
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å :thumbup:

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...