SQLite 中的變數表名稱
在SQLite 中,你可能會遇到這樣的情況,你需要動態建立一個表,其名稱儲存在一個變數。雖然為此目的使用字串建構函數很常見,但由於潛在的 SQL 注入攻擊,會出現安全性問題。
不幸的是,SQLite 不允許對錶名進行參數替換。然而,最佳實踐要求使用參數替換來防範注入攻擊。
替代解決方案:清理變數
由於表名稱無法直接參數化,因此可行的解決方案是在將包含表名的變數傳遞給CREATE TABLE 語句之前對其進行清理。
您可以建立一個函數來清理透過刪除除字母數字字元之外的所有字元來變更變數。例如,以下Python 函數會移除標點符號、空格和其他非字母數字字元:
def scrub(table_name): return ''.join( chr for chr in table_name if chr.isalnum() ) scrub('); drop tables --') # returns 'droptables'
使用此函數,您可以建立具有可變表名的表,確保刪除惡意字符,防止注入攻擊:
table_name = 'StarFrame' + self.name cursor.execute('CREATE TABLE {} (etc etc)'.format(scrub(table_name)))
以上是如何在 SQLite 中安全地建立具有動態名稱的表?的詳細內容。更多資訊請關注PHP中文網其他相關文章!