gpt4 book ai didi

php - mySQL 语句的第一个词不能是 DELETE 或 UPDATE

转载 作者:可可西里 更新时间:2023-11-01 08:29:01 25 4
gpt4 key购买 nike

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

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

我目前正在使用 mysqli_query,因此无法执行多个查询。

编辑 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) {...}

最佳答案

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

  1. 将所有空格(包括换行符)转换为单个空格。
  2. 检查第一个单词是否为UPDATEDELETEDROPALTER 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!");
}

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

关于php - mySQL 语句的第一个词不能是 DELETE 或 UPDATE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32171930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com