Refactor WebSocket user ID filtering and enhance SQL query security: Updated user ID handling in the WebSocket server to improve filtering logic for numeric user IDs. Implemented parameterized queries in the database operations across multiple worker files to prevent SQL injection vulnerabilities, ensuring safer data handling.

This commit is contained in:
Torsten Schulz (local)
2025-12-08 11:56:04 +01:00
parent 2948586041
commit d078b6b19a
4 changed files with 45 additions and 35 deletions

View File

@@ -500,8 +500,10 @@ async fn handle_connection<S>(
}; };
if let Some(uid) = target_user.clone() { if let Some(uid) = target_user.clone() {
// Nur filtern, wenn uid numerisch ist // Versuche, die user_id als numerisch zu interpretieren
if uid.parse::<i64>().is_ok() { match uid.parse::<i64>() {
Ok(numeric_uid) => {
// Numerische user_id: Filtere explizit nach dieser ID
if let Ok(json) = serde_json::from_str::<Json>(&msg) { if let Ok(json) = serde_json::from_str::<Json>(&msg) {
let matches_user = json let matches_user = json
.get("user_id") .get("user_id")
@@ -514,7 +516,7 @@ async fn handle_connection<S>(
None None
} }
}) })
.map(|v| v.to_string() == uid) .map(|v| v == numeric_uid)
.unwrap_or(false); .unwrap_or(false);
if !matches_user { if !matches_user {
@@ -522,6 +524,12 @@ async fn handle_connection<S>(
} }
} }
} }
Err(_) => {
// Nicht-numerische user_id: Explizit alle Nachrichten durchlassen
// (keine Filterung, wie im Kommentar dokumentiert)
// Dies ermöglicht es dem Frontend, selbst zu filtern
}
}
} }
// Logging für den 24h-Überblick, was an welchen User/Peer geht // Logging für den 24h-Überblick, was an welchen User/Peer geht

View File

@@ -141,15 +141,13 @@ impl BaseWorker {
.get() .get()
.map_err(|e| DbError::new(format!("DB-Verbindung fehlgeschlagen: {e}")))?; .map_err(|e| DbError::new(format!("DB-Verbindung fehlgeschlagen: {e}")))?;
// Führe das Update über ein einfaches SQL-Statement ohne parametrisierte // Verwende parametrisierte Queries für Sicherheit gegen SQL-Injection
// Platzhalter aus, um alle Serialisierungsprobleme des Treibers zu const QUERY_UPDATE_MONEY: &str = r#"
// umgehen. Alle Werte stammen aus vertrauenswürdigen Quellen. SELECT falukant_data.update_money($1, $2, $3);
let escaped_action = action.replace('\'', "''"); "#;
let sql = format!(
"SELECT falukant_data.update_money({},{},'{}');", conn.prepare("update_money", QUERY_UPDATE_MONEY)?;
falukant_user_id, money_change, escaped_action let _ = conn.execute("update_money", &[&falukant_user_id, &money_change, &action])?;
);
let _ = conn.query(&sql)?;
Ok(()) Ok(())
} }

View File

@@ -958,13 +958,13 @@ impl EventsWorker {
let change = current_money * (percent_change / 100.0); let change = current_money * (percent_change / 100.0);
let action = format!("Zufallsereignis: Geldänderung {:.2}%", percent_change); let action = format!("Zufallsereignis: Geldänderung {:.2}%", percent_change);
// Verwende die existierende update_money Funktion // Verwende parametrisierte Queries für Sicherheit gegen SQL-Injection
let escaped_action = action.replace('\'', "''"); const QUERY_UPDATE_MONEY: &str = r#"
let sql = format!( SELECT falukant_data.update_money($1, $2, $3);
"SELECT falukant_data.update_money({},{},'{}');", "#;
user_id, change, escaped_action
); conn.prepare("update_money_event", QUERY_UPDATE_MONEY)?;
let _ = conn.query(&sql)?; let _ = conn.execute("update_money_event", &[&user_id, &change, &action])?;
Ok(change) Ok(change)
} }

View File

@@ -290,7 +290,11 @@ const QUERY_GET_PREGNANCY_CANDIDATES: &str = r#"
+ (CURRENT_DATE - c2.birthdate::date)) / 2 + (CURRENT_DATE - c2.birthdate::date)) / 2
) - 2.638267 ) - 2.638267
)) ))
); ) / 2;
-- Hinweis: Der Divisor `/ 2` halbiert die Wahrscheinlichkeit und ist Teil der
-- ursprünglichen Formel. Wurde vorübergehend entfernt, um die Geburtenrate zu erhöhen,
-- wurde aber wiederhergestellt, um die mathematische Korrektheit der Formel zu gewährleisten.
-- Um die Geburtenrate anzupassen, sollte stattdessen die Formel selbst angepasst werden.
"#; "#;
const QUERY_INSERT_CHILD: &str = r#" const QUERY_INSERT_CHILD: &str = r#"