CKeditor doet raar.

Pagina: 1
Acties:

Onderwerpen


  • Strunkie
  • Registratie: Februari 2008
  • Laatst online: 21-10-2024

Strunkie

> Post is rechts!

Topicstarter
Hallo Tweakers.

Ik maak gebruik van CKeditor in mijn CMS.
Nu worden mijn afbeeldingen verwijderd wanneer ik bijvoorbeeld een afbeelding toevoeg.
Dit is de code van mijn tekstformulier:

code:
1
2
3
4
5
6
7
<textarea name="tekst_nl" id="tekst_nl"><? if($_POST['tekst_nl']) echo $_POST['tekst_nl']; elseif(isset($_SESSION['pagina_tekst_nl_bewerken'])) echo $_SESSION['pagina_tekst_nl_bewerken']; ?></textarea>
<script type="text/javascript">
      CKEDITOR.replace( 'tekst_nl',
      {
         enterMode : CKEDITOR.ENTER_BR
    });
</script>


Wanneer ik het volgende toevoeg in ckeditor:
code:
1
<img src="http://www.xxx.nl/afbeeldingen/origineel/7674542.jpg" style="margin: 5px; float: left;" />


Wordt dit na een post refresh toegevoegd:
code:
1
&lt;img src='\&quot;http://www.xxx.nl/afbeeldingen/origineel/7674542.jpg\&quot;' data-cke-saved-src=&quot;\&quot; left;\&quot;=&quot;&quot; 5px;=&quot;&quot;&gt;


Hoe kan dit en hoe is dit op te lossen?

Kevin

^ Post is hierboven!


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Switchen naar HTML/Code/Source view en dan je <img...> plakken :? Wat je ziet is HTML escaping.

Maar ik kan eigenlijk maar weinig hout snijden van je post. Mijn glazen bol zegt me echter dat er één of andere "magic escape silver bullet" functie gebruikt wordt die alle $_POST vars door htmlentities() danwel htmlspecialchars() haalt ofzo.

[ Voor 111% gewijzigd door RobIII op 28-09-2011 18:48 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Strunkie
  • Registratie: Februari 2008
  • Laatst online: 21-10-2024

Strunkie

> Post is rechts!

Topicstarter
RobIII schreef op woensdag 28 september 2011 @ 18:44:
Switchen naar HTML/Code view en dan je <img...> plakken :? Wat je ziet is HTML escaping
Als ik een afbeelding toevoeg wil ik de tekst daarna weer opnieuw toevoegen dmv $_POST[''] maar post krijgt dus die waarde.
In de database wordt het wel goed neergezet.

Ik weet wel dat dit html escaping is maar dat is niet de bedoeling...

^ Post is hierboven!


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
kiwie2 schreef op woensdag 28 september 2011 @ 18:47:
[...]


Als ik een afbeelding toevoeg wil ik de tekst daarna weer opnieuw toevoegen dmv $_POST[''] maar post krijgt dus die waarde.
In de database wordt het wel goed neergezet.

Ik weet wel dat dit html escaping is maar dat is niet de bedoeling...
Check even mijn edit. Verder kan ik CKEditor niet maar ik kan me voorstellen dat 'ie (by default, "om op veilig te spelen") alles escaped on-submit. Volgens een vluchtige zoektocht op Google zou dat aan een plugin kunnen liggen of als 'ie (bijv.) in BBCode-mode zou staan ofzo en anders moet je eens kijken naar htmlEncodeOutput.

Maar wat heb je zelf al geprobeerd/gezocht/gevonden eigenlijk?

[ Voor 49% gewijzigd door RobIII op 28-09-2011 18:54 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Strunkie
  • Registratie: Februari 2008
  • Laatst online: 21-10-2024

Strunkie

> Post is rechts!

Topicstarter
Een $_POST[''] kan nooit van te voren door zo'n functie heen gehaald zijn.
Deze code zet de tekst terug:
code:
1
if($_POST['tekst_nl']) echo $_POST['tekst_nl'];

^ Post is hierboven!


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
kiwie2 schreef op woensdag 28 september 2011 @ 18:52:
Een $_POST[''] kan nooit van te voren door zo'n functie heen gehaald zijn.
Ik heb 't vaak zat zien gebeuren hoor :? Het stikt hier van de topics waar je iets ziet als:
PHP:
1
2
3
4
5
6
7
8
$_POST = MakeSafeVars($_POST);
//Of...
MakeSafeVars($_POST);
//of iets van die strekking...
...
...
...
$foo = $_POST['somestring'];

[ Voor 31% gewijzigd door RobIII op 28-09-2011 18:59 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Strunkie
  • Registratie: Februari 2008
  • Laatst online: 21-10-2024

Strunkie

> Post is rechts!

Topicstarter
Nu ik: stripslashes() heb toegevoegd op $_POST[] werkt die wel.
Erg raar lijkt me namelijk niet de bedoeling.
Dan houdt het in dat CKeditor alles beveiligd doorgeeft?!

^ Post is hierboven!


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
kiwie2 schreef op woensdag 28 september 2011 @ 18:55:
Nu ik: stripslashes() heb toegevoegd op $_POST[] werkt die wel.
Erg raar lijkt me namelijk niet de bedoeling.
Dan houdt het in dat CKeditor alles beveiligd doorgeeft?!
Daarbij is stripslashes hier helemaal niet de juiste functie voor; als je dan toch een functie moest gebruiken dan moest je html_entity_decode oid hebben.

Edit: Nou, zo te zien staan er wel degelijk slashes in je escaped string. Hoe ze er in komen weet ik niet maar ik neig toch héél erg naar een "gelijk" van mijn glazen bol danwel "magic quotes".

De decoded string is nml:
HTML:
1
<img src='\"http://www.xxx.nl/afbeeldingen/origineel/7674542.jpg\"' data-cke-saved-src="\" left;\"="" 5px;=""

Mooie puinhoop dus :X

[ Voor 42% gewijzigd door RobIII op 28-09-2011 19:06 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Fusioxan
  • Registratie: November 2009
  • Laatst online: 12-09 13:25
Sowieso, uitkijken met CKeditor. Het ziet er 'veilig' uit. Maar als je eenmaal javascript uitzet op je website, kunnen ze lekker gaan injecteren. ;) Dus, escape alles nog eens, kan nooit kwaad.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Fusioxan schreef op woensdag 28 september 2011 @ 19:14:
Sowieso, uitkijken met CKeditor. Het ziet er 'veilig' uit. Maar als je eenmaal javascript uitzet op je website, kunnen ze lekker gaan injecteren. ;)
Bull; dat heeft geen zak met CKeditor (of eender welke andere WYSIWYG editor) te maken maar met 't correct escapen op de juiste plaatsen (als dat al gewenst is; waarom geef je ze anders toegang tot een "gebruiksvriendelijke" manier om HTML in te voeren?).
Dus, escape alles nog eens, kan nooit kwaad.
Ik denk dat je je nog eens even in de materie moet gaan inlezen want je praat echt onzin, sorry. Je moet enkel en alleen escapen daar waar nodig; en dat is nogal afhankelijk van de context (is het bedoeld om SQL strings te escapen, of CSV values te escapen of misschien wel PDF of RTF of misschien escape je wel een URL-value of, idd, zoals vaak, maar dus niet altijd, HTML). Maar uit je post haal ik iig dat jij zeer waarschijnlijk ook zo'n "silver bullet" escape functie gebruikt? :P

Los daarvan: Op 't moment dat je mensen de mogelijkheid geeft HTML te plaatsen op een website dan dien je verdomd op te passen met wat je wel/niet toestaat; maar doorgaans laat je dat ook enkel door 'beheerders' of 'redacteurs' of anderszins leden met wat privileges doen. Het is niet voor niets dat veel andere sites een vorm van BBCode, Markdown, Wiki markup of iets dergelijks gebruiken dat geen HTML is.

[ Voor 59% gewijzigd door RobIII op 28-09-2011 19:29 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Strunkie
  • Registratie: Februari 2008
  • Laatst online: 21-10-2024

Strunkie

> Post is rechts!

Topicstarter
robll, hartelijk dank het werkt nu!
Sorry voor de late reactie.

^ Post is hierboven!


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
kiwie2 schreef op woensdag 28 september 2011 @ 20:49:
robll, hartelijk dank het werkt nu!
Sorry voor de late reactie.
Wat was 't nou? Als je de oplossing even post hebben anderen in de toekomst wellicht ook nog iets aan je topic ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Fusioxan
  • Registratie: November 2009
  • Laatst online: 12-09 13:25
RobIII schreef op woensdag 28 september 2011 @ 19:15: Maar uit je post haal ik iig dat jij zeer waarschijnlijk ook zo'n "silver bullet" escape functie gebruikt? :P
Na wat op GOT te hebben gezocht, denk ik dat je met 'silver bullet' bedoeld dat ik alle databasevelden escape? Ik weet het, qua beveiligen moet ik nog heel wat leren. Maar ik escape alleen variabelen die een gebruiker kan wijzigen. Ik heb het over (my)SQL trouwens haha. Weet je misschien een mooi artikeltje over die 'silver bullet'-methode waar ik die vooral niet moet gebruiken?

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Fusioxan schreef op woensdag 28 september 2011 @ 21:23:
[...]

Na wat op GOT te hebben gezocht, denk ik dat je met 'silver bullet' bedoeld dat ik alle databasevelden escape?
Nee, daar bedoel ik zoiets mee. Functies die per definitie op alle input mysql_real_escape loslaten (of erger: mysql_real_escape + htmlentities + addslashes of weet ik het :P )
Fusioxan schreef op woensdag 28 september 2011 @ 21:23:
Ik weet het, qua beveiligen moet ik nog heel wat leren
Dan, en don't get me wrong, ik bdoel 't niet lullig, ga daar dan ook geen advies aan anderen over geven ;)
Fusioxan schreef op woensdag 28 september 2011 @ 21:23:
Maar ik escape alleen variabelen die een gebruiker kan wijzigen.
Ook dat durf ik te betwijfelen :P Het zal niet voor 't eerst zijn dat mensen er niet bij stil staan dat een $_COOKIE['somekey'] ook escaped (kan) moet(en) worden of zelfs een $_SERVER['somekey']. Dat heb ik niet 1, niet 10, niet 100 maar wel 10^6 keer gezien ;) En dan heb ik 't nog niet eens over data uit andere bronnen (3rd parties) etc.
Fusioxan schreef op woensdag 28 september 2011 @ 21:23:
Ik heb het over (my)SQL trouwens haha.
Ik heb 't over (My)SQL, RTF, HTML, CSV, URL's, Emails (Base64, quoted printable), JSon, Javascript, XML en ga zo maar door. Elk van deze (en vele andere) zaken heeft wel ergens met escaping/encoding te maken, de een gestandaardiseerd, de ander (bijv. CSV) niet.
Fusioxan schreef op woensdag 28 september 2011 @ 21:23:
Weet je misschien een mooi artikeltje over die 'silver bullet'-methode waar ik die vooral niet moet gebruiken?
Daar hoef je geen artikeltje over te lezen :P Als je een 'functie' hebt waar je een $_POST in flikkert en daarna aanneemt dat alles wat in $_POST zit "veilig" is of iets met een dergelijke strekking elders op 1 van de voorgenoemde zaken toepast dan moet je dat vooral niet doen ;) Zoals ik zei: escapen/encoden/... doe je afhankelijk van de context en dus context-aware.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$myvar = "Welcome to <b>Joe's diner</b>";

//MySQL:
$query = 'insert into `mytable` (content) values (' . mysql_real_escape_string($myvar) . ')';

//MySQL (parameterized query):
$query = 'insert into `mytable` (content) values (@:mycontent)';
$something->parameters['mycontent'] = $myvar;

//PostgreSQL:
$query = 'insert into `mytable` (content) values (' . pg_escape_string($myvar) . ')';

//JS:
var title = <? echo json_encode($myvar); ?>

//JS voor 'weergave':
<p>...blah blah... <? echo htmlentities(json_encode($myvar)); ?> ...blah blah...</p>

//HTML:
<p>You searched for: <i><? echo htmlentities($myvar); ?></i>

//HTML wanneer HTML is toegestaan:
<h1><? echo $myvar; ?></h1>

//Shell:
system('echo ' . escapeshellarg($myvar));
...
//etc. etc.


Het is niet heel moeilijk, je moet gewoon weten waar je mee bezig bent :P Als je het idee achter (bijv.) een SQL injection begrijpt (en dus niet gewoon domweg braaf escaped, maar echt snapt wat er gaande is) dan is het niet moeilijk dat door te trekken naar XSS en andere vormen.

Je snapt, als je naar bovenstaande ((deels)pseudo) code kijkt dat 't stom is op per definitie $myvar te html-escapen want voor 'tzelfde geld heb je de waarde verderop nog nodig in een andere context; dan moet je daar weer eerst gaan htmldecoden om 't vervolgens op een andere manier weer te escapen.

Escapen doe je eigenlijk alleen maar wanneer dat nodig is ('last moment'); daar waar je je bewust bent van de context waarin de waarde gebruikt wordt. Als je een naam in je DB wil opslaan dan gebruik je daarbij geheid een mysql_real_escape_string of iets dergelijks, maar bij 't opslaan gebruik je nog géén htmlspecialchars/htmlentities. Maar, RobIII, dat is toch handig? Dan vergeet ik straks als ik een echo ergens doe de htmlspecialchars/htmlentities te doen!! Ja, en wat nu als de naam niet gebruikt wordt in een HTML pagina maar, bijvoorbeeld, bij het afdrukken van een enveloppe? Wat zou de ontvanger er van vinden als de brief gericht is aan C&amp;A i.p.v. C&A? ;) De htmlspecialchars/htmlentities gebruik je dan weer wél wanneer je een webpagina gebruikt waar de gebruikersnaam wordt weergegeven:
<?php echo 'Welkom terug, ' . htmlentities($name) . '!!'; ?>

[ Voor 30% gewijzigd door RobIII op 28-09-2011 22:25 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Fusioxan
  • Registratie: November 2009
  • Laatst online: 12-09 13:25
Hmm, dan doe ik het globaal wel goed. User-inputs worden geescaped in de query zelf (parametr-querys binnenkort eens in verdiepen), maar ik weet wel met welke functie ik iets moet escapen. Laatst ook, bleek het zoekformulier niet beveiligd te zijn. Nu wordt bij het zoekformulier de database geescaped en bij de html-weergave htmlentities.

Het nadeel van CKeditor was dat ik met gemak javascript code kon gebruiken, daarom gebruik ik liever BBC, maar klanten hebben liever een WYSIWYG-editor. =(
Pagina: 1