Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  5 4622

Kode

<?php
	//Henter kommentarer og lagrer dem i databasen, og viser "skriv kommentar" feltet
	if (isset($_REQUEST['writeComment'])) {
		//En kommentar er skrevet og må nå lagres
		
		
		$postComment = $_REQUEST['postSnap'];
		
		//Spør noe om PostComment faktisk inneholder en kommentar
		if ($postComment == "") {
			
		} else {
			
			$userId = $_COOKIE["userId"];
			$date = date("y-m-d");
			//$time = date("G:i:s");
			$time = date("G");
			$time = $time +1;
			$min = date("i:s");
			$dateTime = $date . " " . $time . ":" . $min;
			
			require "../../config/db.php";
			
			// Oppretter forbindelse til DB
			$conn = new mysqli($DATABASE_HOST, $DATABASE_USER, $DATABASE_PASS, $DATABASE_NAME);

			// Sjekker forbindelse
			if (!$conn) {
				die("Connection failed: " . mysqli_connect_error());
			}
							
			$sql = "INSERT INTO `snapMessage` (`id`, `siteid`, `snapDate`, `userid`, `snap`)
					VALUES ('', '$activeSiteId', '$dateTime', '$userId', '$postComment')";
			
			//Skriver til database
			if ($conn->query($sql) === TRUE) {
				//Opprydding. Fjerner text felter, slik at det ikke lagres flere ganger.
			}
			
			$conn->close();
			
		}
	}
?>

HTML-kode

<form class='write-comment' name='writeComment' action='checked-inn-active.php#snap-box' method='post'>
		<input type='text' class='hide' name='siteId' value='$activeSiteId'>
		<input type='text' class='hide' name='useraction' value='site'>
		
<textarea name='postSnap' maxlength='100' placeholder='Write your snap messange, max 100 caraters' rows='5' required></textarea>

<button class='fa fa-paper-plane btn-Secondary' style='margin-top: 0px;' type='submit' name='writeComment' value='Post snap message'><b> Post snap message</b></button>

</form>
på forhånd takk for svar
Sist endret av ertsaas; 2. september 2021 kl. 12:23.
Du bør bruke f.eks. mysql_real_escape_string (mysqli_real_escape_string).

Dette vil føre til at brukeren får færre muligheter til å legge inn en skadelig kode som kommentar.
Bare gjør ting enkelt for deg selv med en gang og bruk parameteriserte spørringer med en gang.

I PHP tror jeg det i hovedsak er via prepared statements. Og på den måten er du beskyttet mot SQL-injection.

Det å bruke styringer på den måten der er utrolig skummelt. Og selv med tipset til tysteren over ville jeg ikke følt meg trygg på at den funksjonen klarer å fange alle mulige injection-angrep.

Mer om prepared statements, med eksempel kan du se her: https://www.php.net/manual/en/mysqli...statements.php

Altså blir det i ditt tilfelle noe tilsvarende dette: (garanterer ikke at the funker 100%, da jeg ikke har PHP installert så får ikke testet koden)

Kode

                
$stmt = $conn->prepare("INSERT INTO `snapMessage` (`id`, `siteid`, `snapDate`, `userid`, `snap`) VALUES ('', :siteid, :snapdate, :userid, :snap)");

$stmt->bindParam(":siteid", activeSiteId)
$stmt->bindParam(":snapdate", dateTime)
$stmt->bindParam(":userid", userId)
$stmt->bindParam(":snap", postComment)
Sist endret av etse; 2. september 2021 kl. 12:46. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
PDOer et bibliotek til PHP som er sikrere enn de eldre mysql-kommandoene.

Her er et eksempel fra php.net:

Kode

/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindValue(':calories', $calories, PDO::PARAM_INT);
$sth->bindValue(':colour', $colour, PDO::PARAM_STR);
$sth->execute();
I tillegg bør du se på "Input sanitization", dette ser ut som kommentarer, så da bør du fjerne script-tags, iframes, og annen html du eventuelt ikke vil godkjenne.
+1 For prepared statements. De hindrer automatisk en stor del av injection-muligheter, ved at man ikke lengre kan endre selve "setningstrukturen" i spørringen.

En ting de derimot ikke gjør, er å hindre logiske feil. Eksempelvis å lese/overskrive ting vha. å styre et ID-felt (en feil kalt IDOR, eller
Insecure direct object references), eller muligheten til å sende inn veldig korte/veldig lange strenger som får noe til å kræsje.

Som Yochi nevner, så bør data også saniteres hvis det er ment for å kunne publisere innhold på en nettside. Dvs. fjerne muligheten til å bruke tags i det hele tatt, slik at besøkende ikke sender inn HTML-kode som gjør stygge ting. Dette fikses enkelt av f.eks. "htmlentities"-funksjonen, men du bør legge deg til en strategi hvor du ENTEN saniterer all data på vei INN i databasen, eller på vei UT. Ikke begge deler. En god blanding, vil før eller siden føre til at du glemmer deg og tenker at noe er sanitert, uten at det er det. Eller at noe dobbel-saniteres og blir helt uleselig.
Anbefaler deg å bruke nettstedet PHP The Right Way aktivt. Du behøver å ta i bruk saniteringer av input (ikke brukt data fra $_REQUEST direkte) og parametrisert spørring (her demonstrert via PDO, men mysqli går "hvis du må").