Attention, ce sujet est un sujet ancien (6672 jours sans réponse)
    Gras [b]Texte[/b] Italique [i]Italique[/i] Souligné [u]Souligné[/u] Barré [strike]Barré[/strike]
    Courriel [email=nobody@nobody.org]Nom[/email] Lien [url=http://www.website.com]Texte[/url] Ancre [anchor]Nom[/anchor] Image [img]http://www.website.com/image.jpg[/img] Insérer une image en provenance du site
    Aligné à gauche [align=left]Texte[/align] Centré [align=center]Texte[/align] Aligné à droite [align=right]Texte[/align] Toute la largeur [align=justify]Texte[/text]
    Couleur [color=#000000]Text[/color] Mise en forme [highlight=pascal]Texte[/highlight] Widgets Emoticons :code: [:code] Convertisseur HTML vers BBCode Convertisseur Word vers BBCode
    Prévisualisation Vérification de l'orthographe

    Copier Coller Couper Tout sélectionner
    Tout effacer Insérer la date Insérer l'heure Insérer la date et heure Insérer votre IP
    Liste [list=square][item]BlaBla[/item][/list] Liste Numérotée [list=decimal][item]BlaBla[/item][/list]
    Citation [quote=name]Texte[/quote] Spoiler [spoiler]James est le meurtrier![/spoiler]
    Tout en majuscules [uppercase]Texte[/uppercase] Tout en minuscules [lowercase]Texte[/lowercase] l33t [l33t]Je suis un nerd[/l33t] Texte en indice [sub]Texte[/sub] Texte en exposant [sup]Texte[/sup] Taille du texte [size=8]Texte[/size]
     
    rfr
    Alors voici le code torché à la va-vite ... hum ...

    1. package be.erefer.Html2Png; 
    2. import java.io.ByteArrayOutputStream; 
    3. import java.io.IOException; 
    4. import javax.servlet.ServletException; 
    5. import javax.servlet.http.HttpServletRequest; 
    6. import javax.servlet.http.HttpServletResponse; 
    7. import org.eclipse.swt.SWT; 
    8. import org.eclipse.swt.browser.Browser; 
    9. import org.eclipse.swt.browser.ProgressEvent; 
    10. import org.eclipse.swt.browser.ProgressListener; 
    11. import org.eclipse.swt.graphics.GC; 
    12. import org.eclipse.swt.graphics.Image; 
    13. import org.eclipse.swt.graphics.ImageData; 
    14. import org.eclipse.swt.graphics.ImageLoader; 
    15. import org.eclipse.swt.layout.FillLayout; 
    16. import org.eclipse.swt.layout.GridData; 
    17. import org.eclipse.swt.layout.GridLayout; 
    18. import org.eclipse.swt.widgets.Display; 
    19. import org.eclipse.swt.widgets.Shell; 
    20. import org.mortbay.jetty.Server; 
    21. import org.mortbay.jetty.handler.AbstractHandler; 
    22. class RequestHandler extends AbstractHandler { 
    23. private Main m = null; 
    24.  
    25. public RequestHandler(Main m) { 
    26. this.m = m; 
    27.  
    28. public void handle(String arg0, HttpServletRequest arg1, 
    29. HttpServletResponse arg2, int arg3) throws IOException, 
    30. ServletException { 
    31.  
    32. synchronized (this) { 
    33.  
    34. String url = arg1.getParameter("url"); 
    35. String width = arg1.getParameter("width"); 
    36. String height = arg1.getParameter("height"); 
    37.  
    38. int x; 
    39. int y; 
    40.  
    41. if (url == null || width == null || height == null) { 
    42. throw new ServletException("Invalid Parameters"); 
    43.  
    44. try { 
    45. x = Integer.parseInt(width); 
    46. y = Integer.parseInt(height); 
    47. catch (Exception e) { 
    48. throw new ServletException("Invalid Parameters"); 
    49.  
    50. m.SetSize(x, y); 
    51.  
    52. Object synch = new Object(); 
    53. m.setSynchObject(synch); 
    54.  
    55. m.launchImageCapture(url); 
    56.  
    57. synchronized(synch) { 
    58. try { 
    59. synch.wait(); 
    60. catch (Exception e) { 
    61. new ServletException("Internal Error"); 
    62.  
    63. if (m.getRequestImageData() == null) { 
    64. throw new ServletException("No image generated"); 
    65.  
    66. ImageLoader il = new ImageLoader(); 
    67. il.data = new ImageData[] {m.getRequestImageData()}; 
    68.  
    69. ByteArrayOutputStream imgb = new ByteArrayOutputStream(); 
    70. il.save(imgb, SWT.IMAGE_PNG); 
    71. //imgb.flush(); 
    72.  
    73.  
    74. arg2.setStatus(HttpServletResponse.SC_OK); 
    75. arg2.setContentType("image/png"); 
    76. arg2.setContentLength(imgb.size()); 
    77.  
    78. byte[] data = imgb.toByteArray();  
    79.  
    80.                         arg2.getOutputStream().write(data); 
    81.  
    82. arg2.getOutputStream().flush(); 
    83.  
    84.  
    85.  
    86. public class Main { 
    87. private Browser b = null; 
    88. private Display d; 
    89. private Shell main; 
    90.  
    91. private int requestedWidth; 
    92. private int requestedHeight; 
    93.  
    94. private Object synchObject;  
    95.  
    96. private ImageData requestImageData; 
    97. private String requestUrl; 
    98.  
    99. public void SetSize(int x, int y) { 
    100. requestedHeight = y; 
    101. requestedWidth = x; 
    102.  
    103. public void setSynchObject(Object o) { 
    104. synchObject = o; 
    105.  
    106. public ImageData getRequestImageData() { 
    107. return requestImageData; 
    108.  
    109. public void setRequestImageData(ImageData id) { 
    110. requestImageData = id; 
    111.  
    112. public void loadCompleted() { 
    113. FrameGrabber fg = new FrameGrabber(this, main, b); 
    114.  
    115. d.timerExec(2000, fg); 
    116.  
    117. public void imageCapture() { 
    118. main.setSize(requestedWidth, requestedHeight); 
    119. main.setActive(); 
    120. b.setData(synchObject); 
    121. b.setUrl(requestUrl); 
    122.  
    123. public void launchImageCapture(String url) { 
    124. requestUrl = url; 
    125. d.syncExec(new Runnable() { 
    126. public void run() { 
    127. imageCapture(); 
    128. }); 
    129.  
    130. public void run() { 
    131.  
    132. Server server = new Server(9090); 
    133. server.setHandler(new RequestHandler(this)); 
    134. try { 
    135. server.start(); 
    136. catch (Exception e) { 
    137. throw new RuntimeException("Error in server"); 
    138.  
    139. d = new Display(); 
    140.  
    141. main = new Shell(d, SWT.NO_TRIM); 
    142. main.setLayout(new FillLayout()); 
    143.  
    144. GridLayout gridLayout = new GridLayout(); 
    145. gridLayout.numColumns = 1
    146. main.setLayout(gridLayout); 
    147. GridData data = new GridData(); 
    148. data.horizontalAlignment = GridData.FILL; 
    149. data.verticalAlignment = GridData.FILL; 
    150. data.grabExcessHorizontalSpace = true; 
    151. data.grabExcessVerticalSpace = true;  
    152. main.setSize(1024768); 
    153. main.setLocation(00); 
    154.  
    155. b = new Browser(main, SWT.MOZILLA); 
    156. b.setLayoutData(data); 
    157.  
    158.  
    159. main.open(); 
    160.  
    161. /* 
    162. b.addTitleListener(new TitleListener() { 
    163. public void changed(TitleEvent event) { 
    164. loadCompleted(); 
    165.  
    166. }); 
    167. */ 
    168.  
    169. //b.setText("<html><head></head><body>a</body></html>"); 
    170. if (!b.execute("window.scrollbars.visible=false;")) { 
    171. System.out.println("Script not executed"); 
    172. b.addProgressListener(new ProgressListener() { 
    173. public void changed(ProgressEvent event) { 
    174. public void completed(ProgressEvent event) { 
    175. if (requestUrl == null) { 
    176. return
    177. loadCompleted(); 
    178. b.execute("window.scrollbars.visible=false;"); 
    179.  
    180. }); 
    181.  
    182. while (!main.isDisposed()) { 
    183. if (!d.readAndDispatch()) 
    184. d.sleep(); 
    185.  
    186.  
    187.  
    188. main.dispose(); 
    189. d.dispose(); 
    190.  
    191.  
    192.  
    193.  
    194. public static void main(String s[]) { 
    195. Main m = new Main(); 
    196. m.run(); 
    197. class FrameGrabber implements Runnable { 
    198.  
    199. private Browser b; 
    200. private Shell s; 
    201. private Main m; 
    202.  
    203. public FrameGrabber(Main m, Shell s, Browser b) { 
    204. this.b = b; 
    205. this.s = s; 
    206. this.m = m; 
    207.  
    208. public void run() { 
    209.  
    210. int xDelta = 0
    211. int yDelta = 0
    212.  
    213. s.setActive(); 
    214. b.redraw(); 
    215. if (b.getVerticalBar() == null) { 
    216. System.out.println("No VScroll"); 
    217. else { 
    218. System.out.println("VScroll"); 
    219. if (b.getHorizontalBar() == null) { 
    220. System.out.println("No HScroll"); 
    221. else { 
    222. System.out.println("HScroll"); 
    223.  
    224. if (b.getHorizontalBar() != null && b.getHorizontalBar().isVisible()) { 
    225. yDelta = b.getHorizontalBar().getSize().y; 
    226. System.out.println("yDelta = "+yDelta); 
    227. if (b.getVerticalBar() != null && b.getVerticalBar().isVisible()) { 
    228. xDelta = b.getVerticalBar().getSize().x; 
    229. System.out.println("xDelta = "+xDelta); 
    230. }  
    231.  
    232. b.update();  
    233. GC browserGC = new GC(b); 
    234. Image img = new Image(Display.getCurrent(), b.getClientArea().width - xDelta, b.getClientArea().height-yDelta); 
    235.  
    236. browserGC.copyArea(img, 00); 
    237.  
    238. m.setRequestImageData(img.getImageData()); 
    239. browserGC.dispose(); 
    240. synchronized(b.getData()) { 
    241. b.getData().notify(); 
    242.  
    243. }
    Clandestino
    Maintenant c'est pour moi :oh: A l'origine c'était pour un client, mais j'ai réussi à lui faire changer d'idée entretemps :lol:

    Merci en tout cas :itm:
    rfr
    rfr > Tu pourrais me filer le source, que j'aie une idée de comment tu fais ?


    C'est pour toi ou un client?

    Si c'est pour toi je t'explique, si c'est pour un client il paye :ddr555:

    Mais en gros, l'architecture est la suivante (sous linux):

    Un serveur xvfb (Virtual Frame Buffer donc pas besoin de carte graphique) qui tourne parce que n'importe quel browser nécessite un environnement graphique ...

    Une application Java SWT (hehe) qui intègre un widget Browser qui utilise xulrunner pour le rendu. Une fois la page chargée, je récupere l'image du widget browser que je convertit en PNG et que je refourgue à celui qui en fait la demande. J'utilise aussi Jetty pour fournir le serveur WEB (par facilité, on peut trouver bcp moins gourmand).

    Dans l'application ici, toute les requêtes sont sérialisées car j'utilise toujours le même browser pour le rendu.

    La source ... j'ai honte :wink:

    Mais en gros:

    b = le widget du browser qui intègre xulrunner.

    b.update();
    GC browserGC = new GC(b);
    Image img = new Image(Display.getCurrent(), b.getClientArea().width - xDelta, b.getClientArea().height-yDelta);

    browserGC.copyArea(img, 0, 0);

    m.setRequestImageData(img.getImageData());

    browserGC.dispose();
    synchronized(b.getData()) {
    b.getData().notify();
    }
    Clandestino
    rfr > Tu pourrais me filer le source, que j'aie une idée de comment tu fais ?
    cauet
    Et qu'est-ce que t'empêche de faire exec bash ? :oh:

    On parlait de dload() initialement.. Mais si on se fabrique une extension PHP maison.. effectivement, c'est dangereux. Je n'avais pas vu sous cet angle.
    zion

    suis ptet trop naif :sweat:


    Alors la clairement, si on te laisse exécuter du binaire sur ta machine t'es quand même mal barré :itm:
    Altar
    Et qu'est-ce que t'empêche de faire exec bash ? :oh:
    cauet


    Et tu crois qu'il n'y a aucun moyen de faire une escalade d'user? :oh:


    sans accès shell?
    suis ptet trop naif :sweat:
    ovh
    Et tu crois qu'il n'y a aucun moyen de faire une escalade d'user? :oh:

    Ca donne le vertige :ciler:

    :neowen:
    zion

    PHP tourne sous ton user, c'est rarement le cas chez les autres hébergeurs.. les dégats sont donc.. limités, non?


    Et tu crois qu'il n'y a aucun moyen de faire une escalade d'user? :oh:
    Catégorie:  






    Ada
    CSS
    Cobol
    CPP
    HTML
    Fortran
    Java
    JavaScript
    Pascal
    Perl
    PHP
    Python
    SQL
    VB
    XML
    Anon URL
    DailyMotion
    eBay
    Flickr
    FLV
    Google Video
    Google Maps
    Metacafe
    MP3
    SeeqPod
    Veoh
    Yahoo Video
    YouTube
    6px
    8px
    10px
    12px
    14px
    16px
    18px
    Informaticien.be - © 2002-2026 AkretioSPRL  - Generated via Kelare
    The Akretio Network: Akretio - Freedelity - KelCommerce - Votre publicité sur informaticien.be ?