2013-08-20 34 views
2

我想阻止由一个servlet这是一个公共网站的一部分提供的Web服务的未经授权的黑客/偷定义的Web服务的未授权访问。我怎样才能确保一个servlet只被访问者调用到网站上的特定网址?防止由servlet

具体而言,我有两个servlet一起产生包含定制图像的HTML页。图像参数由jsp和servlet1之间的交互设置。然后这些图像参数从jsp中的img标签内发送到servlet2。

我已经包含下面的代码相关的部分,但我的问题是:

  1. 我可以添加到下面servlet2的doGet(),以确保servlet2的doGet()只
    运行,如果它被称为从访问者的my.jsp到我的网站?
  2. 我可以做任何事情的JSTL或低于my.jsp的其他部分来保护
    防止未经授权的调用servlet2?
  3. 我还能做些什么来防止对servlet2的未经授权的调用?

我的JSP看起来像:

<form method="post"> 
    <img src="url-pattern-for-servlet2?a=${param.a}&b=${param.b}" /> 
    <input type="text" name="a" value="${empty param.a ? '5' : param.a}" size="15" /> 
    <input type="text" name="b" value="${empty param.b ? '7' : param.b}" size="15" /> 
    <input type="submit" name="submit-button" value="click here" /> 
</form> 

Servlet1具有通过检查错误处理表单输入doPost()方法,然后调用jsp.forward(请求,响应)返回HTML中已经img标签的src属性填充由值param.a和param.b

Servlet2具有看起来像一个doGet()方法:

String a = req.getParameter("a"); 
String b = req.getParameter("b"); 
//some code to create myBufferedImage using a and b 
resp.setContentType("image/gif");//256 colors 
ImageIO.write(myBufferedImage,"gif",resp.getOutputStream()); 

需要两个servlet的系统,以便可以将生成的图像嵌入html页面内的img标签中。如果我只做了一个servlet,则Web表单只会生成一个图像,并且最终用户将无法继续使用该Web表单创建图像的新定制版本,除非每次都按下后退按钮。

回答

1

您可以检查历史记录中包含你的JSP,但是我觉得你问的是如何防止跨站脚本请求伪造https://www.owasp.org/index.php/Top_10_2013-A8-Cross-Site_Request_Forgery_(CSRF)。其基础是在你的jsp中包含一个隐藏的(唯一的,一次性的)密钥,然后你在第二个servlet中检查它。

+1

这回答我的问题。 +1和信用的答案。谢谢。 – CodeMed

+0

他们(owasp)在github上有一个库来处理这个问题https://github.com/esheri3/OWASP-CSRFGuard瞥一眼它我没有看到一个简单的代码示例,尽管在测试中有一个web应用程序作为一个例子可能是有用的。 – EGHM