检查您的REST参数!

我正在进行与正在进行的“项目学生”系列相关的研究,并意识到我犯了最常见的错误,也最容易纠正的错误之一。 我并没有利用我对Web应用程序了解的所有知识来向外扩展我的安全范围。

我正在专门考虑UUID参数。 我知道每个有效的外部可见ID都是UUID。 我知道UUID的形式。 那么,为什么不进一步检查我的“ uuid”参数是否是潜在的有效UUID?

的确,数据库层不会识别出错误的“ uuid”值-但这可能不是攻击者的意图。 也许这是SQL注入攻击的一部分。 也许这是XSS攻击的一部分。 也许这是对我的日志的攻击的一部分(例如,通过包含一个很长的值可能会导致缓冲区溢出)。 也许这是我从未听说过的东西的一部分。 没关系–通过尽快消除已知无效的数据,我将永远变得更强大。

效用方法

确定一个值是否可能是UUID的实用方法使用简单的正则表达式模式。

public final class StudentUtil {private static final Pattern UUID_PATTERN = Pattern.compile("^\\p{XDigit}{8}+-\\p{XDigit}{4}+-\\p{XDigit}{4}-\\p{XDigit}{4}+-\\p{XDigit}{12}$");/*** Private constructor to prevent instantiation.*/private StudentUtil() {}public static boolean isPossibleUuid(String value) {return value != null && UUID_PATTERN.matcher(value).matches();}
}

如果我们要积极进取,我们可以仔细选择我们的UUID,以便它们具有我们可以检查的其他属性。 例如,对应的BigInteger始终可以保留3 mod 17的余数。攻击不太可能知道这一点,并且当有人探测我们的系统时,我们会发出警告。 甚至更复杂的方法将为每个类的UUID使用不同的属性,例如,“课程” UUID可能是3 mod 17,而“学生” UUID是5 mod 17。

单元测试

进行测试很容易,但是最少的设置是检查非十六进制数字,
值太多或太少,一个空字符串和一个空值。

public class StudentUtilTest {@Testpublic void testValidUuid() {assertTrue(StudentUtil.isPossibleUuid("63c7d688-705c-4374-937c-6628952b41e1"));}@Testpublic void testInvalidUuid() {assertTrue(!StudentUtil.isPossibleUuid("63c7d68x-705c-4374-937c-6628952b41e1"));assertTrue(!StudentUtil.isPossibleUuid("63c7d68-8705c-4374-937c-6628952b41e1"));assertTrue(!StudentUtil.isPossibleUuid("63c7d688-705c4-374-937c-6628952b41e1"));assertTrue(!StudentUtil.isPossibleUuid("63c7d688-705c-43749-37c-6628952b41e1"));assertTrue(!StudentUtil.isPossibleUuid("63c7d688-705c-4374-937c6-628952b41e1"));assertTrue(!StudentUtil.isPossibleUuid("63c7d688-705c-4374-937c-6628952b41e1a"));assertTrue(!StudentUtil.isPossibleUuid("63c7d688-705c-4374-937c-6628952b41e"));assertTrue(!StudentUtil.isPossibleUuid(""));assertTrue(!StudentUtil.isPossibleUuid(null));}
}

REST服务器

REST服务器应检查所有需要一种方法的UUID值。 在我们确认它是格式正确的UUID之后,可以安全地记录请求参数,但是仍然需要注意在请求中记录未过滤的值。

@Path("/{courseId}")@GET@Produces({ MediaType.APPLICATION_JSON, MediaType.TEXT_XML })public Response getCourse(@PathParam("courseId") String id) {Response response = null;if (!StudentUtil.isPossibleUuid(id)) {response = Response.status(Status.BAD_REQUEST).build();LOG.info("attempt to use malformed UUID");} else {LOG.debug("CourseResource: getCourse(" + id + ")");try {Course course = finder.findCourseByUuid(id);response = Response.ok(scrubCourse(course)).build();} catch (ObjectNotFoundException e) {response = Response.status(Status.NOT_FOUND).build();LOG.debug("course not found: " + id);} catch (Exception e) {if (!(e instanceof UnitTestException)) {LOG.info("unhandled exception", e);}response = Response.status(Status.INTERNAL_SERVER_ERROR).build();}}return response;}

一个明显的改进是将该检查(和异常处理包)移到所有服务方法的AOP包装器中。 这将简化代码,并在保证始终执行检查方面大有帮助。 (由于Web服务服务器层当前不具有Spring依赖关系,因此我目前不在Project Student中使用它。)

您可以提出一个强有力的opsec参数,即REST方法应返回NOT_FOUND响应而不是BAD_REQUEST响应,以减少信息泄漏。

网络应用

细节有所不同,但即使webapp只是REST服务的浅层前端,我们也应该对它们进行相同的处理。 只要有UUID,无论其来源是什么,都应在使用前对其进行检查。

筛选器

有一种流派认为,安全性应与应用程序分开处理–最好的安全性是在部署时(通过过滤器和AOP)结合在一起的,而不是嵌入到应用程序中。 没有人建议应用程序开发人员应该忽略安全性考虑因素,就像我上面所讨论的那样,检查很混乱,分散了开发人员的注意力,并且不可靠,因为开发人员很容易忽略。 他们建议改用AOP或过滤器。

编写与上述代码具有相同功能的过滤器很简单:

public class RestParameterFilter implements Filter {private static final Logger LOG = Logger.getLogger(RestParameterFilter.class);private static final Set<String> validNouns = new HashSet<>();/*** @see javax.servlet.Filter#init(javax.servlet.FilterConfig)*/@Overridepublic void init(FilterConfig cfg) throws ServletException {// learn valid nounsfinal String nouns = cfg.getInitParameter("valid-nouns");if (nouns != null) {for (String noun : nouns.split(",")) {validNouns.add(noun.trim());}}}/*** @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest,*      javax.servlet.ServletResponse, javax.servlet.FilterChain)*/@Overridepublic void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException,ServletException {HttpServletRequest hreq = (HttpServletRequest) req;HttpServletResponse hresp = (HttpServletResponse) resp;// verify the noun + uuidif (!checkPathInfo(hreq, hresp)) {return;}// do additional tests, e.g., inspect payloadchain.doFilter(req, resp);}/*** @see javax.servlet.Filter#destroy()*/@Overridepublic void destroy() {}/*** Check the pathInfo. We know that all paths should have the form* /{noun}/{uuid}/...* * @param req* @return*/public boolean checkPathInfo(HttpServletRequest req, HttpServletResponse resp) {// this pattern only handles noun and UUID, no additional parameters.Pattern pattern = Pattern.compile("^/([\\p{Alpha}]+)(/?([\\p{XDigit}-]+)?)?");Matcher matcher = pattern.matcher(req.getPathInfo());matcher.find();// verify this is a valid noun.if ((matcher.groupCount() >= 1) && !validNouns.contains(matcher.group(1))) {// LOG.info("unrecognized noun");LOG.info("unrecognized noun: '" + matcher.group(1) + "'");resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);return false;}// verify this is a valid verb.if ((matcher.groupCount() >= 4) && !StudentUtil.isPossibleUuid(matcher.group(4))) {LOG.info("invalid UUID");resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);return false;}return true;}
}

没有理由我们也不能检查有效载荷。 例如,我们可以验证日期,电话号码和信用卡号的格式是否正确; 或名称仅包含字母(包括非拉丁字符,如ñ),空格和撇号。 (想想“ Anne-MariePeñaO'Brien”。)重要的是要记住,这些检查不是针对“有效”数据的,而是要消除“无效”数据。

我们必须将过滤器添加到我们的web.xml文件中。

web.xml

<filter><filter-name>REST parameter filter</filter-name><filter-class>com.invariantproperties.sandbox.student.webservice.security.RestParameterFilter</filter-class><init-param><param-name>valid-nouns</param-name><param-value>classroom,course,instructor,section,student,term,testRun</param-value></init-param>
</filter><filter-mapping><filter-name>REST parameter filter</filter-name><servlet-name>REST dispatcher</servlet-name>
</filter-mapping>

ModSecurity

为电话号码和姓名之类的简单元素编写过滤器很容易,但是纯文本字段是另一回事。 这些字段需要最大的灵活性,同时我们希望将XSS和其他攻击的风险降至最低。

这些方面的一个很好的资源是ModSecurity。 这最初是一个Apache模块,但已被Trustwave Spider Labs采用。 它位于Web服务器上,而不是Webapp上,并检查通过它的数据。 最近的端口(2013年夏季)允许使用Servlet过滤器而不是外部反向代理来进行设置。 (它使用JNI来检测包含的应用服务器。)

  • 有关更多信息,请参见ModSecurity for Java 。

参考: 检查您的REST参数! 来自Invariant Properties博客的JCG合作伙伴 Bear Giles。

翻译自: https://www.javacodegeeks.com/2014/01/check-your-rest-parameters.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365864.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python安装哪个版本好啊_windows10安装哪个版本的Python?

python2除了一些大公司历史遗留问题还在使用&#xff0c;目前中小创公司使用最多的是python3 大公司的一些新项目也开始用python3了 目前来说&#xff0c;python3.5以上的版本都可以 目前使用最多的是python3.7&#xff08;建议你安装这个&#xff09; 最新的是python3.8&#…

mongose + express 写REST API

一、准备工具 先确保电脑已经安装好nodejs 1.mongoose&#xff1b;安装非常简单: npm install mongoose --save 【mongoose封装了mongodb的方法&#xff0c;调用mongoose的api可以很轻松的对mongodb进行操作】 2.express&#xff1b;npm install express --save …

js实现html模板继承,理解JavaScript中的原型和继承

本文主要讲了原型如何在JavaScript中工作&#xff0c;以及如何通过[Prototype]所有对象共享的隐藏属性链接对象属性和方法&#xff1b;以及如何创建自定义构造函数以及原型继承如何工作以传递属性和方法值。介绍JavaScript是一种基于原型的语言&#xff0c;这意味着对象属性和方…

将.py文件装成这执行文件.exe

目前已知 cx_freeze支持python3生成可执行文件 cx_freeze的操作 参考http://keliang.blog.51cto.com/3359430/661884 转载于:https://www.cnblogs.com/qingsheng/p/9599885.html

python测试脚本截图_selenium + python实现截图并且保存图片

webdriver的截图功能十分强悍&#xff0c;无论页面多长&#xff0c;webdriver都能比较完美的截到完整的页面。 python代码&#xff1a; # -*- coding: utf-8 -*- from selenium import webdriver import unittest import os, sys, time from pathlib import Path # 初始化实例 …

骁龙660是32位还是64位_高通发布骁龙 7c/8c 芯片,以后你可能会在电脑上看到它...

高通的芯片生意早已不局限于移动设备领域&#xff0c;而是进一步深入至 PC 市场。相比强调性能的 X86 芯片&#xff0c;以高通骁龙为代表的 ARM 系芯片则希望突出自己的优势&#xff0c;即更长的电池续航、无风扇设计和全天候的蜂窝网络连接。在骁龙技术峰会的第三天&#xff0…

Java泛型中的子类型化

泛型类型为Java程序引入了新的类型安全范围。 在同一类型上&#xff0c;泛型类型可以表现得很好&#xff0c;尤其是在使用通配符时 。 在本文中&#xff0c;我想解释子类型如何与Java泛型一起工作。 关于泛型类型子类型化的一般思考 不同泛型类型相同的类或接口的不定义亚型层…

css3之盒模型

什么是盒模型&#xff1f; css中的每个元素都是一个盒模型&#xff0c; 包括html body元素&#xff0c; 浏览器解析css的时候也会把每个元素看成一个盒子来解析。 盒模型具备的属性有&#xff1a; content 、padding 、margin、border 、background等 盒模型的分类&#xff1…

小朋友排队|2014年蓝桥杯B组题解析第十题-fishers

小朋友排队 n 个小朋友站成一排。现在要把他们按身高从低到高的顺序排列&#xff0c;但是每次只能交换位置相邻的两个小朋友。 每个小朋友都有一个不高兴的程度。开始的时候&#xff0c;所有小朋友的不高兴程度都是0。 如果某个小朋友第一次被要求交换&#xff0c;则他的不高兴…

学计算机的误解,让人误解的六大专业

原标题&#xff1a;让人误解的六大专业隔行如隔山&#xff0c;很多人喜欢看名字猜专业&#xff0c;所以导致很多大学专业被人误解。其实了解一个专业不能仅仅凭借它的名字&#xff0c;也不能断章取义&#xff0c;只取片面意思。接下来就让我们来了解一下有哪些被人误解的专业吧…

杂项:轮询

ylbtech-杂项&#xff1a;轮询1.返回顶部 1、轮询&#xff08;Polling&#xff09;是一种CPU决策如何提供周边设备服务的方式&#xff0c;又称“程控输出入”&#xff08;Programmed I/O&#xff09;。轮询法的概念是&#xff0c;由CPU定时发出询问&#xff0c;依序询问每一个周…

python类属性的调用方法_问一个关于PYTHON类属性调用方法的问题

def baidu(self): self.APP_ID2180368 self.API_KEYEYAvb2oTaGa9oSNs5S2yx6v self.SECRET_KEYdmgvBELGq9cMvk2uSPqLUaLUpEng02D self.aipAipOcr(self.APP_ID,self.API_KEY,self.SECRET_KEY) #1.这里定义的self.aip 3. 如果 我把这个self.aip定义在__init__(self)里面就不会报错…

js和css实现手机横竖屏预览思路整理

实现效果&#xff0c;如上图。 首先&#xff0c;实现手机页面在PC端预览&#xff0c; 则先在网上找到一个手机的背景图片&#xff0c;算好大概内间距&#xff0c;用来放预览的页面&#xff0c;我这里是给手机预览页面的尺寸按iphone5的尺寸来的&#xff1b; 一个手机页面在这里…

Lambda,会序列化吗?

因此&#xff0c;我一直在思考Tyrus项目所需的增强功能&#xff0c;该功能允许用户广播到跨机器集群连接到URL的客户端子集。 有多种方法可以做到这一点&#xff1b; 但是自从我使用JDK 8以来&#xff0c;这个问题肯定看起来像钉子。 为此&#xff0c;我创建了一个简单的单元测…

thinkphp日志泄漏漏洞_【Windows高危漏洞预警】CVE20200601,影响关键加密功能

一、事件报告2020年伊始&#xff0c;NSA发现了一个影响Microsoft Windows加密功能的严重漏洞(CVE-2020-0601)。证书验证漏洞允许攻击者破坏Windows验证加密信任的方式&#xff0c;并且可以启用远程代码执行。该漏洞会影响Windows 10和Windows Server 2016/2019以及依赖Windows的…

第一章计算机网络概述答案,第一章 计算机网络概述[3]

1-07 试在下列条件下比较电路交换和分组交换。要传送的报文共x(bit)。从源站到目的站共经过k段链路&#xff0c;每段链路的传播时延为d(s)&#xff0c;数据率为b(b/s)。在电路交换时电路的建立时间为S(s)。在分组交换时分组长度为p(bit)&#xff0c;且各结点的排队等待时间可忽…

meta标签的用处详解

meta标签的用处&#xff1a; 用来描述html文档的一个属性。列如作者。日期和时间&#xff0c;网页描述&#xff0c;关键字&#xff0c;页面刷新等。 是文档最基本的元数据 元数据&#xff08;metadata&#xff09;&#xff1a; 用来概括描述数据的一些基本数据 meta 标签的使用…

最小路径算法(Dijkstra算法和Floyd算法)

1.单源点的最短路径问题&#xff1a;给定带权有向图G和源点v&#xff0c;求从v到G中其余各顶点的最短路径。 我们用一个例子来具体说明迪杰斯特拉算法的流程。 定义源点为 0&#xff0c;dist[i]为源点 0 到顶点 i 的最短路径。其过程描述如下&#xff1a; 步骤dist[1]dist[2]di…

react如何监听路由url变化

"componentWillReceiveProps" "shouldComponentUpdate" "componentWillUpdate" "render" "componentDidUpdate" 使用这些生命周期钩子可以监听到路由相同&#xff0c;参数不同的变化&#xff0c;但是监听不到完全不相同的ur…

python 购物车程序_python_购物车程序

#需求1.启动程序后&#xff0c;让用户输入工资&#xff0c;然后打印商品列表 2.允许用户根据商品编号购买商品 3.用户选择商品后&#xff0c;检测余额是否够&#xff0c;够就直接扣款&#xff0c;不够就提醒 4.可随时退出&#xff0c;退出时&#xff0c;打印已购买商品和余额 #…