簡體   English   中英

MySQL 中 escaping 表的列名的安全簡單方法是什么?

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

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