|
[ https://issues.apache.org/jira/browse/OFBIZ-11306?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17018938#comment-17018938 ] Jacques Le Roux commented on OFBIZ-11306: ----------------------------------------- Hi James, h3. What I agree about I agree about the rules. Pagination, finding, listing should also be exempted from CSRF token check, I guess there are other kinds. So there would not be issues for back and forth. I agree that it's better to put csrf-token information in the controllers (Request Map ). Also as the possibility already exists. h3. Some questions and "answers" bq. Explanation for tokens in navigation In OFBiz, there are forms that use the same uri for getting the form and posting the changes. Have you few examples of that (one would be sufficient)? We need to be sure that we are not missing anything. bq. While there is CSRF token in the form URL, the token is invalidated during form submission. Could you please explain where/how is that done? Is that depending on being a POST method as in {{tokenMap.remove(requestUri);}} in CsrfUtil::checkToken? bq. Explanation for tokens in navigation. This is the reason why token was invalidated each time it was used in a GET request. However, to allow back forward browser actions to work, tokens aren't invalidated for GET request as a compromise between usability and security. I'd prefer that we change all the "same uri for getting the form and posting the changes.". Somehow what you did for processorder in OFBIZ-11319 bq. Explanation for tokens in form URL (defined in FTL files). In order to manually add a CSRF token field, user need to ensure the uri used is the same in both the form action attribute and the CSRF token field. Though I'd add preferred rather to add the token in a hidden field. I understand it's an easy way to automatically do it, and seems safe. As with the previous point we need to be sure that all forms use the POST method. Also we need to do it for at least ofbizContentUrl and check no others would miss it. h3. Suggestions: * I sugget we make {{return size() > 100;}} in CsrfUtil::getTokenMap a properties to allow users to adjust in function of their needs. * Some recommend to encrypt IP and "Timeout" in the CSRF token and check. We could do that by using a JWT token rather than a random value. We could then check both IP and "Timeout" to increase safety. h3. We have few small problems # with Time limitation due to session timeout in ecommerce (maybe the price to pay), eg add to compare after session ended for an anymous user. # SetTimeZoneFromBrowser when starting: org.apache.ofbiz.webapp.control.RequestHandlerException: Invalid or missing CSRF token for AJAX call to path '/SetTimeZoneFromBrowser'. Also not only when starting. h3. We have several issues (at least) in Webtools. All work on trunk demo. * Entity Reference - Interactive Version (also it's duplicated, we should keep only one entry, the one in Entity Engine Tools section) * Service Reference (also it's diplicated, we should keep only one entry, the one in Service Engine section) * Entity Reference - Static Version * Entity Reference - PDF * Induce Model XML from Database * (most?) options in Check/Update Database I guess the last (and maybe others) are related to nested request. Like with checkLogin that you handled in CsrfUtil::generateTokenForNonAjax, not sure why it does not workfor those. More on that below... h3. Issues in Entity Data Maintenance related to new REST work at OFBIZ-11007: Open an entity like webtools/control/ViewGeneric?entityName=Agreement&agreementId=8000 Edit does not work, nor create, nor delete. They work if you revert 6e1c7b5958cc1a80be5746bfd177136a1feabe0d commit (last one for OFBIZ-11007) It's because we have nested requests with this special syntax: {code:xml} <!-- === Rest Entity Mapping === --> <!-- form for creating a record --> <request-map uri="entity/list" method="get"><security https="true" auth="true"/><response name="success" type="view" value="entitymaint" /></request-map> <!-- form for creating a record --> <request-map uri="entity/create/{entityName}" method="get"><security https="true" auth="true"/><response name="success" type="view" value="EditGeneric"/></request-map> <!-- form for modifying a record --> <request-map uri="entity/edit/{entityName}/{pkValues: .*}" method="get"><security https="true" auth="true"/><response name="success" type="view" value="EditGeneric" /></request-map> <!--view relations for a given entity --> <request-map uri="entity/relations/{entityName}" method="get"><security https="true" auth="true"/><response name="success" type="view" value="ViewRelations" /></request-map> <!-- getting the view of records --> <request-map uri="entity/find/{entityName}" method="get"><security https="true" auth="true"/><response name="success" type="view" value="FindGeneric" /></request-map> <!-- adding new record (from submitted form) --> <request-map uri="entity/change/{entityName}" method="post"> <security https="true" auth="true"/> <event type="java" path="org.apache.ofbiz.webtools.GenericWebEvent" invoke="updateGeneric"/> <response name="success" type="view" value="FindGeneric"/> <response name="error" type="view" value="ViewGeneric"/> </request-map> <!-- view entity records --> <request-map uri="entity/find/{entityName}/{pkValues: .*}" method="get"><security https="true" auth="true"/><response name="success" type="view" value="ViewGeneric" /></request-map> <!-- modifying existing record --> <request-map uri="entity/change/{entityName}/{pkValues: .*}" method="put"> <security https="true" auth="true"/> <event type="java" path="org.apache.ofbiz.webtools.GenericWebEvent" invoke="updateGeneric"/> <response name="success" type="view" value="ViewGeneric"/> <response name="error" type="view" value="ViewGeneric"/> </request-map> <!-- deleting existing record --> <request-map uri="entity/change/{entityName}/{pkValues: .*}" method="delete"> <security https="true" auth="true"/> <event type="java" path="org.apache.ofbiz.webtools.GenericWebEvent" invoke="updateGeneric"/> <response name="success" type="view" value="ViewGeneric"/> <response name="error" type="view" value="ViewGeneric"/> </request-map> {code} So we get errors like 2020-01-16 12:41:00,998 |jsse-nio-8443-exec-6 |CsrfUtil |E| request map is null for path entity/find 2020-01-16 12:41:49,544 |jsse-nio-8443-exec-6 |CsrfUtil |E| request map is null for path entity/edit 2020-01-16 12:27:45,222 |jsse-nio-8443-exec-4 |CsrfUtil |E| request map is null for path entity/create 2020-01-16 12:28:48,342 |jsse-nio-8443-exec-4 |CsrfUtil |E| request map is null for path entity/relations I tried to cope with it using {noformat} @@ -798,7 +827,11 @@ public class RequestHandler { if (pathInfo.get(0).indexOf('?') > -1) { return pathInfo.get(0).substring(0, pathInfo.get(0).indexOf('?')); } else { - return pathInfo.get(0); + if (1 < StringUtils.countMatches(path, "/")) { + return pathInfo.get(0) + "/" + pathInfo.get(1); + } else { + return pathInfo.get(0); + } {noformat} and reusing RequestHandler::getRequestUri in several places notably in CsrfUtil class. It helps but seems not to be enough. It seems the same(?) problem exist for searchorders when using a serarch parameter (OK w/o, ie empty by default). We get this message: bq. Invalid or missing CSRF token to path '/orderview'. Click here to continue Maybe related to tokenMap creation at {{tokenMap = getTokenMap(request, "/"+RequestHandler.getRequestUri(pathOrRequestUri));}} Also I tried to cope with Rest links containing {noformat}"/"{noformat} using: {noformat} diff --git framework/webtools/template/entity/ViewGeneric.ftl framework/webtools/template/entity/ViewGeneric.ftl index 216eb63aaa..60c432d9e4 100644 --- framework/webtools/template/entity/ViewGeneric.ftl +++ framework/webtools/template/entity/ViewGeneric.ftl @@ -53,6 +53,7 @@ function ShowTab(lname) { <a href='<@ofbizUrl>entity/find/${entityName}</@ofbizUrl>' class="buttontext">${uiLabelMap.WebtoolsBackToFindScreen}</a> <#if enableEdit = "false"> <#if hasCreatePermission> + <#assign currentFindString = currentFindString?replace("/", "/")!> <form action="<@ofbizUrl>entity/edit/${currentFindString}</@ofbizUrl>" method="get"> <input type="submit" value="${uiLabelMap.CommonEdit}" /> </form> {noformat} But not sure it was a good way, maybe the link issue does not come from that... h3. Lastly about formatting Please check https://cwiki.apache.org/confluence/display/OFBIZ/Coding+Conventions. For instance: {code:java}if (partyTokenMap==null){{code} should be {code:java}if (partyTokenMap == null) {{code} and {code:java}controlPath + (requestURI.startsWith("/")?requestURI:"/"+requestURI));{code} should be {code:java}controlPath + (requestURI.startsWith("/") ? requestUri : "/" + requestUri);{code} etc. > POC for CSRF Token > ------------------ > > Key: OFBIZ-11306 > URL: https://issues.apache.org/jira/browse/OFBIZ-11306 > Project: OFBiz > Issue Type: Improvement > Components: ALL APPLICATIONS > Affects Versions: Upcoming Branch > Reporter: James Yong > Assignee: Jacques Le Roux > Priority: Minor > Labels: CSRF > Fix For: Upcoming Branch > > Attachments: OFBIZ-11306-v2.patch, OFBIZ-11306.patch, OFBIZ-11306.patch, OFBIZ-11306.patch, OFBIZ-11306.patch, OFBIZ-11306.patch, OFBIZ-11306.patch, OFBIZ-11306.patch, OFBIZ-11306.patch, OFBIZ-11306.patch, OFBIZ-11306.patch, OFBIZ-11306.patch, OFBIZ-11306.patch, OFBIZ-11306_Plugins.patch, OFBIZ-11306_Plugins.patch, OFBIZ-11306_Plugins.patch, OFBIZ-11306_Plugins.patch, OFBIZ-11306_Plugins.patch > > > CRSF tokens are generated using SecureRandom class. > 1) In widget form where a hidden token field is auto-generated. > 2) In FTL form where a <@csrfTokenField> macro is used to generate the csrf token field. > 3) In Ajax call where a <@csrfTokenAjax> macro is used to assign csrf token to X-CSRF-Token in request header. > CSRF tokens are stored in the user sessions, and verified during POST request. > A new attribute i.e. csrf-token is added to the security tag to exempt CSRF token check. > Certain request path, like LookupPartyName, can be exempt from CSRF token check during Ajax POST call. -- This message was sent by Atlassian Jira (v8.3.4#803005) |
| Free forum by Nabble | Edit this page |
