2

我想防止未经授权的黑客攻击/窃取由公共网站一部分的 servlet 提供的 Web 服务。如何确保 servlet 仅被访问者调用到站点上的特定 url?

具体来说,我有两个 servlet,它们一起生成一个包含自定义图像的 html 页面。图像参数由jsp和servlet1交互设置。然后,这些图像参数从 jsp 中的 img 标签内从 jsp 发送到 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(request,response) 以返回 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 表单来创建图像的新自定义版本,除非他们每次都点击后退按钮。

4

1 回答 1

1

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

于 2013-08-21T06:11:19.877 回答