[英]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.