Attention, ce sujet est un sujet ancien (6226 jours sans réponse)
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-2024 AkretioSPRL  - Generated via Kelare
The Akretio Network: Akretio - Freedelity - KelCommerce - Votre publicité sur informaticien.be ?