【问题标题】:Check if query string is SELECT or other type in PHP检查查询字符串是 SELECT 还是 PHP 中的其他类型
【发布时间】:2016-02-24 10:21:12
【问题描述】:

我有一个页面,管理员可以在其中输入他们自己的自定义查询,只是为了采取额外的安全措施,我想禁止使用“SELECT”查询以外的任何查询。

我将如何检查查询是 SELECT 还是 DELETE/UPDATE/INSERT ... ,包括检测 SELECT INTO 之类的技巧。

我用的是Laravel框架,有这个功能

DB::select($query);

但不幸的是,它不会检查它是否是 select 语句或其他内容。

【问题讨论】:

  • 你到现在都做了什么?我想看看你的基本工作,以便进一步建议你。
  • 您应该使用删除、更新、插入等不允许的单词创建一个数组,然后在 foreach 循环中检查您对这些单词的查询。如果它包含其中之一,die();
  • @FakhruddinUjjainwala 我还没有决定哪种方式最好,如果没有其他方式我只会添加“被阻止的关键字”
  • 查看link

标签: php mysql sql regex laravel


【解决方案1】:

这是我关于如何检测 SQL 语句是否确实是 SELECT 语句的建议(注意使用了 PHP 7 的类型提示):

function isSelect(string $stmt): bool {

    // Default trim()'s mask plus left parentheses
    $_TRIM_MASK_WITH_PAREN = "( \t\n\r\0\x0B";

    return 'SELECT' === strtoupper(
        substr(
            ltrim($stmt, $_TRIM_MASK_WITH_PAREN), 0, 6
        )
    );
}

希望对某人有所帮助。

【讨论】:

  • 请记住,检查忽略 cmets 是 mysql 查询,例如:/* comment */ SELECT id, question FROM desdf WHERE col1 = 2 LIMIT 1
  • 要修剪 sql 注释只需添加: $stmt = preg_replace('@(--[^\r\n]*)|(\#[^\r\n]*)|(/ *[\w\W]*?(?=*/)*/)@ms', '', $stmt );在 func 正文代码之前。
【解决方案2】:

我认为为此使用特殊的 DB 用户是最安全的,并以某种方式设置用户权限,即他只能执行 SELECT 而不能修改 DB,如果这也是您的选择,它会更安全。

【讨论】:

  • 这是一个好主意,但对我的情况来说并不实用 - 让每个人都创建另一个数据库用户会很麻烦
  • 我实际上并不是说每个人都应该有另一个用户。只需在您的 PHP 代码中,为您的数据库连接使用不同的 SQL 用户。前端的用户不会看到任何差异。为此,您只需设置 1 个只读用户
  • 嗯,这就是我所理解的,但我的意思是该软件将在不同的服务器上进行多次安装
【解决方案3】:

试试这个:

if (stripos($query, "select") !== false && stripos($query, "from") !== false) {
   DB::select($query);
}

【讨论】:

  • 您的检查可能很容易通过,例如,一些带有内部选择的更新查询。
【解决方案4】:

不是正确的方法,但这样可以解决问题:

<?php

$qry="SELECT * FROM table";

$qry_array=explode(" ",$qry);

echo "Type of query :".$qry_array[0]; //SELECT, INSERT, UPDATE or DELETE

【讨论】:

  • 如果由于某种原因查询以括号开头,这将失败。您最终可能会在第一个位置出现“(”或“(SELECT”)。
  • @DanielM 正如我清楚地说的,这只是一个技巧而不是解决方案!如果你担心“(SELECT”,那么你可以使用 str_replace 替换它..
  • 如果您没有适当的解决方案或理由,您不能只投反对票。如果您想改进答案,可以更新答案。
  • 我的最后一个目标是在这里开始讨论,但您的回答没有提供有效的解决方案。任何试图利用它的人都可能很容易陷入困境。另一方面,改进“技巧”非常简单:只需“修剪”查询以避免开始空格和括号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-07
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-21
  • 2014-12-20
相关资源
最近更新 更多