Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中检查查询字符串是否为SELECT或其他类型_Php_Mysql_Sql_Regex_Laravel - Fatal编程技术网

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

在PHP中检查查询字符串是否为SELECT或其他类型,php,mysql,sql,regex,laravel,Php,Mysql,Sql,Regex,Laravel,我有一个页面,管理员在其中输入他们自己的自定义查询,只是为了额外的安全措施,我想禁止使用除“选择”查询以外的任何查询 如何检查查询是选择还是删除/更新/插入,包括检测技巧,如选择进入 我使用的是Laravel框架,它具有以下功能 DB::select($query); 但不幸的是,它没有检查它是select语句还是其他语句。尝试以下操作: if (stripos($query, "select") !== false && stripos($query, "from") !==

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

如何检查查询是选择还是删除/更新/插入,包括检测技巧,如选择进入

我使用的是Laravel框架,它具有以下功能

DB::select($query);
但不幸的是,它没有检查它是select语句还是其他语句。

尝试以下操作:

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

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

这不是正确的方法,但这将实现以下目的:

<?php

$qry="SELECT * FROM table";

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

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

不是正确的方法,但这将实现以下功能:

<?php

$qry="SELECT * FROM table";

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

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

我认为最安全的做法是为此使用特殊的DB用户,并以某种方式设置用户权限,即用户只能选择而不能修改DB,如果这也是您的一个选项,则会更安全。

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

以下是我关于如何检测SQL语句是否确实是SELECT语句的建议(请注意,使用了PHP7的类型提示):


希望它能帮助别人。

以下是我的建议,关于如何检测SQL语句是否确实是SELECT语句(请注意,使用了PHP7的类型暗示):



希望它能帮助别人。

到目前为止你都做了些什么?我希望看到您的基本工作,以便为您提供进一步的建议。您应该使用不允许的单词(如Delete、Update、Insert)创建一个数组,然后在foreach循环中检查您的查询以查找这些单词。如果它包含其中一个,则为die()@FakhruddinUjjainwala我还没有决定哪条路是最好的,如果没有其他方法,我只会添加“阻止的关键字”检查这个你到现在都做了什么?我希望看到您的基本工作,以便为您提供进一步的建议。您应该使用不允许的单词(如Delete、Update、Insert)创建一个数组,然后在foreach循环中检查您的查询以查找这些单词。如果它包含其中一个,则为die()@FakhruddinUjjainwala我还没有决定哪种方式是最好的,如果没有其他方式,我只会添加“阻止关键字”检查这是一个好主意,但对我的情况来说并不实用-让每个人创建另一个数据库用户会很麻烦我实际上并不意味着每个人都应该有另一个用户。仅在PHP代码中,为DB连接使用不同的SQL用户。前端的用户将看不到任何差异。为了这个目的,你只需要设置一个只读用户。这是我的理解,但我的意思是该软件将在不同的服务器上进行多个安装。这是个好主意,但对我来说并不实用。让每个人创建另一个数据库用户会很麻烦。实际上,我并不是说每个人都应该有另一个用户。仅在PHP代码中,为DB连接使用不同的SQL用户。前端的用户将看不到任何差异。为此,您只需设置一个只读用户。这是我的理解,但我的意思是软件将有多个安装,在不同的服务器上。您的检查可能很容易通过,例如,一些带有内部select的更新查询。例如,您的检查可能很容易通过,某些更新查询带有内部select。如果出于某种原因,查询以括号开头,则此操作将失败。您可能会在第一个位置出现类似“(”或“(选择)”的内容。@DanielM正如我清楚地说的,这只是一个技巧而不是解决方案!如果您为“(选择)”而烦恼的话然后你可以用stru_replace替换它。如果你没有合适的解决方案或理由,你不能直接否决答案。如果你想改进答案,你可以更新答案。我的最后一个目标是在这里开始讨论,但你的答案并没有提供有效的解决方案。任何试图利用它的人都可能很容易陷入麻烦。在ot上她的改进“技巧”非常简单:只需“修剪”查询以避免开始空格和括号。如果出于某种原因,查询以括号开始,则此操作将失败。您可能会得到类似“(”或“(选择)”的结果在第一个位置。@DanielM,正如我清楚地说的,这只是一个技巧而不是解决方案!如果你费心去做“(选择”然后你可以用stru_replace替换它。如果你没有合适的解决方案或理由,你不能直接否决答案。如果你想改进答案,你可以更新答案。我的最后一个目标是在这里开始讨论,但你的答案并没有提供有效的解决方案。任何试图利用它的人都可能很容易陷入麻烦。在ot上她的手,改进“技巧”非常简单:简单地“修剪”查询以避免开始空格和括号。请记住,这是检查忽略注释是mysql查询,如:/*comment*/SELECT id,来自desdf的问题,其中col1=2限制1修剪sql注释只需添加:$stmt=preg\u replace('@-[^\r\n]*)(\\\\\\\\[^\r\n]*)|(/*[\w\w]*?(?=*/)*/@ms',''$stmt);在函数体代码之前。请记住,这是检查忽略注释是mysql查询,如:/*comment*/SELECT id,来自desdf的问题,其中col1=2限制1修剪sql注释,只需添加:$stmt=preg\u replace('@(--[^\r\n]*));(\\\\\\\\\\[^\r\n]*))\.*(/*[\w\w]*?=*/)/@ms','$stmt);在func主体代码之前。