MST

星途 面试题库

面试题:Rust 字符串拼接在复杂场景下的应用

在一个 Rust 项目中,需要将用户输入的多个字符串片段按照特定的格式拼接成一个完整的 SQL 查询语句字符串。用户输入的字符串片段可能包含特殊字符,并且 SQL 查询语句的格式要求为:`SELECT * FROM table_name WHERE column_name = 'value1' AND column_name2 = 'value2'`,其中 `value1` 和 `value2` 是用户输入的字符串片段。请编写一个 Rust 函数,实现该功能,并处理可能出现的安全问题(如 SQL 注入),同时阐述你在实现过程中对 Rust 字符串拼接方法的选择依据。
18.0万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use rusqlite::{params, Connection};

fn build_sql_query(table_name: &str, column_name1: &str, value1: &str, column_name2: &str, value2: &str) -> Result<String, rusqlite::Error> {
    let conn = Connection::open_in_memory()?;

    let mut stmt = conn.prepare(&format!(
        "SELECT * FROM {} WHERE {} =? AND {} =?", 
        table_name, column_name1, column_name2
    ))?;

    let result = stmt.query_row(params![value1, value2], |row| {
        Ok(row.get(0)?)
    });

    match result {
        Ok(_) => {
            let sql = format!(
                "SELECT * FROM {} WHERE {} = '{}' AND {} = '{}'", 
                table_name, column_name1, value1, column_name2, value2
            );
            Ok(sql)
        },
        Err(e) => Err(e),
    }
}

Rust 字符串拼接方法选择依据

  1. 使用 format!:在构建 SQL 语句的框架时,format! 宏非常方便。它允许我们像使用格式化字符串一样,将变量插入到字符串中。例如 format!("SELECT * FROM {} WHERE {} =? AND {} =?", table_name, column_name1, column_name2) 这样可以灵活地构建基本的 SQL 结构。
  2. 参数化查询:为了防止 SQL 注入,使用 rusqlite 库提供的参数化查询方式。在 prepare 方法中使用占位符 ?,然后通过 params![value1, value2] 来传递实际的值。这样数据库驱动会正确地处理这些值,避免恶意输入导致的 SQL 注入问题。最后在成功查询到数据后,再使用 format! 构建最终展示的 SQL 字符串。