日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

检查您的REST参数!

發(fā)布時(shí)間:2023/12/3 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 检查您的REST参数! 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我正在進(jìn)行與正在進(jìn)行的“項(xiàng)目學(xué)生”系列相關(guān)的研究,并意識(shí)到我犯了最常見(jiàn)的錯(cuò)誤,也最容易糾正的錯(cuò)誤之一。 我并沒(méi)有利用我對(duì)Web應(yīng)用程序了解的所有知識(shí)來(lái)向外擴(kuò)展我的安全范圍。

我正在專(zhuān)門(mén)考慮UUID參數(shù)。 我知道每個(gè)有效的外部可見(jiàn)ID都是UUID。 我知道UUID的形式。 那么,為什么不進(jìn)一步檢查我的“ uuid”參數(shù)是否是潛在的有效UUID?

的確,數(shù)據(jù)庫(kù)層不會(huì)識(shí)別出錯(cuò)誤的“ uuid”值-但這可能不是攻擊者的意圖。 也許這是SQL注入攻擊的一部分。 也許這是XSS攻擊的一部分。 也許這是對(duì)我的日志的攻擊的一部分(例如,通過(guò)包含一個(gè)很長(zhǎng)的值可能會(huì)導(dǎo)致緩沖區(qū)溢出)。 也許這是我從未聽(tīng)說(shuō)過(guò)的東西的一部分。 沒(méi)關(guān)系–通過(guò)盡快消除已知無(wú)效的數(shù)據(jù),我將永遠(yuǎn)變得更強(qiáng)大。

效用方法

確定一個(gè)值是否可能是UUID的實(shí)用方法使用簡(jiǎn)單的正則表達(dá)式模式。

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();} }

如果我們要積極進(jìn)取,我們可以仔細(xì)選擇我們的UUID,以便它們具有我們可以檢查的其他屬性。 例如,對(duì)應(yīng)的BigInteger始終可以保留3 mod 17的余數(shù)。攻擊不太可能知道這一點(diǎn),并且當(dāng)有人探測(cè)我們的系統(tǒng)時(shí),我們會(huì)發(fā)出警告。 甚至更復(fù)雜的方法將為每個(gè)類(lèi)的UUID使用不同的屬性,例如,“課程” UUID可能是3 mod 17,而“學(xué)生” UUID是5 mod 17。

單元測(cè)試

進(jìn)行測(cè)試很容易,但是最少的設(shè)置是檢查非十六進(jìn)制數(shù)字,
值太多或太少,一個(gè)空字符串和一個(gè)空值。

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服務(wù)器

REST服務(wù)器應(yīng)檢查所有需要一種方法的UUID值。 在我們確認(rèn)它是格式正確的UUID之后,可以安全地記錄請(qǐng)求參數(shù),但是仍然需要注意在請(qǐng)求中記錄未過(guò)濾的值。

@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;}

一個(gè)明顯的改進(jìn)是將該檢查(和異常處理包)移到所有服務(wù)方法的AOP包裝器中。 這將簡(jiǎn)化代碼,并在保證始終執(zhí)行檢查方面大有幫助。 (由于Web服務(wù)服務(wù)器層當(dāng)前不具有Spring依賴(lài)關(guān)系,因此我目前不在Project Student中使用它。)

您可以提出一個(gè)強(qiáng)有力的opsec參數(shù),即REST方法應(yīng)返回NOT_FOUND響應(yīng)而不是BAD_REQUEST響應(yīng),以減少信息泄漏。

網(wǎng)絡(luò)應(yīng)用

細(xì)節(jié)有所不同,但即使webapp只是REST服務(wù)的淺層前端,我們也應(yīng)該對(duì)它們進(jìn)行相同的處理。 只要有UUID,無(wú)論其來(lái)源是什么,都應(yīng)在使用前對(duì)其進(jìn)行檢查。

篩選器

有一種流派認(rèn)為,安全性應(yīng)與應(yīng)用程序分開(kāi)處理–最好的安全性是在部署時(shí)(通過(guò)過(guò)濾器和AOP)結(jié)合在一起的,而不是嵌入到應(yīng)用程序中。 沒(méi)有人建議應(yīng)用程序開(kāi)發(fā)人員應(yīng)該忽略安全性考慮因素,就像我上面所討論的那樣,檢查很混亂,分散了開(kāi)發(fā)人員的注意力,并且不可靠,因?yàn)殚_(kāi)發(fā)人員很容易忽略。 他們建議改用AOP或過(guò)濾器。

編寫(xiě)與上述代碼具有相同功能的過(guò)濾器很簡(jiǎn)單:

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;} }

沒(méi)有理由我們也不能檢查有效載荷。 例如,我們可以驗(yàn)證日期,電話號(hào)碼和信用卡號(hào)的格式是否正確; 或名稱(chēng)僅包含字母(包括非拉丁字符,如?),空格和撇號(hào)。 (想想“ Anne-MariePe?aO'Brien”。)重要的是要記住,這些檢查不是針對(duì)“有效”數(shù)據(jù)的,而是要消除“無(wú)效”數(shù)據(jù)。

我們必須將過(guò)濾器添加到我們的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

為電話號(hào)碼和姓名之類(lèi)的簡(jiǎn)單元素編寫(xiě)過(guò)濾器很容易,但是純文本字段是另一回事。 這些字段需要最大的靈活性,同時(shí)我們希望將XSS和其他攻擊的風(fēng)險(xiǎn)降至最低。

這些方面的一個(gè)很好的資源是ModSecurity。 這最初是一個(gè)Apache模塊,但已被Trustwave Spider Labs采用。 它位于Web服務(wù)器上,而不是Webapp上,并檢查通過(guò)它的數(shù)據(jù)。 最近的端口(2013年夏季)允許使用Servlet過(guò)濾器而不是外部反向代理來(lái)進(jìn)行設(shè)置。 (它使用JNI來(lái)檢測(cè)包含的應(yīng)用服務(wù)器。)

  • 有關(guān)更多信息,請(qǐng)參見(jiàn)ModSecurity for Java 。

參考: 檢查您的REST參數(shù)! 來(lái)自Invariant Properties博客的JCG合作伙伴 Bear Giles。

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

總結(jié)

以上是生活随笔為你收集整理的检查您的REST参数!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。