Ongewenste slash bij fopen

Status
Niet open voor verdere reacties.

DennisBosma

Gebruiker
Lid geworden
4 sep 2009
Berichten
382
Hallo,
Ik heb een probleem en kom er niet uit en kan ook niks vinden wat mij kan helpen met de oplossing..

De script hieronder heb ik op een website staan. Hier kan ik op inloggen en platte tekst in HTML veranderen.
Alleen elke keer als ik het opsla met een link of afbeeldingen erin krijg ik bijv dit:

HTML:
<img src=\"kalender2013.jpg\" width=\"100\" height=\"100\" />

Er worden slashe's toegevoegd en daardoor werkt de afbeeldingen niet.
Is hier een oplossing voor?
Daar zou ik erg blij mee zijn want ik kom er echt niet meer uit..

Alsvast bedankt!


Script:
PHP:
<?php session_start();?>


<?php
if (empty($_POST) && isset($_GET['action'])) {
		$action = $_GET['action'];
		switch ($action) {
			case 'logout':
				session_unset();
				session_destroy();
				break;
	}
}
if (!isset($_SESSION['user'])) {
	$user = '';
	$pass = '';
	if (isset($_POST['login'])) {
		$user = strtolower(trim($_POST['user']));
		$pass = $_POST['pass'];
		$errors = array();
		if ($user == '' || $user != '2000') {
			$errors['user'] = '';
		}
		if ($pass == '' || $pass != '2000') {
			$errors['pass'] = '';
		}
		if (empty($errors)) {
			$_SESSION['user'] = $user;
		} else {
			echo '<p class="error">Please fill in your correct ';
			if (isset($errors['user']))
				echo 'username';
			if (count($errors) == 2)
				echo ' and ';
			if (isset($errors['pass']))
				echo 'password';
			echo '.</p>', "\n";
		}
	}
}
if (isset($_SESSION['user'])) {
	$user = $_SESSION['user'];
?>
<div id="headertext">
	<p class="l">You are logged in as <strong><?php echo $user?></strong>.</p>
	<p class="r"><a href="?action=logout">Logout</a></p>
</div>
<?php

function no_magic_quotes($query) {
        $data = explode("\\",$query);
        $cleaned = implode("",$data);
        return $cleaned;
}

	if (isset($_POST['edit'])) {
		if (file_put_contents('agendacontent.txt', $_POST['agendacontent']) !== FALSE)
			echo '<p class="succes">Your changes are saved.</p>', "\n";
	}
	$agendacontent = file_get_contents('agendacontent.txt');
?>
<form method="post" action="">
	<textarea name="agendacontent" id="agendacontent" rows="20" cols="55"><?php echo $agendacontent?></textarea>
	<p><button type="submit" name="edit">Save changes</button></p>
</form>
<?php } else {?>
<form method="post" action="" id="login">
	<p>
		<label for="user">Username:</label><input type="text" name="user" id="user" value="<?php echo $user?>" />
	</p>
	<p>
		<label for="pass">Password:</label><input type="password" name="pass" id="pass" value="<?php echo $pass?>" />
	</p>
	<p>
		<button type="submit" name="login">Login</button>
	</p>
</form>
<?php }?>
 
die slashen zorgen ervoor dat het een geldige string blijft.
aangezien " een sluit/start van een string is.
een slash zorgt dat dit genegeert word

kijk is bij no_magic_quotes of het probleem daar ontstaat

gr,
Maxim
 
Dit soort slashes komt inderdaad meestal van magic_quotes.

De vuistregel is dan ook: zet magic_quotes uit, overal, helemaal en altijd. Dat kan in php.ini en in .htaccess.
Het escapen dat magic_quotes doet is namelijk nergens geschikt voor, niet voor HTML, niet voor SQL, nergens voor. Het sloopt echter wel je data en je kunt het niet ongedaan maken
als je niet 100% zeker weet dat de slashes zijn toegevoegd door magic_quotes of addslashes() (nog zo'n wonderlijke functie). En helaas, het is niet mogelijk om dat te herkennen aan alleen de string.

ps: de no_magic_quotes functie is natuurlijk een beetje raar he, exploden en weer imploden is hetzelfde als str_replace(), maar dat is *niet* hetzelfde als het weghalen van de slashes. *als* je de slashes van magic_quotes weg wilt halen dan is daar strip_slashes voor, maar ook die mag je alleen aanroepen als je weet dat mgic-quotes aanstaat.

pps:
session_unset();
session_destroy();

Waarom vernietig je de hele session als je alleen maar uitlogt? Dit is eenb ug in wording. haal hij het uitloggen alleen de relevante data weg maar vernietig de session niet.
 
Dit soort slashes komt inderdaad meestal van magic_quotes.

De vuistregel is dan ook: zet magic_quotes uit, overal, helemaal en altijd. Dat kan in php.ini en in .htaccess.
Het escapen dat magic_quotes doet is namelijk nergens geschikt voor, niet voor HTML, niet voor SQL, nergens voor. Het sloopt echter wel je data en je kunt het niet ongedaan maken
als je niet 100% zeker weet dat de slashes zijn toegevoegd door magic_quotes of addslashes() (nog zo'n wonderlijke functie). En helaas, het is niet mogelijk om dat te herkennen aan alleen de string.

ps: de no_magic_quotes functie is natuurlijk een beetje raar he, exploden en weer imploden is hetzelfde als str_replace(), maar dat is *niet* hetzelfde als het weghalen van de slashes. *als* je de slashes van magic_quotes weg wilt halen dan is daar strip_slashes voor, maar ook die mag je alleen aanroepen als je weet dat mgic-quotes aanstaat.

pps:


Waarom vernietig je de hele session als je alleen maar uitlogt? Dit is eenb ug in wording. haal hij het uitloggen alleen de relevante data weg maar vernietig de session niet.

Bedankt voor de brede uitleg. Hoe moet ik nu te werk gaan? Iets toevoegen in mijn php-script?
Wat bedoel je met de laatste vraag over de Session?
 
De eerste stap is zorgen dat magic_quotes helemaal uit staat, zie: http://www.php.net/manual/en/security.magicquotes.disabling.php
Daarna moetje *alleen* voor de database queries de variablen die je aan de query geeft door mysql_real_escape_string halen.
De dat adie uit de database terugkomt kun je direct gebruiken, dus geen stripslashes() ofzo. De escape functie voegt de slashes namelijk alleen toe zodat de database weet dat leestekens in de tekst als tekst moeten worden gezien en niet als onderdeel van de query.

Over de session: simpel gezegd komt het erop neer dat je mensen niet aanlogt door $_SESSION aan te maken, en dus log je mensen ook niet uit door $_SESSION te vernietigen.
Iets precieser: $_SESSION kan vanalles bevatten, waaronder data die helemaal niets te maken heeft met of de bezoeker is aangelogd of niet. Simpelweg $_SESSION wissen kan/zal dus ook data weghalen die je bij het uitloggen helemaal niet kwijt wilt/mag raken.

Zet alle data die voor het inloggen van belang is in een aparte var binnen $_SESSION, dan kun je mensen uitloggen door alleen die ene var weg te gooien:

Inloggen:
$_SESSION['currentuser'] =array('userid'=>353, ... );

Uitloggen:
$_SESSION['currentuser'] = null;
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan