检查查询字符串是否为SELECT或PHP中的其他类型

时间:2016-02-24 10:21:12

标签: php mysql sql regex laravel

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

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

我使用Laravel框架,它具有

功能
DB::select($query);

但不幸的是,它不会检查它是否是一个选择语句或其他内容。

4 个答案:

答案 0 :(得分:2)

我认为最安全的是使用一个特殊的数据库用户,并以某种方式设置用户,他只能做SELECT而不修改数据库,如果这也是你的选择,它会更安全。

答案 1 :(得分:2)

以下是关于如何检测SQ​​L语句是否确实是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
        )
    );
}

希望它有所帮助。

答案 2 :(得分:0)

试试这个:

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

答案 3 :(得分:0)

不是正确的方法,但这会做的伎俩:

<?php

$qry="SELECT * FROM table";

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

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