Php mySQL语句的第一个字不能被删除或更新吗
我目前正在编写一个查询数据库的页面,而不是使用命令行(这只是为了练习PHP如何与整个数据库交互) 现在,我试图限制删除或更新数据,即不使用DELETE、DROP或UPDATE语句。修剪完所有空格(包括\r和\s等)后,仅扫描第一个单词就足以确定它是什么类型的查询了吗?换句话说,是否可以编写删除、删除或更新查询,而不将它们作为修剪空格后的第一个单词 我目前正在使用mysqli_查询,因此不可能进行多个查询 编辑1:添加相关代码@TimPhp mySQL语句的第一个字不能被删除或更新吗,php,mysql,Php,Mysql,我目前正在编写一个查询数据库的页面,而不是使用命令行(这只是为了练习PHP如何与整个数据库交互) 现在,我试图限制删除或更新数据,即不使用DELETE、DROP或UPDATE语句。修剪完所有空格(包括\r和\s等)后,仅扫描第一个单词就足以确定它是什么类型的查询了吗?换句话说,是否可以编写删除、删除或更新查询,而不将它们作为修剪空格后的第一个单词 我目前正在使用mysqli_查询,因此不可能进行多个查询 编辑1:添加相关代码@Tim $queryCheck = strtolower($query
$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';删除表用户
@ourmandavemysqli\u query
无法处理多查询mysqli\u multi\u query
必须用于它。注意mysql有一个PREPARE语句来准备语句。我认为您可以发送这样一个PREPARE-to-PREPARE,然后执行DELETE语句,DELETE-then不是第一个单词!看你是对的,我知道这和菲利普的建议相比真的不是个好主意。但是能够签入代码比在mysql中创建具有不同授权的多个用户更通用。strtolower只是为了确保用户不能输入类似“DroP table”的内容。另外,$query
是实际的查询,$queryCheck
仅用于检查。酷,您的版本绝对没有那么多代码。我还想使用SHOW,所以我将把它添加到列表中。谢谢@Tim!:)