Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.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 mySQL语句的第一个字不能被删除或更新吗_Php_Mysql - Fatal编程技术网

Php mySQL语句的第一个字不能被删除或更新吗

Php mySQL语句的第一个字不能被删除或更新吗,php,mysql,Php,Mysql,我目前正在编写一个查询数据库的页面,而不是使用命令行(这只是为了练习PHP如何与整个数据库交互) 现在,我试图限制删除或更新数据,即不使用DELETE、DROP或UPDATE语句。修剪完所有空格(包括\r和\s等)后,仅扫描第一个单词就足以确定它是什么类型的查询了吗?换句话说,是否可以编写删除、删除或更新查询,而不将它们作为修剪空格后的第一个单词 我目前正在使用mysqli_查询,因此不可能进行多个查询 编辑1:添加相关代码@Tim $queryCheck = strtolower($query

我目前正在编写一个查询数据库的页面,而不是使用命令行(这只是为了练习PHP如何与整个数据库交互)

现在,我试图限制删除或更新数据,即不使用DELETE、DROP或UPDATE语句。修剪完所有空格(包括\r和\s等)后,仅扫描第一个单词就足以确定它是什么类型的查询了吗?换句话说,是否可以编写删除、删除或更新查询,而不将它们作为修剪空格后的第一个单词

我目前正在使用mysqli_查询,因此不可能进行多个查询

编辑1:添加相关代码@Tim

$queryCheck = strtolower($query);
$queryCheck = preg_replace("/\s+/", "", $queryCheck);

if ( strpos($queryCheck, "deletefrom") === 0 ) {...}
else if ( strpos($queryCheck, "update") === 0) {...}
else if ( strpos($queryCheck, "create") === 0) {...}
else if ( strpos($queryCheck, "drop") === 0) {...}

虽然将用户输入作为代码进行评估从来都不是一个好主意,但如果您需要,我想不出一个可以用来更改数据的查询

  • 将所有空格(包括换行符)转换为单个空格
  • 检查第一个单词,查看它是否是
    UPDATE
    DELETE
    DROP
    ALTER
    TRUNCATE
    或任何其他可用于以某种方式更改数据或表本身的关键字
  • 但是,请注意如下所示的查询:

    --SELECT * FROM `table`
    DROP table `table`
    
    如果不剥离换行符,将执行此查询,因为尽管它不是以
    DROP
    开头,而且似乎是多个查询,但第一行被注释掉了


    查看您的代码后,我将添加以下
    if
    语句:

    if ( substr($queryCheck, 0, 6) != "select" && substr($queryCheck, 0, 6) != "insert" && substr($queryCheck, 0, 4) != "show" ) {
      die("You can only execute select, insert, or show queries!");
    }
    

    这将检查第一个单词是
    选择
    插入
    ,还是
    显示
    。如果不是,脚本将停止执行。它也更安全一点,因为它不是将所有MySQL查询都列为白名单,然后将一些查询放在黑名单上,而是从黑名单上的所有函数开始,然后将一些函数放在白名单上。

    如果只是为了在测试时确保数据库的安全,我会限制用户在该数据库上的选择权限。不确定是否有其他方法可以偷偷进入一个变化的查询。哦,这也是一个解决方案!由于我是唯一一个提出疑问的人,那么不必更改权限就可以了吗?没有任何脚本会像@PhilippGrassl所说的那样安全。在主题上,
    mysqli\u query
    可以一次处理一个查询,因此它应该以语句关键字开头,例如
    DELETE
    SELECT
    。检查第一个单词不会阻止某人进行sql注入。如中所示,
    SELECT*FROM-users,其中name='a';删除表用户
    @ourmandave
    mysqli\u query
    无法处理多查询
    mysqli\u multi\u query
    必须用于它。注意mysql有一个PREPARE语句来准备语句。我认为您可以发送这样一个PREPARE-to-PREPARE,然后执行DELETE语句,DELETE-then不是第一个单词!看你是对的,我知道这和菲利普的建议相比真的不是个好主意。但是能够签入代码比在mysql中创建具有不同授权的多个用户更通用。strtolower只是为了确保用户不能输入类似“DroP table”的内容。另外,
    $query
    是实际的查询,
    $queryCheck
    仅用于检查。酷,您的版本绝对没有那么多代码。我还想使用SHOW,所以我将把它添加到列表中。谢谢@Tim!:)