code_junkie

Java/JSP Image upload. Where to keep these image files?

Nov 13th, 2011
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.28 KB | None | 0 0
  1. import java.io.BufferedInputStream;
  2. import java.io.BufferedOutputStream;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.IOException;
  6. import java.io.PrintWriter;
  7.  
  8. import javax.servlet.ServletException;
  9. import javax.servlet.http.HttpServlet;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12.  
  13. /**
  14. * Image streaming Servlet.
  15. */
  16. public class ImageDisplayServlet extends HttpServlet {
  17. private static final long serialVersionUID = 1L;
  18.  
  19. /**
  20. * @see HttpServlet#HttpServlet()
  21. */
  22. public ImageDisplayServlet() {
  23. super();
  24. }
  25.  
  26. /**
  27. * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  28. */
  29. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  30. String relativePath = trimToEmpty(request.getPathInfo());
  31.  
  32. // Make sure no one try to screw with us.
  33. // This is important as user can literally access any file if we are not careful
  34. if(isXSSAttack(relativePath) == false) {
  35. String pathToFile = this.getServletContext().getRealPath(request.getPathInfo());
  36. File file = new File(pathToFile);
  37.  
  38. System.out.println("Looking for file " + file.getAbsolutePath());
  39.  
  40. // show a 404 page
  41. if(!file.exists() || !file.isFile()) {
  42. httpError(404, response);
  43. } else {
  44. try {
  45. streamImageFile(file, response);
  46. } catch(Exception e) {
  47. // Tell the user there was some internal server error.
  48. // 500 - Internal server error.
  49. httpError(500, response);
  50. e.printStackTrace();
  51. }
  52. }
  53. } else {
  54. // what to do if i think it is a XSS attack ?!?
  55. }
  56. }
  57.  
  58. private void streamImageFile(File file, HttpServletResponse response) {
  59. // find the right MIME type and set it as content type
  60. response.setContentType(getContentType(file));
  61. BufferedInputStream bis = null;
  62. BufferedOutputStream bos = null;
  63. try {
  64. response.setContentLength((int) file.length());
  65.  
  66. // Use Buffered Stream for reading/writing.
  67. bis = new BufferedInputStream(new FileInputStream(file));
  68. bos = new BufferedOutputStream(response.getOutputStream());
  69.  
  70. byte[] buff = new byte[(int) file.length()];
  71. int bytesRead;
  72.  
  73. // Simple read/write loop.
  74. while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
  75. bos.write(buff, 0, bytesRead);
  76. }
  77. } catch (Exception e) {
  78.  
  79. throw new RuntimeException(e);
  80. } finally {
  81. if (bis != null) {
  82. try {
  83. bis.close();
  84. } catch (IOException e) {
  85. e.printStackTrace();
  86. // To late to do anything about it now, we may have already sent some data to user.
  87. }
  88. }
  89. if (bos != null) {
  90. try {
  91. bos.close();
  92. } catch (IOException e) {
  93. e.printStackTrace();
  94. // To late to do anything about it now, we may have already sent some data to user.
  95. }
  96. }
  97. }
  98. }
  99.  
  100. private String getContentType(File file) {
  101. if(file.getName().length() > 0) {
  102. String[] parts = file.getName().split("\.");
  103. if(parts.length > 0) {
  104. // only last part interests me
  105. String extention = parts[parts.length - 1];
  106. if(extention.equalsIgnoreCase("jpg")) {
  107. return "image/jpg";
  108. } else if(extention.equalsIgnoreCase("gif")) {
  109. return "image/gif";
  110. } else if(extention.equalsIgnoreCase("png")) {
  111. return "image/png";
  112. }
  113. }
  114. }
  115. throw new RuntimeException("Can not find content type for the file " + file.getAbsolutePath());
  116. }
  117.  
  118. private String trimToEmpty(String pathInfo) {
  119. if(pathInfo == null) {
  120. return "";
  121. } else {
  122. return pathInfo.trim();
  123. }
  124. }
  125.  
  126. private void httpError(int statusCode, HttpServletResponse response) {
  127. try {
  128. response.setStatus(statusCode);
  129. response.setContentType("text/html");
  130. PrintWriter writer = response.getWriter();
  131. writer.append("<html><body><h1>Error Code: " + statusCode + "</h1><body></html>");
  132. writer.flush();
  133. } catch (IOException e) {
  134. e.printStackTrace();
  135. }
  136. }
  137.  
  138. private boolean isXSSAttack(String path) {
  139. boolean xss = false;
  140. // Split on the bases of know file separator
  141. String[] parts = path.split("/|\\");
  142.  
  143. // Now verify that no part contains anything harmful
  144. for(String part : parts) {
  145. // No double dots ..
  146. // No colons :
  147. // No semicolons ;
  148. if(part.trim().contains("..") || part.trim().contains(":") || part.trim().contains(";")) {
  149. // Fire in the hole!
  150. xss = true;
  151. break;
  152. }
  153. }
  154. return xss;
  155. }
  156.  
  157. /**
  158. * @see HttpServlet#doPost(Ht/promotions/some.jpgtpServletRequest request, HttpServletResponse response)
  159. */
  160. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  161. doGet(request, response);
  162. }
  163. }
  164.  
  165. <servlet>
  166. <description></description>
  167. <display-name>ImageDisplayServlet</display-name>
  168. <servlet-name>ImageDisplayServlet</servlet-name>
  169. <servlet-class>com.example.images.ImageDisplayServlet</servlet-class>
  170. </servlet>
  171. <servlet-mapping>
  172. <servlet-name>ImageDisplayServlet</servlet-name>
  173. <url-pattern>/*</url-pattern>
  174. </servlet-mapping>
Add Comment
Please, Sign In to add comment