diff --git a/superx/WEB-INF/conf/edustore/db/install/conf/builddatum.txt b/superx/WEB-INF/conf/edustore/db/install/conf/builddatum.txt index a8ac865d..bf0c9da7 100644 --- a/superx/WEB-INF/conf/edustore/db/install/conf/builddatum.txt +++ b/superx/WEB-INF/conf/edustore/db/install/conf/builddatum.txt @@ -1 +1 @@ -03.10.2026 +05.10.2026 diff --git a/superx/WEB-INF/conf/edustore/db/install/prozeduren/proc_get_dbform_right_pg.sql b/superx/WEB-INF/conf/edustore/db/install/prozeduren/proc_get_dbform_right_pg.sql index 72ae7974..6304b382 100644 --- a/superx/WEB-INF/conf/edustore/db/install/prozeduren/proc_get_dbform_right_pg.sql +++ b/superx/WEB-INF/conf/edustore/db/install/prozeduren/proc_get_dbform_right_pg.sql @@ -14,55 +14,28 @@ if p_isadmin=1 p_recht:=1; else --Bedingung 2: - -- kein Admin: Besteht Recht über Gruppe zu Sachgebiet "Bearbeitung*" oder "Administration*" ? - if 0 < (SELECT count(*) from user_group_bez U,group_sachgeb_bez B, sachgebiete S -where S.tid=B.sachgebiete_id -and U.groupinfo_id=B.groupinfo_id -and U.userinfo_id=p_userid -and (S.name like ''Bearbeitung%'' or S.name like ''Administration%'') -) + -- kein Admin: Besteht Recht über Gruppe zu Sachgebiet "Administration*" ? + if exists (SELECT sg.* from sachgebiete sg + JOIN sachgeb_dbform_bez sdb ON sg.tid = sdb.sachgebiete_id + JOIN db_forms df ON df.tid = dbform_id + JOIN user_sachgeb_bez usb ON sg.tid = usb.sachgebiete_id + WHERE trim(df.name) = trim(p_form) AND usb.userinfo_id =p_userid + and (sg.name like ''Bearbeitung%'' or sg.name like ''Administration%'') + union SELECT sg.* + FROM sachgebiete sg + JOIN sachgeb_dbform_bez sdb ON sg.tid = sdb.sachgebiete_id + JOIN db_forms df ON df.tid = dbform_id + JOIN group_sachgeb_bez gsb ON sg.tid = gsb.sachgebiete_id + JOIN user_group_bez ugb on ugb.groupinfo_id=gsb.groupinfo_id + WHERE trim(df.name) = trim(p_form) + AND ugb.userinfo_id =p_userid + and (sg.name like ''Bearbeitung%'' or sg.name like ''Administration%'') + ) then p_recht:=1; -else ---Bedingung 3: ---Besteht Recht über User zu zu Sachgebiet "Bearbeitung*" oder "Administration*" ? -if 0 < (SELECT count(*) from user_sachgeb_bez B, sachgebiete S -where S.tid=B.sachgebiete_id -and B.userinfo_id=p_userid -and (S.name like ''Bearbeitung%'' or S.name like ''Administration%'') -) -then -p_recht:=1; -else - ---Bedingung 4: ---kein Admin, keine Bearbeiter: Besteht Leserecht über Gruppe zu Sachgebiet des DBFORMS? - if 0 < (SELECT count(*) from sachgeb_dbform_bez B, db_Forms D,user_group_bez U,group_sachgeb_bez G -where D.tid=B.dbform_id -and trim(D.name) = trim(p_form) -and B.sachgebiete_id=G.sachgebiete_id -and U.groupinfo_id=G.groupinfo_id -and U.userinfo_id=p_userid) -then -p_recht:=2; -else ---Bedingung 5: ---Besteht Recht über User zu zu Sachgebiet des DBFORMS ? -if 0 < (SELECT count(*) from sachgeb_dbform_bez B, db_Forms D,user_sachgeb_bez U -where D.tid=B.dbform_id -and trim(D.name) = trim(p_form) -and B.sachgebiete_id=U.sachgebiete_id -and U.userinfo_id=p_userid) -then -p_recht:=2; -end if; --Ende Bedingung 5 -end if; --Ende Bedingung 4 -end if; --Ende Bedingung 3 - end if; --Ende Bedingung 2 - - end if; --Ende Bedingung 1 - +end if; +end if; return p_recht; diff --git a/superx/WEB-INF/patch/xml/patch_2026-10-07.xml b/superx/WEB-INF/patch/xml/patch_2026-10-07.xml new file mode 100644 index 00000000..1f82b3dc --- /dev/null +++ b/superx/WEB-INF/patch/xml/patch_2026-10-07.xml @@ -0,0 +1,67 @@ + + + + + + + + + + +Sicherheitspatch Bearbeitungsrechte DBFORMS +
  1. +In SuperX konnten angemeldete Benutzer mit einem Sachgebietsrecht, dessen Bezeichnung mit „Bearbeitung“ oder „Administration“ begann, Berichtsmasken konfigurieren und dabei beliebige SQL-Statements auf der BI-Datenbank ausführen. +
  2. +
  3. Wenn ein angemeldeter BI-Administrator parallel eine nicht vertrauenswürdige Webseite aufruft, konnte diese SQL-Befehle auf der BI-Datenbank ausführen. (CSRF in Verbindung mit SQL-Injection). +
  4. +
+Der Patch behebt beide Schwachstellen: +
  1. +Bearbeitungsformulare lassen sich von Nicht-Admins nur öffnen, wenn sie explizite Rechte auf das jew. Administrations-Sachgebiet haben. +
  2. +
  3. Die Möglichkeit zur SQL-Injection wurde entfernt. +
  4. +
+
+ + + + + + + + + +Korrektur Rechteprüfung DBFORMS +Anzeige Hochschul-Repository nur für Impressumg und Datenschutz-Seite +Neue Fächergruppen im Bereich Studierende +Neue Fächergruppen im Bereich Personal + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
diff --git a/superx/edit/kern/show_html_content.jsp b/superx/edit/kern/show_html_content.jsp index a178c8ad..a266ca2e 100644 --- a/superx/edit/kern/show_html_content.jsp +++ b/superx/edit/kern/show_html_content.jsp @@ -37,13 +37,9 @@ if(!entryOK) if(defaultMandantenIDParam != null && !defaultMandantenIDParam.toString().equals("")) { LinkMandantID.append("/"+defaultMandantenIDParam.toString()); } - //Impressum wird immer angezeigt, alles andere nur nach Login: - if ( - IdOutput.equals("IMPRINT") || - IdOutput.equals("PRIVACY") || - ( request.getSession()!=null&&request.getSession().getAttribute("sessiontype")!=null&& - request.getSession().getAttribute("sessiontype").equals("superx")) - ) { + + if (request.getSession()!=null&&request.getSession().getAttribute("sessiontype")!=null&& + request.getSession().getAttribute("sessiontype").equals("superx")) { Object mandantobject=request.getSession().getAttribute("MandantenID"); Object userid=request.getSession().getAttribute("UserID"); @@ -71,7 +67,7 @@ conmm = DbFormsConfigRegistry.instance().lookup().getConnection(mandantenid); PreparedStatement st_output; ResultSet rs_output; -st_output=conmm.prepareStatement("select trim(content) from sx_repository where id=? and today() between gueltig_seit and gueltig_bis and aktiv=1"); +st_output=conmm.prepareStatement("select trim(content) from sx_repository where id=? and id in ('PRIVACY','IMPRINT') and today() between gueltig_seit and gueltig_bis and aktiv=1"); st_output.setString(1,IdOutput); rs_output = st_output.executeQuery(); String sb_output=""; @@ -88,7 +84,7 @@ if(sb_output==null || sb_output.equals("")) //Titel holen: PreparedStatement st_titel; ResultSet rs_titel; -st_titel=conmm.prepareStatement("select trim(caption) from sx_repository where id=? and today() between gueltig_seit and gueltig_bis and aktiv=1"); +st_titel=conmm.prepareStatement("select trim(caption) from sx_repository where id=? and id in ('PRIVACY','IMPRINT') and today() between gueltig_seit and gueltig_bis and aktiv=1"); st_titel.setString(1,IdOutput); rs_titel = st_titel.executeQuery(); String sb_titel=""; diff --git a/superx/edit/kern/sx_repository_list.jsp b/superx/edit/kern/sx_repository_list.jsp index 9e455a58..e2225a3f 100644 --- a/superx/edit/kern/sx_repository_list.jsp +++ b/superx/edit/kern/sx_repository_list.jsp @@ -1,7 +1,7 @@ <%@ taglib uri="/WEB-INF/dbforms.tld" prefix="db" %> <%@page pageEncoding="utf-8" contentType="text/html; charset=UTF-8" %> - + @@ -49,10 +49,12 @@ if(mandantobject != null) //der superx-Default-Mandant ist bei dbforms ein Leerstring if(mandantenid.equals("default")) mandantenid=""; -String db_form_name="sx_repository_list"; +String db_form_name="sx_repository"; String erlaubt="0"; %> + <%@ include file="/edit/check_authentication.inc" %> + <% if(erlaubt.equals("0")) { @@ -72,6 +74,7 @@ keyfieldsused=kf.toString();

+Logo
<% if(!mandantenid.equals("default") && !mandantenid.equals("")) out.println("Mandant: " + mandantenid +""); %>

@@ -87,16 +90,6 @@ if(sachgebiete_id != null && !sachgebiete_id.equals("null")){ filter +="sachgebiete_id="+sachgebiete_id; } %> - -<% -String art = request.getParameter("art"); -if(art != null && !art.equals("null")){ - if (!filter.isEmpty()) { - filter += ","; - } - filter +=",art="+art; -} -%> @@ -106,11 +99,7 @@ dbConnectionName="<%= mandantenid %>" > + @@ -118,16 +107,11 @@ dbConnectionName="<%= mandantenid %>" > - -
- - - - -DetailsDetails
- - <% sql = "select tid, name from sachgebiete order by name;"; %> - -<% +<% if(currentRow_sx_repository != null) { %>?sachgebiete_id=<%= sachgebiete_id %>&tid=" onClick="javascript:neu=window.open('<%= response.encodeURL("/superx/edit/kern/sx_repository_edit.jsp") %>?sachgebiete_id=<%= sachgebiete_id %>&tid=','_blank','directories=no,location=no,menubar=no,toolbar=no,scrollbars=yes,resizable=yes,width=800,height=600'); return false;">Details<% @@ -140,4 +124,4 @@ dbConnectionName="<%= mandantenid %>" >
Ergebnistabelle -
+
+ + -
+ + + + + + +