簡體   English   中英

使用預准備語句從用戶輸入創建數據庫以防止SQL注入

[英]Create database from user input with prepared statement to prevent SQL injection

在我們的應用程序中,我們接受用戶輸入(如項目名稱),然后使用它為用戶創建數據庫(除其他外)。 我想阻止SQL注入,但不能為創建數據庫和授予訪問權限准備SQL語句。 有沒有一種安全的方法來阻止用戶注入SQL? 我只能想到將輸入限制為英文字母和空格的字母(以及DB名稱用下划線替換它們),如果我們將SQL語句括在單引號中,這反過來可以提供保護。 這是一個看似合理的解決方案嗎?

我們正在使用帶有Postgres 10.6數據庫的java 8 / spring boot。 根據我的理解,我已經玩過SQL和准備好的語句,只能用於更新,刪除和更新等查詢。 我試圖擺弄代碼以嘗試從用戶輸入中刪除一些表,但幸運的是,它沒有用,但我想確保應用程序不會受到攻擊。

String createDbSQL = "create database ?";
Connection connection = DriverManager.getConnection(env.getDbUrl(), env.getDbUsername(), env.getDbPassword());
connection.setAutoCommit(false);
PreparedStatement preparedStatement = connection.prepareStatement(createDbSQL);
preparedStatement.setString(1, "test_db_name");
preparedStatement.execute();

org.postgresql.util.PSQLException: ERROR: syntax error at or near "$1"失敗org.postgresql.util.PSQLException: ERROR: syntax error at or near "$1" (如果預處理語句不能用於create database,則有意義)

PREPARE foo (text) AS create alter database $1;

期望查詢表達式並不起作用

這不是必需的,並且可能導致問題超出sql注入的可能性。 如果您負責提供數據庫,則需要負責命名。

您可以讓用戶提供一個名稱,只要他們擔心數據庫的名稱,但您創建和使用數據庫的代碼可以使用您自己生成和控制的名稱。 這樣,如果由於某種原因你需要給它一個不同的名稱,或者創建數據庫的新副本,或者切換到不同的數據庫平台,其中用戶提供的名稱遵循不同的規則(並且可能他們選擇的名稱無效) ,你不會被阻止。

您只允許使用a-zA-Z0-9,或者您可以使用escapeLiteral

您不能使用PREPARE語法創建數據庫:

statement
Any SELECT, INSERT, UPDATE, DELETE, or VALUES statement.

Postgresql 10 docs )(順便說一句:現在是10.8或11.3)

因此,您必須在正常語句中創建數據庫。

您的問題標題與問題本身無關,因為您已對數據庫名稱進行了硬編碼,因此避免了任何攻擊。 很可能您想要處理用戶提供的數據庫名稱。 如果是這種情況, 那么您的問題的那一部分就是重復的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM