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