php - 如何允许 SELECT 查询并阻止其他查询?

标签 php mysql security

在我们的应用程序中,用户可以以 SQL 语句的形式创建自定义导出函数。像这样的:

SELECT name, age, date_birth FROM users WHERE group_id = 2

我不希望他们通过插入 DELETE 语句来清除整个数据库。 我的想法是:

  • 使用只允许 SELECT 的 SQL 帐户。 (如果有其他选择,我不想这样做。)
  • 使用神奇的正则表达式来检查查询是否危险。 (这样会好吗?已经有这样的正则表达式了吗?)

我们正在使用 PHP PDO。

最佳答案

在我看来,有三个选项可供选择:

选项 1

创建一个工具,在后台为用户创建查询。只需单击按钮并输入表名即可。通过这种方式,您可以在后台捕获所有奇怪的行为,从而使您摆脱不想执行的查询的危险。

选项 2

创建一个只允许执行SELECT 查询的MySQL 用户。我相信您甚至可以决定允许用户从哪些表中进行选择。使用该用户执行用户输入的查询。创建一个单独的用户,该用户具有您希望它执行 UPDATEINSERTDELETE 查询的权限。

选项 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/

相关文章:

php - 无法在 Nginx 上使用 Laravel 在 PhpStorm 中触发 Xdebug 中断

php - 如何在cakephp中获取表单输入的值

python - mysql.connector.connect和connection.cursor的成本

php - 当mysql数据库更改时动态更改网站内容

python - 如何安全存储敏感数据?

c# - 以编程方式确定是否启用了 Windows 8 安全启动

php - 大型商家经销商如何处理付款和支出?

php - 无法在一条语句中执行多个更新查询

security - 使用 cookie 和 java 创建非常安全的登录

php - 在php中更改字体