[英]What is a safe and simple way of escaping table's column names in MySQL?
我用谷歌搜索了一下,但是那里的信息太多了。 所以,我有 go 以下查詢:
$name = (string) $_GET['user-input'];
if (str_contains('`'))
throw \Exception('Error message');
$sql = "SELECT * FROM users WHERE `$name` = 'someUsername'";
// ... query execution comes here
我的問題是:用“ ` ”字符括起列名是否足夠(安全)? 我不想使用regExp
,因為我認為它對性能的影響最差。
如果我不能只使用“ ` ”,那我該怎么辦?
創建列名白名單並將用戶提供的值與其進行比較:
const valid_column_list = ['username', 'name'];
$user_input = filter_input(INPUT_GET, 'user-input');
if (in_array($user_input, valid_column_list)) {
$sql = "SELECT * FROM users WHERE `$user_input` = 'someUsername'";
}
這就是應該做的。
不安全。
一旦黑客發現 backtic 是您所依賴的引用字符,他們就可以輕松地進行“SQL 注入”來入侵您的系統。 他們可能會向您的 UI 顯示一個“名稱”,例如“id ; DROP DATABASE...;
”(他們已經猜到了您的數據庫的名稱)。
請注意,禁止多查詢也有助於避免這種類型的黑客攻擊。 相反,他們可以用子查詢做一些事情。
面對它。 您需要完全控制數據庫/表/列名稱。 (“白名單”的建議是一種方式。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.