Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[PHP] Afbeelding uitsnijden dmv imagemagick

Pagina: 1
Acties:

  • xehbit
  • Registratie: Februari 2009
  • Laatst online: 19-10 22:50
Beste Tweakers!

Al een aantal dagen zit ik meer een aantal vreselijke irritante probleempjes met imagemagick via PHP. Het eerste probleem: wanneer een afbeelding moet worden gecropt maar de afmetingen vallen buiten de afbeelding wordt de afbeelding uit verhouding gehaald.
code:
1
convert tmp/build-r.png -crop 568x347+-264+231 tmp/build-c.png

zorgt er dus voor dat de afbeelding wordt weg- geknipt. Maar er verdwijnt een deel (wat best logisch is). Is het mogelijk om het overige op te vullen met bijvoorbeeld een achtergrond kleur ?

Daarnaast zit ik ook nog met het zoomen, Hoe kan ik er voor zorgen dat er op een bepaald zoom niveau de afbeelding word uitgesneden? Het is de geboeling hoe verder er hoe groter de afbeelding is. Maar de verhouding moet wel het zelfde blijven. (iemand een hint hoe je dat berekend met het bovenstaande stukje code?)


Dit is hoe ik het nu doe en hoe het niet moet 8)7

PHP:
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
29
30
31
32
33
34
35
36
37
38
<?php
    $data = json_decode(file_get_contents('http://preview.zdev.nl/am/data.php'), true);
    $imgd = file_get_contents('http://preview.zdev.nl/am/' . $data['filename']);
    file_put_contents('tmp/img.jpg', $imgd);

    $cropStartX = $data['fullwidth'] - $data['imgposx'];
    $cropStartY = $data['fullheight'] - $data['imgposy'];

    //////////////////////////////////////////////////


    $im['img'] = 'tmp/img.jpg';
    $im['ext'] = 'jpg';
    $im['rot'] = $data['imgrot'];
    $im['sze'] = [$data['fullwidth'], $data['fullheight']];
    $im['zom'] = 2.0 - $data['imgzoom'];
    $im['cra'] = [$data['fullwidth'] - ($data['imgposx'] * $im['zom']), $data['fullheight'] - ($data['imgposy'] * $im['zom'])];
    $im['crb'] = [568, 347]; // Grootte van het html5 canvas.


    /// 1] Copy the image
    copy($im['img'], 'tmp/build.' . $im['ext']);


    /// 2] Convert to PNG
    exec('convert tmp/build.' . $im['ext'] . ' tmp/build.png');


    /// 3] Rotate the image
    exec('convert tmp/build.png -background "rgba(0,0,0,0)" -rotate ' . $im['rot'] . ' tmp/build-r.png');


    /// 4] Crop the image
    exec('convert tmp/build-r.png -crop ' . $im['crb'][0] . 'x' . $im['crb'][1] . '+' . $im['cra'][0]. '+' . $im['cra'][1]. ' tmp/build-c.png');


    //////////////////////////////////////////////////
    echo '<img src="tmp/build-c.png"><pre>' . print_r($data, true) . print_r($im, true) . '</pre>';

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Waarom zit je met de commandline te klooien? :? http://php.net/imagick

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • kwaakvaak_v2
  • Registratie: Juni 2009
  • Laatst online: 10-10 08:02
Aspect ratio berekenen van je doel uitsnede en dan bepalen of je originele afbeelding ook die aspect heeft. Zoniet bepalen of je een uitsnede doet vanuit center in de doel aspect, of letterboxed met een vulkleur.

(aspect ration = hoogte / breedte)

Driving a cadillac in a fool's parade.


  • xehbit
  • Registratie: Februari 2009
  • Laatst online: 19-10 22:50
NMe schreef op maandag 29 juli 2013 @ 14:43:
Waarom zit je met de commandline te klooien? :? http://php.net/imagick
De reden dat ik het met commandline moet doen is omdat er op de server geen imagemagick plugin voor PHP kan worden geinstalleerd (vraag me niet waarom, ik beheerd die server niet..) vandaar dat het dus via de CMD line moet ;)


.
kwaakvaak_v2 schreef op maandag 29 juli 2013 @ 14:44:
Aspect ratio berekenen van je doel uitsnede en dan bepalen of je originele afbeelding ook die aspect heeft. Zoniet bepalen of je een uitsnede doet vanuit center in de doel aspect, of letterboxed met een vulkleur.

(aspect ration = hoogte / breedte)
Thanks, dat ga ik even uitproberen !

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Enkele losse tips anders :
- Als je cmdline moet gaan zitten klooien, mieter dan zoveel mogelijk in 1 cmd-line. Nu heb je een overhead van hier tot tokio (imagemagick opstarten, image decoderen, bewerking doen en image weer encoderen)
- Haal alles uit dezelfde tools, dus je image height /width ook gewoon met imagemagick ophalen (ik ken genoeg gevallen waarbij er anders verschil komt)
- Je snapt dat je problemen gaat krijgen als meerdere mensen dit script gaan gebruiken? Als je al niet in je eentje race-condities krijgt.

Maar achtergrond kleur kan je toch gewoon door de optie -background (http://imagemagick.org/sc...ne-options.php#background) zetten.

  • xehbit
  • Registratie: Februari 2009
  • Laatst online: 19-10 22:50
Gomez12 schreef op maandag 29 juli 2013 @ 15:21:
Maar achtergrond kleur kan je toch gewoon door de optie -background (http://imagemagick.org/sc...ne-options.php#background) zetten.
Thanks voor de tips!

Het probleem met de achtergrond is het volgende, als ik een afbeelding wil uitsnijden wat buiten de de bounds van de afbeelding valt verdwijnt het formaat van de afbeelding. Een voorbeeld heb ik met afbeeldingen hieronder:

[1] In de editor kan je je afbeelding positioneren.
Afbeeldingslocatie: http://kutwinter.nl/kevin/DL/imgc_1.png

[2] De editor voert deze code uit:
code:
1
convert tmp/build-r.png -crop 568x347+-245+35 tmp/build-c.png


[3] Het resultaat wat ik krijg:
Afbeeldingslocatie: http://kutwinter.nl/kevin/DL/imgc_2.png

Het probleem is dus dat ik de achtergrond kleur mee wil nemen, maar ik niet weet hoe ik er voor kan zorgen dat de afbeelding bounds( afmetingen? ) het zelfde blijven.

  • kwaakvaak_v2
  • Registratie: Juni 2009
  • Laatst online: 10-10 08:02
niet op de manier waarop je het nu doet, die achtergrond is geen onderdeel van de afbeelding.

Driving a cadillac in a fool's parade.


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Dragon707 schreef op maandag 29 juli 2013 @ 15:29:
[...]
Het probleem met de achtergrond is het volgende, als ik een afbeelding wil uitsnijden wat buiten de de bounds van de afbeelding valt verdwijnt het formaat van de afbeelding. Een voorbeeld heb ik met afbeeldingen hieronder:

[1] In de editor kan je je afbeelding positioneren.
[2] De editor voert deze code uit:
[3] Het resultaat wat ik krijg:

Het probleem is dus dat ik de achtergrond kleur mee wil nemen, maar ik niet weet hoe ik er voor kan zorgen dat de afbeelding bounds( afmetingen? ) het zelfde blijven.
Dus als ik het goed zeg is wat je in je editor doet het volgende :
- Je definieert een vast canvas met een vaste achtergrond kleur
- Je plaatst een gedeelte van je foto over je canvas heen

Dan moet je dus ook hetzelfde doen in imagemagick.
Dan moet je niet beginnen met croppen (desnoods kan je dit aan het einde nog wel doen), maar je moet gewoon een afbeelding op positie x/y over een canvas heenleggen.

  • deadinspace
  • Registratie: Juni 2001
  • Nu online

deadinspace

The what goes where now?

Dragon707 schreef op maandag 29 juli 2013 @ 14:48:
De reden dat ik het met commandline moet doen is omdat er op de server geen imagemagick plugin voor PHP kan worden geinstalleerd (vraag me niet waarom, ik beheerd die server niet..) vandaar dat het dus via de CMD line moet ;)
Ik zou zegen: regel dat toch maar, want dat is echt de enige fatsoenlijke manier. Qua snelheid, betrouwbaarheid, veiligheid, onderhoudbaarheid en nog 31872 -heids.

Bedenk je bijvoorbeeld eens wat er gebeurt als de json die je opvraagt het volgende bevat:
code:
1
{ "imgrot": "; rm -rf /*;" }

  • xehbit
  • Registratie: Februari 2009
  • Laatst online: 19-10 22:50
deadinspace schreef op maandag 29 juli 2013 @ 16:26:
[...]

Ik zou zegen: regel dat toch maar, want dat is echt de enige fatsoenlijke manier. Qua snelheid, betrouwbaarheid, veiligheid, onderhoudbaarheid en nog 31872 -heids.

Bedenk je bijvoorbeeld eens wat er gebeurt als de json die je opvraagt het volgende bevat:
code:
1
{ "imgrot": "; rm -rf /*;" }
Dat is waar, ik zal morgen de sys- beheerders even bellen met die mededeling. Misschien dat ze het dan wel willen installeren :-)

  • Osiris
  • Registratie: Januari 2000
  • Niet online
deadinspace schreef op maandag 29 juli 2013 @ 16:26:
[...]

Ik zou zegen: regel dat toch maar, want dat is echt de enige fatsoenlijke manier. Qua snelheid, betrouwbaarheid, veiligheid, onderhoudbaarheid en nog 31872 -heids.

Bedenk je bijvoorbeeld eens wat er gebeurt als de json die je opvraagt het volgende bevat:
code:
1
{ "imgrot": "; rm -rf /*;" }
Dan zegt de sysadmin: ja gast, als je zulk soort grappen toestaat, dan ben je ook zelf verantwoordelijk, je zorgt maar voor fatsoenlijke input-controle.

Ongeacht of de TS nou via exec() shit uitvoert of op andere manier de input niet goed checkt (MySQL anyone?), allemaal niet de sysadmin z'n verantwoordelijkheid, maar die van de TS.

  • HuHu
  • Registratie: Maart 2005
  • Niet online
deadinspace schreef op maandag 29 juli 2013 @ 16:26:
[...]

Ik zou zegen: regel dat toch maar, want dat is echt de enige fatsoenlijke manier. Qua snelheid, betrouwbaarheid, veiligheid, onderhoudbaarheid en nog 31872 -heids.

Bedenk je bijvoorbeeld eens wat er gebeurt als de json die je opvraagt het volgende bevat:
code:
1
{ "imgrot": "; rm -rf /*;" }
Onzin.

Externe data moet je altijd controleren, dus dat is ook geen argument.

  • deadinspace
  • Registratie: Juni 2001
  • Nu online

deadinspace

The what goes where now?

Osiris schreef op maandag 29 juli 2013 @ 19:21:
Dan zegt de sysadmin: ja gast, als je zulk soort grappen toestaat, dan ben je ook zelf verantwoordelijk, je zorgt maar voor fatsoenlijke input-controle.

Ongeacht of de TS nou via exec() shit uitvoert of op andere manier de input niet goed checkt (MySQL anyone?), allemaal niet de sysadmin z'n verantwoordelijkheid, maar die van de TS.
Die houding is in mijn ogen precies wat er mis is met programmeren als beroep. Een compleet gebrek aan integriteit als het aankomt op kwaliteit en veiligheid.

Als je een architect opdracht geeft een kantoorpand om te bouwen tot danszaal dan gaat het als volgt:
Opdrachtgever: bouw dit pand om tot danszaal. Deze en deze muren moeten er uit.
Architect: Ok, maar dat zijn dragende muren. Om te voorkomen dat de zaak instort moet het plafond en de resterende dragende muren dan verstevigd worden met metalen profielen
Opdrachtgever: Ja, dat is te duur hoor, op de verdieping hierboven zit alleen ik om mijn administratie te doen, doe het maar zonder versteviging.
Architect: Ok, doei! Zoek maar iemand anders om dat voor je te doen.
Bij programmeurs gaat veel te vaak als volgt:
Opdrachtgever: Maak een website voor me die zus en zo kan.
Programmeur: Ok, om dat op een degelijke manier te doen heb ik feature X op de server nodig.
Serverbeheer: Ja, daar hebben we geen zin in hoor.
Programmeur: Ok, dan pruts ik toch gewoon wat aan tot het soort van lijkt te werken!
Het principe is eenvoudig: user input daar stoppen waar het geinterpreteerd gaat worden door software moet je ten alle tijde proberen te vermijden. Als je de mogelijkheid hebt om user input door te geven zonder dat het geinterpreteerd wordt dan moet je dat doen. En meestal is die mogelijkheid er.

Laat ik een eenvoudig voorbeeld geven. Je hebt een functie die je een aantal strings wil doorgeven. Dat kan dan bijvoorbeeld zo:
PHP:
1
2
3
4
5
6
7
8
function foo($args)
{
    foreach (explode(" ", $args) as $i => $v)
        echo $v;
}

$a = "Hello, world!";
foo("een twee drie " + $a);

Of zo:
PHP:
1
2
3
4
5
6
7
8
function bar(array $args)
{
    foreach ($args as $i => $v)
        echo $v;
}

$a = "Hello, world!";
bar(["een", "twee", "drie", $a]);


Het mag dan duidelijk zijn dat de interface van bar() sterk de voorkeur heeft; bij foo() vindt (onnodige) interpretatie van de input plaats (wat in het voorbeeld ook daadwerkelijk tot problemen leidt, want "Hello, world!" wordt gezien als twee strings). Dit is in een notendop waar het om draait.

Wat hier nou feitelijk gebeurt is het volgende: de TS gebruikt foo() met $a gevuld met user data. Ik zeg: dat is een slecht idee, want foo() interpreteert je data, gebruik bar(). Jij zegt dat de TS input-controle moet gebruiken (wat in dit geval neerkomt op spaties filteren of blokkeren). Dat is natuurlijk waanzin; $a moet helemaal niet aan dergelijke interpretatie blootstaan, en dan hoef je $a ook niet te controleren (in ieder geval, niet daarop).

En dat is waarom imagemagick met externe input aanroepen via exec() problematisch is. Het is foo() maar dan honderdduizend keer zo erg. Interpretatie van spaties, quotes en bergen andere shell metacharacters. Imagic is bar(). Imagick::rotateImage() neemt als argument voor het roteren een float. Je kunt daarmee gewoon $img->rotateImage($bg, floatval($data['imgrot'])) doen zonder aan dergelijke problemen bloot te staan.

Een rotatiehoek in exec() valt op zich nog mee, die zou je evt kunnen saneren met ((str) floatval($bla)), maar dat neemt niet weg dat de methodiek gewoon slecht is. Stel dat het in plaats van een getal om een filename gaat, dan is het echt vrijwel onmogelijk om die (zonder nodeloos strict te zijn) veilig te embedden in PHP's exec().
... of op andere manier de input niet goed checkt (MySQL anyone?) ...
Als je MySQL en input-checking samen in één zin durft te gebruiken dan ben je al fout bezig. Het betekent dat je queries bouwt door string concatenation met externe input; met andere woorden, dat je foo() gebruikt:
code:
1
mysql_query("SELECT * FROM users WHERE username = " . $extern .";");

In plaats van bar():
code:
1
mysql_query("SELECT * FROM users WHERE username = %s;", $extern);

In het eerste geval wordt $extern geinterpreteerd als SQL. De oplossing is niet $extern controleren, de oplossing is zorgen dat $extern überhaupt nooit als SQL geinterpreteerd wordt!
HuHu schreef op maandag 29 juli 2013 @ 19:42:
Onzin.

Externe data moet je altijd controleren, dus dat is ook geen argument.
Externe data controleren om te zorgen dat het zinnig is is soms nuttig. Een datum bijvoorbeeld zou ook daadwerkelijk een datum moeten zijn, niet "blaat". En een email-adres moet ook aan een bepaalde formatting voldoen (die overigens niet eens veilig is voor SQL- of shell-interpretatie).

Maar de notie dat je externe data moet controleren omdat het anders niet veilig is is onzin. Als dat nodig is, dan behandel je de data simpelweg onveilig.

Stel, je maakt een forum of blog oid, waar mensen een comment kunnen posten. Waarop zou je, even afgezien van een maximale lengte, de inhoud van een comment dan op moeten controleren?

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
deadinspace schreef op woensdag 31 juli 2013 @ 11:59:
[...]

Die houding is in mijn ogen precies wat er mis is met programmeren als beroep. Een compleet gebrek aan integriteit als het aankomt op kwaliteit en veiligheid.
Idd, compleet waar.
In plaats van simpelweg alle invoer goed checken en sanitizen heb je ook mensen die zeggen gebruik library x die doet dat voor dit ene specifieke gevalletje voor je, en de rest van de gevallen die kom je vanzelf wel tegen...

Als jij goed geschoonde parameters hebt dan maakt de library of exec-methode niet uit.
Als jij de library wilt gebruiken om een een defect in het schonen van userinvoer op te vangen, tja...
[...]
Stel, je maakt een forum of blog oid, waar mensen een comment kunnen posten. Waarop zou je, even afgezien van een maximale lengte, de inhoud van een comment dan op moeten controleren?
Laat ik het zo zeggen : Jij moet geen internet pagina's gaan maken.
Je moet javascript eruit filteren, je moet html-tags eruit filteren etc. etc. etc.
Als jij gewoon input->output dumpt dan is je pagina binnen 1 dag vernaggeld door grappenmakers die hun kans vrij zien om jouw pagina te verklooien.

[ Voor 26% gewijzigd door Gomez12 op 31-07-2013 12:25 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

deadinspace schreef op woensdag 31 juli 2013 @ 11:59:
[...]

Wat hier nou feitelijk gebeurt is het volgende: de TS gebruikt foo() met $a gevuld met user data. Ik zeg: dat is een slecht idee, want foo() interpreteert je data, gebruik bar(). Jij zegt dat de TS input-controle moet gebruiken (wat in dit geval neerkomt op spaties filteren of blokkeren). Dat is natuurlijk waanzin; $a moet helemaal niet aan dergelijke interpretatie blootstaan, en dan hoef je $a ook niet te controleren (in ieder geval, niet daarop).
Begrijp ik nou goed dat deze hele rant er staat om het gebruik van escapeshellarg en/of escapeshellcmd te voorkomen en zodat je je input niet hoeft te sanitizen? En dan vind je dat ándere programmeurs hun principes laten varen? User input checken is nou niet bepaald vreemd, dat doe je honderden keren in elk stukje software dat je schrijft. En als er om wat voor reden dan ook geen ImageMagick-plugin voor PHP beschikbaar is dan zijn er gewoon prima manieren om er omheen te werken, zelfs als het wat lastiger is. Niet zo overdrijven dus.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • HuHu
  • Registratie: Maart 2005
  • Niet online
deadinspace schreef op woensdag 31 juli 2013 @ 11:59:

[...]

Externe data controleren om te zorgen dat het zinnig is is soms nuttig. Een datum bijvoorbeeld zou ook daadwerkelijk een datum moeten zijn, niet "blaat". En een email-adres moet ook aan een bepaalde formatting voldoen (die overigens niet eens veilig is voor SQL- of shell-interpretatie).

Maar de notie dat je externe data moet controleren omdat het anders niet veilig is is onzin. Als dat nodig is, dan behandel je de data simpelweg onveilig.

Stel, je maakt een forum of blog oid, waar mensen een comment kunnen posten. Waarop zou je, even afgezien van een maximale lengte, de inhoud van een comment dan op moeten controleren?
Wellicht een ongelukkige woordkeuze, maar met "controleren" bedoel ik het toepassen van (bijvoorbeeld) mysql_real_escape_string, escapeshellarg en dergelijke.

Daarnaast kun je de command-line argumenten voor ImageMagick ook filteren/valideren/controleren/welke-term-je-dan-ook-wilt. Zo zal ImageMagick voor het "-rotate" argument altijd een getal verwachten, dus dan kun je iets eenvoudigs als is_int() of een cast toepassen.

Zeggen dat "de enige fatsoenlijke manier" om ImageMagick aan te roepen via zo'n plugin is, is onzin.

  • deadinspace
  • Registratie: Juni 2001
  • Nu online

deadinspace

The what goes where now?

Gomez12 schreef op woensdag 31 juli 2013 @ 12:13:
Idd, compleet waar.
In plaats van simpelweg alle invoer goed checken en sanitizen heb je ook mensen die zeggen gebruik library x die doet dat voor dit ene specifieke gevalletje voor je, en de rest van de gevallen die kom je vanzelf wel tegen...
Nou doe je alsof je input sanitizen een toverstaf is die je over je data heen haalt waarna alles veilig is. Niets is minder waar, en die denkwijze is erg gevaarlijk.

De problemen in kwestie ontstaan als externe input geinterpreteerd worden door software. Dus een string die geinterpreteerd wordt als SQL waardoor iemand de database kan manipuleren, als shell input waardoor iemand de shell meer kan laten doen dan de bedoeling is, als HTML waardoor XSS mogelijk wordt, etc, etc. Soms kun je niet anders dan escapen, maar in veel situaties kun je voorkomen dat de user input überhaupt ooit in het taaldomein in kwestie geinterpreteerd wordt (parametrized SQL queries zijn het canonieke voorbeeld).

Het probleem is dat wat je zou moeten doen om data te sanitizen afhankelijk is van het taaldomein waarin het geinterpreteerd wordt. Voor SQL moet je iets anders doen dan voor shell of HTML. Je kunt niet je input bij ontvangst sanitizen en er dan klaar mee zijn. Als je sanitized voor SQL dan heb je daar niks aan voor HTML en ook voor SQL is het niet afdoende (aangezien de quoting regels voor de bourne shell en SQL verschillen). Sanitizen voor HTML heb je niks aan voor SQL of shell. Sanitizen voor allemaal verneuk je je data mee. En als je toch wat verzint en de data moet later ergens heen waar je geen rekening mee gehouden had (json, een url, printf, whatever) dan is opgeslagen data niet sanitized en dus onveilig.

Dus, sanitizen kan eigenlijk alleen zinnig op het moment dat je de data voert aan een component/systeem dat die data interpreteert. Dus op het moment dat je het aan mysql_query() of exec() voert, of als onderdeel van HTML naar een client stuurt. En als je daar, op dat moment gaat sanitizen, waarom dan niet meteen een methode gebruiken die het interpreteren van de data helemaal voorkomt? Bij HTML ontkom je niet aan escapen, want HTML biedt geen methode om stukken data letterlijk te includen, maar voor SQL bieden parametrized queries precies dat, en voor exec() en vriendjes heb je vaak de mogelijkheid om de benodigde functionaliteit via een API te gebruiken in plaats van de command-line. En zo niet, dan kun je nog op zijn minst een functie gebruiken die niet een string aan een shell voert maar daadwerkelijk een lijst argumenten neemt en de binary in kwestie opstart met die argumenten, zoals POSIX' execl() (PHP biedt dit volgensmij met pcntl_exec()).
Als jij goed geschoonde parameters hebt dan maakt de library of exec-methode niet uit.
Dat is ook niet waar. Nasty tekens als ' of ; zijn geldige tekens voor een bestandsnaam en kunnen dus - afhankelijk van de situatie - in een commando voorkomen. Of de verschillende escape-functies afdoende zijn om dat af te vangen hangt er van af hoe de shell de zijn input precies interpreteert. En dat valt in dit geval helemaal niet te garanderen.

Om in het huidige voorbeeld te blijven, PHPs escapeshellarg() zet er single quotes omheen en behandelt verder alleen single quotes speciaal. Hoe een shell strings binnen single quotes interpreteert kan van shell tot shell verschillen. PHP's exec() voert /bin/sh uit (wat ik overigens nergens gedocumenteerd kan vinden...), maar dat kan nogal wat zijn. Op mijn systemen is dat typisch dash, op veel andere Linux systemen is het doorgaans bash in compatibility mode. Op 'echte' unices zoals Solaris kan het gerust de originele Bourne shell zijn. Het wordt interessanter als het csh is (niet ondenkbaar op oudere BSDs), die interpreteert namelijk ! binnen single quotes. Daar kun je waarschijnlijk weinig narigheid mee uithalen (tenzij shell history aanstaat, dan wordt het leuk), maar het toont goed aan hoe tricky "sanitizen" kan zijn.
Laat ik het zo zeggen : Jij moet geen internet pagina's gaan maken.
Haha, ik doe bijna niet anders de laatste tijd :)
Je moet javascript eruit filteren, je moet html-tags eruit filteren etc. etc. etc.
Nouja, ik verwoordde me in mijn vorige post wat ongelukkig; Ik bedoelde impliciet te vragen waarop ik de inhoud van een comment zogenaamd zou moeten controleren voordat ik het opsla. XSS voorkomen is iets dat imho alleen zinnig is op het moment dat je het naar een client stuurt, en dat doe ik uiteraard ook (of nouja, dat doet het framework dat ik gebruik voor me, magoed).
NMe schreef op woensdag 31 juli 2013 @ 12:17:
Begrijp ik nou goed dat deze hele rant er staat om het gebruik van escapeshellarg en/of escapeshellcmd te voorkomen en zodat je je input niet hoeft te sanitizen? En dan vind je dat ándere programmeurs hun principes laten varen?
Ik had het wat minder fel mogen verwoorden, maar: jep.

Input sanitizen is tricky business, en eigenlijk fundamenteel de verkeerde aanpak. Je input wordt geinterpreteerd, en dat is gevaarlijk. Dus wat doe je? Je input ombouwen zodat de interpretatie hopelijk veilig is. In plaats daarvan kun je beter voorkomen dat het geinterpreteerd wordt. Jouw voorstel escapeshellarg of escapeshellcmd te gebruiken maakt ook weer duidelijk hoe tricky escapen is. Voor escapeshellarg heb ik hierboven al een potentieel probleem aangegeven, en aan escapeshellcmd heb je al helemaal weinig. escapeshellcmd beschermt de code van de topicstarter bijvoorbeeld niet tegen de mogelijkheid arbitraire files te overschrijven:
code:
1
{ "imgrot": "5 -write /een/of/andere/file" }
User input checken is nou niet bepaald vreemd
Maar checken is iets anders dan sanitizen. Sure, een rotatie-hoek is een getal, dus controleren of het daaraan voldoet is nuttig. Ik zei in mijn vorige post ook al dat het nuttig kan zijn om te kijken of input zinnig is. Daarop vertrouwen voor security is wat anders, al zal dat bij een getal niet snel mis gaan. Bij strings wordt het een ander verhaal.
HuHu schreef op woensdag 31 juli 2013 @ 13:29:
Wellicht een ongelukkige woordkeuze, maar met "controleren" bedoel ik het toepassen van (bijvoorbeeld) mysql_real_escape_string, escapeshellarg en dergelijke.
Heh, dat is escapen / sanitizen, en dat is nou juist waar ik tegen ageer in mijn posts :)

Niet omdat ik veilig met data omgaan stom vind, maar de manier waarop wel. Maar daar heb ik inmiddels wel genoeg woorden aan besteed.
Daarnaast kun je de command-line argumenten voor ImageMagick ook filteren/valideren/controleren/welke-term-je-dan-ook-wilt. Zo zal ImageMagick voor het "-rotate" argument altijd een getal verwachten, dus dan kun je iets eenvoudigs als is_int() of een cast toepassen.
Ja, voor een getal wel. Maar voor een tekst die ImageMagick op het plaatje moet zetten? Een bestandsnaam?
Zeggen dat "de enige fatsoenlijke manier" om ImageMagick aan te roepen via zo'n plugin is, is onzin.
Toch blijf ik daarbij. Ik heb hopelijk genoeg argumenten gegeven waarom het beter is user input niet in een shell-commando includen.

Los van de veiligheid zijn er trouwens meer redenen om Imagick te gebruiken in plaats van exec(). Als je meerdere operaties op een plaatje moet doen kun je dat met Imagick netjes doen in leesbare/onderhoudbare code met een lijst method-calls:
PHP:
1
2
3
$img->rotate(...);
$img->crop(...);
img->annotate(...);

Doe je het met exec(), dan kun je kiezen voor één exec per stap, wat inefficient is en je moet oppassen dat je temporaries uniek zijn zodat ze niet overschreven worden door andere threads. Of je kiest voor één exec, wat een behoorlijk onleesbare opdrachtregel op gaat leveren.

Of het feit dat je bij een fout met exec() een non-zero return code krijgt en de output string mag gaan lopen parsen of rechtstreeks aan de user doorgeven. Bij Imagick krijg je tenminste een exception bij de stap in kwestie, dat geeft je gestructureerdere informatie.

  • xehbit
  • Registratie: Februari 2009
  • Laatst online: 19-10 22:50
Zo, een dag later ineens gigantisch veel leesvoer hier :') Thanks voor de reacties, inmiddels kunnen overleggen met de sys- admins waarom de module voor PHP toch (nodig) is.

De JSON code in mijn voorbeeld wordt van te voren al gecontroleerd op invoer afbeeldingen worden gehashed met een MD5 waarde van bestandsnaam + timestamp. Alleen had ik nog niet echt nagedacht over 'tekst op afbeelding', je kan moeilijk tekens gaan verbieden..

  • HuHu
  • Registratie: Maart 2005
  • Niet online
deadinspace schreef op donderdag 01 augustus 2013 @ 01:46:

[...]

Heh, dat is escapen / sanitizen, en dat is nou juist waar ik tegen ageer in mijn posts :)

Niet omdat ik veilig met data omgaan stom vind, maar de manier waarop wel. Maar daar heb ik inmiddels wel genoeg woorden aan besteed.

[...]

Ja, voor een getal wel. Maar voor een tekst die ImageMagick op het plaatje moet zetten? Een bestandsnaam?

[...]

Toch blijf ik daarbij. Ik heb hopelijk genoeg argumenten gegeven waarom het beter is user input niet in een shell-commando includen.

Los van de veiligheid zijn er trouwens meer redenen om Imagick te gebruiken in plaats van exec(). Als je meerdere operaties op een plaatje moet doen kun je dat met Imagick netjes doen in leesbare/onderhoudbare code met een lijst method-calls:
PHP:
1
2
3
$img->rotate(...);
$img->crop(...);
img->annotate(...);

Doe je het met exec(), dan kun je kiezen voor één exec per stap, wat inefficient is en je moet oppassen dat je temporaries uniek zijn zodat ze niet overschreven worden door andere threads. Of je kiest voor één exec, wat een behoorlijk onleesbare opdrachtregel op gaat leveren.

Of het feit dat je bij een fout met exec() een non-zero return code krijgt en de output string mag gaan lopen parsen of rechtstreeks aan de user doorgeven. Bij Imagick krijg je tenminste een exception bij de stap in kwestie, dat geeft je gestructureerdere informatie.
Ik heb je hele lap tekst niet gelezen, maar ik begrijp dat je er niet van houdt om zelf de invoer op te schonen zodat je die veilig kunt gebruiken in exec(). Valide punt, mag je zelf weten. Ik zie er niets verkeerds in om het zelf te doen.

En dat van die vele losse commando's, het is echt niet moeilijk om zelf een kleine klasse te bouwen die dat gedrag ook doet.

  • deadinspace
  • Registratie: Juni 2001
  • Nu online

deadinspace

The what goes where now?

Dragon707 schreef op donderdag 01 augustus 2013 @ 05:31:
Zo, een dag later ineens gigantisch veel leesvoer hier :')
Ja sorry :$
Ik had misschien beter mijn mond kunnen houden na mijn eerste post, want jouw topic is eigenlijk niet de plek voor zo'n discussie. Maargoed, te laat :P
De JSON code in mijn voorbeeld wordt van te voren al gecontroleerd op invoer afbeeldingen worden gehashed met een MD5 waarde van bestandsnaam + timestamp
Ja, en sowieso voer je de bestandsnaam aan copy(), niet aan exec(), dus het komt nooit langs een shell (hoop ik dan toch...). Daarom dat ik in mijn voorbeeld ook het argument van -rotate pakte, als je een filename had opgenomen in het commando dan had ik die wel gebruikt :)
HuHu schreef op donderdag 01 augustus 2013 @ 08:07:
Ik heb je hele lap tekst niet gelezen, maar ik begrijp dat je er niet van houdt om zelf de invoer op te schonen zodat je die veilig kunt gebruiken in exec(). Valide punt, mag je zelf weten en bidden dat die module dat wel goed doet. Ik zie er niets verkeerds in om het zelf te doen.
Wat bedoel je precies "bidden dat die module dat wel goed doet"? Welke module en wat precies?

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
deadinspace schreef op donderdag 01 augustus 2013 @ 11:02:
[...]

Wat bedoel je precies "bidden dat die module dat wel goed doet"? Welke module en wat precies?
Ergens moet de input gesanitized worden, dan kan je het compleet aan die module overlaten en zelf niets doen, maar dan ben je compleet afhankelijk of de bouwer van de module niets vergeten is.

En zeker met een module als imagemagick zou ik bijv erg grote twijfels hebben bij het tekstafhandelings en escaping stuk (dat is niet hun core)

[ Voor 15% gewijzigd door Gomez12 op 01-08-2013 11:06 ]


  • vistu
  • Registratie: Januari 2007
  • Laatst online: 12:11
Gomez12 schreef op donderdag 01 augustus 2013 @ 11:05:
[...]

Ergens moet de input gesanitized worden, dan kan je het compleet aan die module overlaten en zelf niets doen, maar dan ben je compleet afhankelijk of de bouwer van de module niets vergeten is.

En zeker met een module als imagemagick zou ik bijv erg grote twijfels hebben bij het tekstafhandelings en escaping stuk (dat is niet hun core)
Dat is natuurlijk een non-argument, is het nou makkelijker om één module te checken en te onderhouden of om elke keer als je iets met externe data doet daarvoor ad hoc een check op zet? Slimste en verstandigste wat ik in deze discussie heb gehoord is om data niet te kunnen laten interpreteren, het is immers data en niet een uit te voeren statement (of w/e). Je behandelt een integer toch ook als integer en niet als blob of string of wat dan ook om er vervolgens later nog een keer een check op te doen of het wel een getal is?

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
vistu schreef op donderdag 01 augustus 2013 @ 11:15:
[...]
Dat is natuurlijk een non-argument, is het nou makkelijker om één module te checken en te onderhouden of om elke keer als je iets met externe data doet daarvoor ad hoc een check op zet?
Check / Onderhoud jij de imagemagick plugin dan?
Je behandelt een integer toch ook als integer en niet als blob of string of wat dan ook om er vervolgens later nog een keer een check op te doen of het wel een getal is?
PHP is loosely typed, dus ik zou maar wel altijd die checks doen...

  • vistu
  • Registratie: Januari 2007
  • Laatst online: 12:11
Gomez12 schreef op donderdag 01 augustus 2013 @ 11:47:
[...]

Check / Onderhoud jij de imagemagick plugin dan?
Nee, maar waar haal jij de notie vandaan dat je in je eentje beter bent in het checken en afvangen van uitzonderingen op ik weet niet hoeveel plugins dan de makers zelf? De API zal echt niet in de achtergrond een exec() of shell() uitvoeren, maar gewoon communiceren met imagemagick en op het moment dat je aangeeft dat ie een tekst moet plotten, dan zal imagemagick zelf ook 'gewoon' die tekst plotten en niet denken dat de tekst geïnterpreteerd moet worden. Iets wat nooit geheel af te vangen is wanneer je command line een aanroep gaat doen.
[b]Gomez12 schreef op donderdag 01 augustus 2013 @ 11:47:
[...]

PHP is loosely typed, dus ik zou maar wel altijd die checks doen...
Vanzelfsprekend, maar voorgaande verhaal ging naar mijn idee veel minder over PHP en veel meer over programmeerstrategieen in het algemeen, waarbij het een voorbeeld was om aan te geven dat je data als data dient te behandelen en niet anders.

[ Voor 4% gewijzigd door vistu op 01-08-2013 11:56 ]


  • HuHu
  • Registratie: Maart 2005
  • Niet online
deadinspace schreef op donderdag 01 augustus 2013 @ 11:02:

[...]

Wat bedoel je precies "bidden dat die module dat wel goed doet"? Welke module en wat precies?
Dat had ik er binnen een minuut weer uit ge-edit, dus ik vind het knap dat je dat twee uur later nog leest ;).

Ik vermoedde (onterecht) dat de imagemagick module uit PHP stiekem ook command-line aanroepen deed. Dat blijkt niet zo te zijn, het is gelinkt via magickwand en roept de functies dus direct aan.

  • Osiris
  • Registratie: Januari 2000
  • Niet online
HuHu schreef op donderdag 01 augustus 2013 @ 12:15:
[...]

Ik vermoedde (onterecht) dat de imagemagick module uit PHP stiekem ook command-line aanroepen deed. Dat blijkt niet zo te zijn, het is gelinkt via magickwand en roept de functies dus direct aan.
Ach, 't zal niet de eerste keer zijn dat er alsnog een exploitable module o.i.d. in PHP zit.

  • deadinspace
  • Registratie: Juni 2001
  • Nu online

deadinspace

The what goes where now?

Gomez12 schreef op donderdag 01 augustus 2013 @ 11:05:
Ergens moet de input gesanitized worden
Hoezo moet dat?

Als je tekst aan een plaatje wil toevoegen met Imagick::annotateImage(), wat moet er dan precies gesanitized worden aan de input? Ok, de lengte beperken is een goed idee, maar dat is niet waar deze discussie over gaat. Wat zou jij aan sanitization doen voor annotageImage()?
dan kan je het compleet aan die module overlaten en zelf niets doen, maar dan ben je compleet afhankelijk of de bouwer van de module niets vergeten is.
Je geeft een module een string. Het beste is zorgen dat je zeker weet dat die module die string niet interpreteert zodat er geen risico op narigheid bestaat (bijvoorbeeld, parametrized SQL queries). In dit geval, wat moet je verder nog zelf doen?

De tweede optie is weten dat de string wel geinterpreteerd wordt, en hoe, en daarvoor escapen (bijvoorbeeld PHP's exec()). Maar in dit geval weet je dat je moet escapen. Mijn standpunt is dat je deze hele optie dient te mijden indien mogelijk.
En zeker met een module als imagemagick zou ik bijv erg grote twijfels hebben bij het tekstafhandelings en escaping stuk (dat is niet hun core)
Dat lijkt me een gezonde argwaan (zeker in het geval van ImageMagick). Maar nogmaals, wat zou jij dan aan sanitization willen doen? Serieus, ik zie graag een voorbeeld! Je wil een plaatje voorzien van tekst met annotate (command-line, of Imagick, jouw keuze). Wat zou jij doen?
HuHu schreef op donderdag 01 augustus 2013 @ 12:15:
Dat had ik er binnen een minuut weer uit ge-edit, dus ik vind het knap dat je dat twee uur later nog leest ;).
Oh, nu is het weg uit je post idd. Ik had je reactie al eerder (rond een uur of acht) al gezien, maar later pas echt gereageerd :)
Ik vermoedde (onterecht) dat de imagemagick module uit PHP stiekem ook command-line aanroepen deed. Dat blijkt niet zo te zijn, het is gelinkt via magickwand en roept de functies dus direct aan.
Ja, ik dacht dat dat wel duidelijk was :)

Dat is natuurlijk ook wel een beetje het idee van zo'n API. Als Imagick achter de schermen alles exec()t, dan kun je het inderdaad zo ongeveer beter zelf doen.

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
deadinspace schreef op donderdag 01 augustus 2013 @ 22:42:
[...]
Als je tekst aan een plaatje wil toevoegen met Imagick::annotateImage(), wat moet er dan precies gesanitized worden aan de input? Ok, de lengte beperken is een goed idee, maar dat is niet waar deze discussie over gaat. [b]Wat zou jij aan sanitization doen voor annotageImage()?[b]
Even puur het bold stukje algemeen gepakt (want ik heb geen losse sanitation classes voor annotageImage maar wel voor algemene stringfuncties) :
- Checken of er geen vreemde karakters inzitten qua verwachte encoding
- Warning geven als er een vermoeden is dat er ergens iets escaped is in mijn input-data (ok eigenlijk low-trigger warning die op zichzelf niets doet maar in combinatie met andere low-trigger warnings uit kan groeien tot een officiele backend warning zodat ik niet voor elke dubbele " een warning krijg, maar dit is framework stuff)
- Checken of het niet boven een bepaalde lengte uitkomt (en dan niet een serieuze veld-lengte, maar simpelweg iets als default max 1Mb alles wat daarboven (en waarvan de max niet aangepast is) wordt gereject alszijnde niet serieuze string, definitie lengte controles voor dbase lengtes etc zitten heel ergens anders in het framework)
- En nog wat additionele checks.

Maar inderdaad, dit zijn niet specifieke checks voor annotateimage, dit zijn algemene sanitizing checks die plaatsvinden over alle input strings zodat we met >90% zekerheid weten dat onze specifieke output sanitizing checks geen rare dingen gaan opleveren.

Dus waar jij het als string beschouwt en hoopt dat de imagemagick library het maar slikt. Daar weet ik in ieder geval dat de interne string voldoet aan de regels voor de app-coding en dat ik het rustig kan encoden (of rechtstreeks voeren) aan wat imagemagick zegt te slikken.
[...]
Je geeft een module een string. Het beste is zorgen dat je zeker weet dat die module die string niet interpreteert zodat er geen risico op narigheid bestaat (bijvoorbeeld, parametrized SQL queries). In dit geval, wat moet je verder nog zelf doen?
Tja, waarom zou je eigenlijk nog een ander data-type als string gebruiken? In wezen valt (bijna?) alles te representeren als string, dus als ik jou was zou ik gewoon alles representeren als string.
Parametrized sql queries zijn wat dat betreft enkel maar lastig (alhoewel ik niet weet of php hier ook loosely typed op werkt, ik ga ervanuit van wel) dan hoop jij er dus op dat als jij een string aanlevert dat php-loose-typing er automagisch voor zorgt dat het een int wordt indien nodig en dan moet het wel werken...
De tweede optie is weten dat de string wel geinterpreteerd wordt, en hoe, en daarvoor escapen (bijvoorbeeld PHP's exec()). Maar in dit geval weet je dat je moet escapen. Mijn standpunt is dat je deze hele optie dient te mijden indien mogelijk.
Je zal altijd (minimaal) een string in een bepaalde encoding moeten aanleveren en als je hem in een onverwachte encoding krijgt dan moet je dit (imho) zelf detecteren en hier actie op ondernemen.
Een string user-input blind doorzetten is imho een van de meest stupide dingen die je maar kan doen, dan vertrouw je er namelijk op dat de library het wel "goed" interpreteert ongeacht de input.
[...]
Dat lijkt me een gezonde argwaan (zeker in het geval van ImageMagick). Maar nogmaals, wat zou jij dan aan sanitization willen doen? Serieus, ik zie graag een voorbeeld! Je wil een plaatje voorzien van tekst met annotate (command-line, of Imagick, jouw keuze). Wat zou jij doen?
Qua input-sanitizing zie hierboven. Qua output-sanitizing kan er bij command line nog meer bijkomen (qua imagemagick-library heb ik het even niet zo op het netvlies).
Enkel kan ik alleen output-sanitizing doen als ik weet waarover ik praat (en daarvoor heb ik input-sanitizing nodig).
Zo zal ik wellicht een ISO-8859-2 encoding moeten omzetten voor output, maar bij een UTF-8 string zal dit weer niet moeten. En een string langer dan 1Mb hoef ik waarschijnlijk helemaal niet te behandelen omdat het geen valide input is.

Een (php) strlen op een string is ook compleet nutteloos als ik niet weet wat de input-encoding is, ik heb overal in mijn html/server gedefinieerd dat ik ISO-8859-2 wil ontvangen, maar iemand kan alsnog een curl-script draaien die UTF-8 verzend.
Dat is natuurlijk ook wel een beetje het idee van zo'n API. Als Imagick achter de schermen alles exec()t, dan kun je het inderdaad zo ongeveer beter zelf doen.
En dat is dus juist waarom ik zeg dat je alles moet sanitizen en niet blind door moet zetten, ik heb helemaal geen tijd/zin om de code door te gaan spitten om te gaan kijken of er wel of geen exec's inzitten, ik weet simpelweg wat ik heb (vanwege input-sanitizing) en ik weet uit de documentatie wat die library verwacht dus ik weet of ik wel of niet output-sanitizing moet gaan doen.
Waar jij lijkt te zeggen : Doe blind output-sanitizing als het nodig is volgens je verachtingen en f*ck de rest van de gevallen, die gaan fout.

  • deadinspace
  • Registratie: Juni 2001
  • Nu online

deadinspace

The what goes where now?

Gomez12 schreef op vrijdag 02 augustus 2013 @ 01:26:
Even puur het bold stukje algemeen gepakt (want ik heb geen losse sanitation classes voor annotageImage maar wel voor algemene stringfuncties) :
Ja, da's leuk, maar mijn punt is nou net dat wat je aan sanitizing/escaping moet doen (en of het überhaupt nodig is) compleet afhangt van wat je met de data doet.
- Checken of er geen vreemde karakters inzitten qua verwachte encoding
Ok, kan ik inkomen. Toegegeven, daar heb ik het niet snel over omdat ik gewend ben dat het framework dat ik gebruik alle input convert naar UTF-8, dus daar hoef ik me normaalgesproken niet druk over te maken.

Maar om eerlijk te zijn was dat niet echt de context van de discussie, dat was meer onveilige input-interpretatie (XSS, command injection en SQL injection e.d.).
- Warning geven als er een vermoeden is dat er ergens iets escaped is in mijn input-data (ok eigenlijk low-trigger warning die op zichzelf niets doet maar in combinatie met andere low-trigger warnings uit kan groeien tot een officiele backend warning zodat ik niet voor elke dubbele " een warning krijg, maar dit is framework stuff)
Wat is "vermoeden dat iets escaped is"? Krijg ik een warning of wordt mijn input zelfs geweigerd als ik een comment wil posten of een plaatje wil annotaten met
"Minister ondergedoken"
of
Shirley O'Reilly
of
C:\blaat.jpg
?
Checken of het niet boven een bepaalde lengte uitkomt (en dan niet een serieuze veld-lengte, maar simpelweg iets als default max 1Mb alles wat daarboven (en waarvan de max niet aangepast is) wordt gereject alszijnde niet serieuze string, definitie lengte controles voor dbase lengtes etc zitten heel ergens anders in het framework)
Dat vind ik onnodig. Maximale POST size om een DoS te voorkomen wordt al in de serverconfiguratie gedaan (in het geval van PHP in php.ini, in mijn geval in de webserver), en controle of een string niet te lang is voor zijn definitie of gebruik kan zoals je zelf ook al aangeeft beter daar waar je weet waar je aan toe bent. Nog een extra plaats introduceren om een arbitraire (1MB) lengte-check te doen vind ik dan niks toevoegen.
- En nog wat additionele checks.
Ahja, "additionele checks". Net zo duidelijk als het "vermoeden tot escaping". Het is precies dat vage handgewuif waar ik over val, net als "je moet wel je input sanitizen!" zonder dan concreet te maken waarvoor en "ik sanitize mijn input dus ik ben veilig!"
Tja, waarom zou je eigenlijk nog een ander data-type als string gebruiken? In wezen valt (bijna?) alles te representeren als string, dus als ik jou was zou ik gewoon alles representeren als string.
Waar heb je het over? :D

Ik zeg alleen dat als je een (user-input) string doorgeeft aan een module (functie, method, whatever) dat je er dan goed aan doet dat zo te doen dat die user-input string niet verder geinterpreteerd wordt.
Dus liever
code:
1
sql_query("SELECT * FROM users WHERE name=%s;", input_username)

dan
code:
1
sql_query("SELECT * FROM users WHERE name=" + sql_escape(input_username) + ";"

(en al helemaal geen)
code:
1
sql_query("SELECT * FROM users WHERE name=" + input_username + ";"
Parametrized sql queries zijn wat dat betreft enkel maar lastig (alhoewel ik niet weet of php hier ook loosely typed op werkt, ik ga ervanuit van wel) dan hoop jij er dus op dat als jij een string aanlevert dat php-loose-typing er automagisch voor zorgt dat het een int wordt indien nodig en dan moet het wel werken...
Hoezo zijn parametrized queries wat dat betreft enkel lastig? En hoezo lever ik een string aan als het een int moet zijn?
En dat is dus juist waarom ik zeg dat je alles moet sanitizen en niet blind door moet zetten, ik heb helemaal geen tijd/zin om de code door te gaan spitten om te gaan kijken of er wel of geen exec's inzitten, ik weet simpelweg wat ik heb (vanwege input-sanitizing) en ik weet uit de documentatie wat die library verwacht dus ik weet of ik wel of niet output-sanitizing moet gaan doen.
Ja, en die library verwacht (voor bv annotate) gewoon een string die hij op het canvas rendert, zoals ik al zei. En je moet sanitization/escaping doen als Imagick de string interpreteert, dat heb ik ook al gezegd. Dus, Imagick interpreteert de string niet (voorzover ik op kan maken uit de helaas nogal summiere documentatie), wat moet er dan geescaped worden?

Je zegt dat je geen zin hebt om "te kijken of er wel of geen exec's inzitten". Wat stel je dan voor? $img->annotateImage(shellescapearg(user_input))? Omdat de library eventueel wel eens exec() zou kunnen gebruiken?
Waar jij lijkt te zeggen : Doe blind output-sanitizing als het nodig is volgens je verachtingen en f*ck de rest van de gevallen, die gaan fout.
In mijn ogen lijk jij te zeggen "doe blind wat random input-sanitizing en dan ben je veilig!"

Wat ik probeer te zeggen is dat je
  1. interpretatie van user input zoveel mogelijk dient te voorkomen; dus liever parametrized SQL queries zodat de user input nooit als SQL geinterpreteerd wordt, en liever Imagick in plaats van exec("convert -blabla") zodat de user input alleen door ImageMagick geinterpreteerd wordt ipv door shell EN ImageMagick
  2. waar interpretatie onvermijdelijk is zorgen dat je weet wat er exact geinterpreteerd wordt en daarvoor escapen.
Pagina: 1