在我们的应用程序中,用户可以以 SQL 语句的形式创建自定义导出函数。像这样的:
SELECT name, age, date_birth FROM users WHERE group_id = 2
我不希望他们通过插入 DELETE 语句来清除整个数据库。 我的想法是:
- 使用只允许 SELECT 的 SQL 帐户。 (如果有其他选择,我不想这样做。)
- 使用神奇的正则表达式来检查查询是否危险。 (这样会好吗?已经有这样的正则表达式了吗?)
我们正在使用 PHP PDO。
最佳答案
在我看来,有三个选项可供选择:
选项 1
创建一个工具,在后台为用户创建查询。只需单击按钮并输入表名即可。通过这种方式,您可以在后台捕获所有奇怪的行为,从而使您摆脱不想执行的查询的危险。
选项 2
创建一个只允许执行SELECT
查询的MySQL 用户。我相信您甚至可以决定允许用户从哪些表中进行选择。使用该用户执行用户输入的查询。创建一个单独的用户,该用户具有您希望它执行 UPDATE
、INSERT
和 DELETE
查询的权限。
选项 3
在执行查询之前,请确保其中没有任何有害内容。扫描错误语法的查询。
例子:
// Check if SELECT is in the query
if (preg_match('/SELECT/', strtoupper($query)) != 0) {
// Array with forbidden query parts
$disAllow = array(
'INSERT',
'UPDATE',
'DELETE',
'RENAME',
'DROP',
'CREATE',
'TRUNCATE',
'ALTER',
'COMMIT',
'ROLLBACK',
'MERGE',
'CALL',
'EXPLAIN',
'LOCK',
'GRANT',
'REVOKE',
'SAVEPOINT',
'TRANSACTION',
'SET',
);
// Convert array to pipe-seperated string
// strings are appended and prepended with \b
$disAllow = implode('|',
array_map(function ($value) {
return '\b' . $value . '\b';
}
), $disAllow);
// Check if no other harmfull statements exist
if (preg_match('/('.$disAllow.')/gai', $query) == 0) {
// Execute query
}
}
注意:您可以在执行此检查之前添加一些 PHP 代码来过滤评论
结论
您想要做的事情很有可能发生,但是您永远无法 100% 保证它是安全的。与其让用户进行查询,不如使用 API 向您的用户提供数据。
关于php - 如何允许 SELECT 查询并阻止其他查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30095828/