ImageTragick "fix" ha interrotto il mio script e non sono sicuro di come risolvere il problema

Usando Imagick, inserisco jpg personalizzati in un file SVG e poi li converto in jpg. A causa di ImageTragick, i miei jpeg non vengono mai visualizzati e il mio font non viene convertito. A causa della vulnerabilità il mio host ha aggiornato il suo policy.xml e ora è danneggiato.

<policymap> <!-- <policy domain="system" name="precision" value="6"/> --> <!-- <policy domain="resource" name="temporary-path" value="/tmp"/> --> <policy domain="resource" name="memory" value="32MiB"/> <policy domain="resource" name="map" value="32Mib"/> <!-- <policy domain="resource" name="area" value="1GB"/> --> <!-- <policy domain="resource" name="disk" value="16EB"/> --> <!-- <policy domain="resource" name="file" value="768"/> --> <policy domain="resource" name="thread" value="1"/> --> <!-- <policy domain="resource" name="throttle" value="0"/> --> <policy domain="resource" name="time" value="30"/> <policy domain="coder" rights="none" pattern="EPHEMERAL" /> <policy domain="coder" rights="none" pattern="URL" /> <policy domain="coder" rights="none" pattern="HTTPS" /> <policy domain="coder" rights="none" pattern="MVG" /> <policy domain="coder" rights="none" pattern="MSL" /> </policymap> 

Non ho idea di where iniziare a ripararlo. Ho letto sulla conferma dei tipi di image, ma sono confuso su where va quel codice.

Fondamentalmente, mi riferisco all'image che voglio usare …

 $imageURL = $_POST['imageURL']; 

Quindi costruisco una string svg usando …

 $svgString = <<<EOD <svg class="svgImage" viewBox="0 0 1200 630" preserveAspectRatio="xMidYMin slice"> <image id="placedImage" xlink:href="$imageURL" x="0" y="0" height="630px" width="1200px" /> <text class="newText topText" id="topTextWhite" style="font-size:24px; font-family: impact, sans-serif;" text-anchor="middle" x="600" y="100" fill="black">Test top words</text> <text class="newText bottomText" id="bottomTextWhite" style="font-size:24px; font-family: impact, sans-serif;" text-anchor="middle" x="600" y="600" fill="black">Test bottom words</text> </svg> EOD; 

Quindi preparalo per una corsa attraverso Imagick ()

 //NEW FILENAME INCLUDING MICROTIME TO PREVENT DUPLICATIONS $fileName = "name". microtime(true); $newFileName = 'gallery/' . $fileName . '.jpg'; //THE FILE WE'LL BE WORKING WITH $file = 'gallery/' . $fileName . '.svg'; //INITIALIZE STRING FOR PROPER SVG CONVERSION $current = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>'; //APPEND CONTENT STRING $current .= $svgString; //WRITE THE FILE CONTENTS INTO THE FILE //If file already exists, it will replace it. file_put_contents($file, $current); //START CONVERSION PROCESS $svg = file_get_contents($file); $image = new Imagick(); $image->setFont("Impact.ttf"); $image->readImageBlob($svg); $image->setCompression(Imagick::COMPRESSION_JPEG); $image->setCompressionQuality(60); $image->setImageFormat("jpg"); $image->writeImage($newFileName); $image->clear(); $image->destroy(); //DESTROY SVG FILE unlink($file); 

E questo ha funzionato bene per molti mesi. Ora, la conversione avviene ma i caratteri non sono inclusi e l'image inserita appare come uno background bianco. Qualche suggerimento su come get questo up-and-running fino a quando non avremo la possibilità di implementare una nuova soluzione? Grazie.

Alcune cose qui.

 <image id="placedImage" xlink:href="$imageURL" x="0" y="0" height="630px" width="1200px" /> ^~~~~~~~^ 

La restrizione delle norme su URL e / o HTTPS dovrà probabilmente bloccare questo comportmento.

 $image->readImageBlob($svg); // <-- May throw 'not authorized' exception 

La restrizione MVG bloccherebbe la lettura del file XML-to-MVG intermedio.

Allora, qual è una ansible soluzione?

Se non puoi leggere risorse remote o file grafici vettoriali intermedi, pianifica di raccogliere le parti dell'image e creare direttamente l'image. Ecco un esempio.

 // Create a blank Canvas (YMMV) $image = new Imagick(); $image->newPseudoImage(1200, 630, 'xc:'); // Read background image $background = new Imagick($imageURL); // Can no longer be remote URL/HTTP(S) // Resize to canvas $background->resizeImage(1200, 630, Imagick::FILTER_LANCZOS, 1.0, false); // Copy to canvas (again, YMMY) $image->compositeImage($background, Imagick::COMPOSITE_ATOP, 0, 0, Imagick::CHANNEL_ALL); // Create a drawing context $ctx = new ImagickDraw(); // Read font as before $ctx->setFont("Impact.ttf"); $ctx->setFontSize(24); // Calculate what the font will be ... $font_metrics = $image->queryFontMetrics($ctx, "Test top words", false); // ... and draw it at position. $ctx->annotation(600 - $font_metrics['textWidth'] / 2, 100, "Test top words"); // repeat as needed $font_metrics = $image->queryFontMetrics($ctx, "Test bottom words", false); $ctx->annotation(600 - $font_metrics['textWidth'] / 2, 600, "Test bottom words"); // Draw context $image->drawImage($ctx); // Write to JPG $image->setCompression(Imagick::COMPRESSION_JPEG); $image->setCompressionQuality(60); $image->writeImage($newFileName); 

Ovviamente la soluzione di cui sopra può essere semplificata / ridotta, ma dovrebbe iniziare.