Gå til innhold

Nekte <script> og <html> i gjestebok


Anbefalte innlegg

Heisann!

 

Jeg har nettopp kodet en gjestebok i PHP (med en god del hjelp). Kan bli funnet her. Nå er det altså noen som synes det er fryktelig morsomt å spamme denne gjesteboken med scripts og diverse html koder som legger til enorme bilder/endrer sideinnholdet osv. Er det noen som kan en kode som ikke tillater dette? Jeg har blokket for bruken av URLs allerede, men dette er ikke nok.

 

Hvis noen også kunne si meg hvordan man logger en ip adresse hadde det vært kjempefint.

Lenke til kommentar
Videoannonse
Annonse

Som sagt, så har jeg funnet en måte å blokkere URLs på, og jeg lurer på om det går an å blokkere html-elementer på samme måte. Under er koden for blokkeringen av URLs.

 

$name = htmlspecialchars(stripslashes($name));
$msn = htmlspecialchars(stripslashes($msn));
$age = htmlspecialchars(stripslashes($age));
$message = htmlspecialchars(stripslashes($message));

if(strstr($message, "www."))
{
die("Meldingen kan ikke inneholde slike tegn.");
}

Endret av hakhag
Lenke til kommentar

Jeg ville brukt htmlentities() hvis det ikke er snakk om noen database... Hvis du har en database som innleggene skrives inn i gjør du det lurt å bruke mysql_real_escape_string().

Begge disse funksjonene kan du lese om på php.net og du kan finne forskjeller mellom den og deres egenskaper her: http://www.designhjelp.com/forum/viewtopic.php?t=139

 

Der var det noen som spurte om dette :)

Endret av Rinox
Lenke til kommentar

Bruk quote_smart.

 

<?php
function quote_smart($value)
{
  if( is_array($value) ) {
      return array_map("quote_smart", $value);
  } else {
      if( get_magic_quotes_gpc() ) {
          $value = stripslashes($value);
      }
      if( $value == '' ) {
          $value = 'NULL';
      } if( !is_numeric($value) || $value[0] == '0' ) {
          $value = "'".mysql_real_escape_string($value)."'";
      }
      return $value;
  }
} 
?>

Endret av BigJackW
Lenke til kommentar

eller bare

 

 

string htmlentities ( string $string [, int $quote_style [, string $charset]] )

 

This function is identical to htmlspecialchars() in all ways, except with htmlentities(), all characters which have HTML character entity equivalents are translated into these entities.

Lenke til kommentar

Okay, så nå skal det være mulig å blokke en IP adresse, men i gjesteboka kommer denne feilmeldingen opp: Warning: in_array() [function.in-array]: Wrong datatype for second argument

 

Det er ikke noe galt med koden så vidt jeg eller noen andre kan se.

 

Koden:

 

<?php
$host = "localhost";
$user = "hakhagn_test";
$pass = "1s5N68x8";
$db = "hakhagn_test";

$conn = mysql_connect("$host","$user","$pass");
mysql_select_db($db) or die('En feil skjedde med oppkobling mot databasen!');

if (isset($_POST['send'])) {

$name = $_POST['name'];
   $msn = $_POST ['msn'];
   $age = $_POST['age'];
   $message = $_POST['message'];
   $time = date('l dS \of F Y h:i:s A');
   $ip = $_SERVER['REMOTE_ADDR'];
$BannedIPs = array("193.217.79.197");


   //html og script
   $text1 = (strip_tags($_POST['message']));
   if (!($text1 == $_POST['message'])) {
       die("Meldingen kan ikke inneholde html-elementer.");
   }

   //linker
   $name = mysql_real_escape_string(stripslashes($name));
   $msn = mysql_real_escape_string(stripslashes($msn));
   $age = mysql_real_escape_string(stripslashes($age));
   $message = mysql_real_escape_string(stripslashes($message));

   if (strstr($message, "www.")) {
       die("Meldingen kan ikke inneholde linker.");
   }

   if (empty($name )) {
       echo 'Du har ikke skrevet navnet ditt! <br>';
   } elseif (empty($age )) {
       echo 'Du har ikke skrevet hvor gammel du er! <br>';
   } elseif (empty($message )) {
       echo 'Du må skrive inn en melding!!<br>';
   } elseif (!in_array($ip, $BannedIPs)) {
       mysql_query("INSERT INTO gjestebok (time, msn, message, name, age, ip) VALUES ('$time', '$msn', '$message', '$name', '$age', '$ip')");
       echo '<b>Ditt innlegg er nå sendt!</b><br><br>';
   } else {
    echo 'Ditt innlegg ble ikke lagret.';
}
} else {
   if (in_array($ip, $BannedIPs)) {
    echo 'Du kan desverre ikke skrive i gjesteboken, fordi din ip-addresse er bannet.';
}
else { 
    echo '
	<b>
Hvis du har lyst til å legge til en kommentar til siden min, kan du gjøre det her.
IP adressen din vil bli logget, så no funny business!
</b> <br>
<form action="" method="post">
Navn <br>
<input type="text" name="name"><br /> <br>
Msn-adresse (valgfritt) <br>
<input type="text" name="msn"> <br /> <br>
Din alder <br>
<input type="text" name="age"> <br /> <br>
Melding <br>
<textarea class="melding" name="message"></textarea> <br>
<input type="submit" name="send" value="Send">
<hr  v align="left" width="665px">
</form>
';
}
}

// Skrive ut innlegg
$get = mysql_query("SELECT * FROM gjestebok");

if (mysql_num_rows($get) == 0) {
   echo 'Ingen innlegg funnet';
} else {
   while ($row = mysql_fetch_array($get)) {
       // Lage en loop forskrive ut alle innleggene
       echo '<b>Navn:</b> <br>'. htmlspecialchars($row['name']).'<br>';
       echo '<b>Tid:</b><br>'. htmlspecialchars($row['time']).'<br>';
       echo '<b>MSN:</b>'. htmlspecialchars($row['msn']).'<br>';
       echo '<b>Alder:</b><br>'. htmlspecialchars($row['age']).'<br>';
       echo '<b>Melding:</b><br>'. htmlspecialchars($row['message']).'<br><br>';
   }
}
?>

Hvordan får jeg fjernet den feilmeldingen?

Lenke til kommentar
Gjest Slettet+142

ehm.. prøv å sette disse to variablene UTENFOR if-en din. bare legg de inn sammen med database-variablene eller noe sånt.

vet ikke om det hjelper.. men.

 

disse to:

$ip = $_SERVER['REMOTE_ADDR'];

$BannedIPs = array("193.217.79.197");

Endret av Slettet+142
Lenke til kommentar

Hei

Du kan jo prøve denne, fungerer ikke det skjønner jeg ærlig talt ikke hva som er feil.

 

<?php
$host = "localhost";
$user = "hakhagn_test";
$pass = "1s5N68x8";
$db = "hakhagn_test";

$ip = $_SERVER['REMOTE_ADDR'];
$BannedIPs = array("192.168.1.100", "10.0.0.1");

$conn = mysql_connect("$host","$user","$pass");
mysql_select_db($db) or die('En feil skjedde med oppkobling mot databasen!');

if (isset($_POST['send'])) {
   
$name = $_POST['name'];
   $msn = $_POST ['msn'];
   $age = $_POST['age'];
   $message = $_POST['message'];
   $time = date('l dS \of F Y h:i:s A');

   
   //html og script
   $text1 = (strip_tags($_POST['message']));
   if (!($text1 == $_POST['message'])) {
       die("Meldingen kan ikke inneholde html-elementer.");
   }
   
   //linker
   $name = mysql_real_escape_string(stripslashes($name));
   $msn = mysql_real_escape_string(stripslashes($msn));
   $age = mysql_real_escape_string(stripslashes($age));
   $message = mysql_real_escape_string(stripslashes($message));
   
   if (strstr($message, "www.")) {
       die("Meldingen kan ikke inneholde linker.");
   }
   
   if (empty($name)) {
       echo 'Du har ikke skrevet navnet ditt! <br>';
   } 
elseif (empty($age)) {
       echo 'Du har ikke skrevet hvor gammel du er! <br>';
   } 
elseif (empty($message)) {
       echo 'Du må skrive inn en melding!!<br>';
   } 
else {
       if (in_array($ip, $BannedIPs)) {
     echo 'Du kan desverre ikke skrive i gjesteboken, fordi din ip-addresse er bannet.';
 }
 else {
     mysql_query("INSERT INTO gjestebok (time, msn, message, name, age, ip) VALUES ('$time', '$msn', '$message', '$name', '$age', '$ip')");
 	echo '<b>Ditt innlegg er nå sendt!</b><br><br>';
 }
   }
} else {
   if (in_array($ip, $BannedIPs)) {
    echo 'Du kan desverre ikke skrive i gjesteboken, fordi din ip-addresse er bannet.';
}
else {
    echo '
 <b>
Hvis du har lyst til å legge til en kommentar til siden min, kan du gjøre det her.
IP adressen din vil bli logget, så no funny business!
</b> <br>
<form action="" method="post">
Navn <br>
<input type="text" name="name"><br /> <br>
Msn-adresse (valgfritt) <br>
<input type="text" name="msn"> <br /> <br>
Din alder <br>
<input type="text" name="age"> <br /> <br>
Melding <br>
<textarea class="melding" name="message"></textarea> <br>
<input type="submit" name="send" value="Send">
<hr  v align="left" width="665px">
</form>
';
}
}

// Skrive ut innlegg
$get = mysql_query("SELECT * FROM gjestebok ORDER BY id DESC");

if (mysql_num_rows($get) == 0) {
   echo 'Ingen innlegg funnet';
} else {
   while ($row = mysql_fetch_array($get)) {
       // Lage en loop forskrive ut alle innleggene
       echo '<b>Navn:</b> <br>'. htmlspecialchars($row['name']).'<br>';
       echo '<b>Tid:</b><br>'. htmlspecialchars($row['time']).'<br>';
       echo '<b>MSN:</b>'. htmlspecialchars($row['msn']).'<br>';
       echo '<b>Alder:</b><br>'. htmlspecialchars($row['age']).'<br>';
       echo '<b>Melding:</b><br>'. htmlspecialchars($row['message']).'<br><br>';
   }
}
?>

Endret av matnorr
Lenke til kommentar

Under "Ditt innlegg ble ikke lagret" har du en høyre curly bracket for mye.

 

Det fører til:

 

if (isset($_POST['send']))
{
 $BannedIPs = Array("blabla");
 ....
 ....
} else {
 if (in_array("blabla",$BannedIPs))
 {
   ...
 }
}

 

Ved in_array() er ikke $BannedIPs satt, så funksjonen ser den som 'NULL' og gir feilmelding.

 

Bruk indentering!

 

...

 

For å nekte alle tags og alt mulig kan man skrive ut postene mellom <pre> og </pre> tags. Teksten mellom vil vises som ren tekst inkludert eventuelle tags. Altså tags blir ikke parset av browseren bortsett fra "</pre>" nødvendigvis. For å hindre at en bruker skriver inn "</pre>" og koder etter det, kan man bruke [edit: preg_replace byttet ut med...] str_replace("</pre>","",$message) hvor $message er data hentet fra tabell som skal skrives ut som innlegg.

Endret av grimjoey
Lenke til kommentar

preg_replace bør ikkje brukest når du ikkje trenger å bruke eit pattern, fordi str_replace vil kunne utføre jobben raskere.

Bedre å gjøre </pre> til </pre> så ser koden ok ut. (Med mindre < ikkje blir vist som < i <pre> da, det er eg ikkje heilt sikker på)

 

PHP

$message = str_replace("</pre>","</pre>",$message)

Lenke til kommentar

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...