繁体   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