webForumDet fria alternativet

Fundering kring htmlentities innan sparning i databas

PHP

9 svar · 362 visningar · startad av bassebhu

Medlem sedan nov. 20016 480 inlägg
Frågan#1

Hej!

När man postar ett formulär vill jag först att det ska komma upp en granskningssida. Då har jag gjort så att formulärsdatat skrivs ut på sidan med htmlentities för att den inte ska reagera på html.

Nu vill jag sedan skicka iväg dessa data till databas och lägger därför variablerna i hidden fields och skickar i nytt form till spara-i-databasen-sidan.

Nu uppstår problemet. Jag har läst att man helst inte ska sätta entities innan man sparar till databasen...? hur ska jag lösa det i annat fall om jag vill ha det här mellanläget med granskning, men ändå vill ha entities för att inget ska gå fel längs vägen..?

Gjorde en sök på entities men fann inget om just det här.. =/

Tack!

Medlem sedan apr. 2002830 inlägg
#2

Du kan väl helt enkelt ta bort dessa innan de läggs in i databasen? Även fast du har den som entities i dina hidden fields så kan du ju köra en html_entity_decode() innan du slänger in det i databasen!

// Nippe

Medlem sedan juni 20006 031 inlägg
#3

Man brukar ju köra in uppgifter i databasen som den är för att det är enklare att plocka ut den om man ska redigera texten.

Men med tanke på säkerhet och sådant så ska man ju passa sig med tanke på XSS (cross site scripting) och SQL injectons mm så detta är något man kanske bör tänka mer på.

Har funderat en hel del på detta på sistone och hittat Mattes lilla funktioner, men har ännu inte funderat igenom om dom är 100 procentiga men du kan ju testa hur den funkar. ;)

Mattes kod:

<?php

/*
    Funktion som rensar texten från html-taggar
    samt gör om tecken typ Å,Ä,Ö,& m.fl till entiteter.
    Rensar även från radslutstecken och mellanslag
    i början och slutet av texten.
    Byter också ut radslutstecken i texten mot <br />.
    ENT_QUOTES betyder att man även byter ut ' mot &#039; .
    Byter även ut tecknet | (124) eftersom jag brukar använda
    det som skiljetecken i textfiler.
    Används:
        $text = cleanText($text);
*/
function cleanText($text){
    $text = htmlentities ($text, ENT_QUOTES);
    $text = stripslashes($text);

    $text = trim($text);
    $text = str_replace("|", "&#124;", $text);
    $text = preg_replace("/(\r\n|\r|\n)/", "<br />", $text);
    return $text;
}

/*
    Kör ovanstående funktion baklänges. Kan användas om man
    t.ex i ett admin-skript vill gå in och ändra det som är
    kört genom ovanstående funktion och sparat.
    Uppmärksamma personer kanske ser att jag snott
    huvuddelen av denna nästan rakt av från manualen. :-)
    Används:
        $text = uncleanText($text);
*/
function uncleanText($text){
    $trans_tbl = get_html_translation_table(HTML_ENTITIES);
    $trans_tbl = array_flip($trans_tbl);
    $text = str_replace("&#039;", "'", $text);
    $text = str_replace("&#124;", "|", $text);
    $text = str_replace("<br />", "\r\n", $text);
    return strtr($text, $trans_tbl);
}

?>
Medlem sedan nov. 20016 480 inlägg
#4

ok tack. den ska provas :)

gäller även om den där magic quotes är på ON?

Medlem sedan juni 20006 031 inlägg
#5

Addslashes lägger ju till ett snedstreck framför ', ", \, och NULL.
Detta görs ju automatiskt om Magic_gpc_quotes är On men kan man köra för mycket för att vara säker?

Har funderat ganska mycket den sista veckan ang. säkerhet och sådant men har själv en del frågor som jag söker svar på.

Kan för övrigt tipsa dig om PHP portalens artikel om säkerhet och php.
http://www.phpportalen.net/wiki/index.php?page=PHP+och+s�kerhet

Medlem sedan nov. 20016 480 inlägg
#6

tack :) ska läsa...

Medlem sedan nov. 20016 480 inlägg
#7

men som jag förstår det ska mattes script användas innan man sparar till databas. och då följer man ju inte det rekommenderade att inte röra infot innan man sparar till databas! :o

Medlem sedan mars 20025 907 inlägg
#8

Begriper inte vad problemet är egentligen. Om du mellanlagrar din data i ett hidden-field (datan körd genom htmlentities()) och submittar formuläret så får du ju korrekt htmlkod skickad från formuläret
Ta följande kod som exempel:

<?php
if(isset($_POST['data']))
	$data = $_POST['data'];
else
	$data = '';
?>

<form method="post" action="?">
<textarea name="data"><?php echo htmlentities($data);?></textarea>
<input type="submit">
</form>

<?php echo $data;?>

Dvs, $data kommer alltid att innehålla icke bearbetad htmlkod.

Medlem sedan nov. 20016 480 inlägg
#9

japp. men när jag sedan på nästa sida skickar iväg:
<textarea name="data"><?php echo htmlentities($data);?></textarea>
så kommer det som htmlentities-omvandlat till sidan jag ska spara i databasen. och det var som sagt det jag läste man helst skulle undvika. men jag spanar in den här funktionen html_entity_decode() så länge...

tycker ändå att det verkar som att mattes script är tänkt att spara info som omvandlat i databasen ;)

Medlem sedan aug. 20002 975 inlägg
#10

Funktionen är gjord en gång i tiden för att spara ned på en rad i en textfil :)
Som jag ser det idag är den ganska så overkill.

Men som Peeer säger, html_entity_decode() har du ingen som helst anledning att köra då den omvandlingen du gör med html_entity_decode() görs automatiskt när du postar formuläret.

246 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
119 ms — deklarationer (db)
0 ms — hämta statistik (cache)
123 ms — hämta tråd, inlägg och bilagor (db)
119 ms — ändringar (db)