gpt4 book ai didi

mysql - 为什么 MySQL 允许 SELECT 查询中的非精确匹配?

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

这是故事。我正在测试对使用 MySQL 数据库作为数据主要存储的 Laravel(PHP 框架)应用程序进行一些安全测试(使用 zaproxy)。

Zaproxy 正在报告可能对具有以下有效负载的 POST 请求 URL 进行 SQL 注入(inject):

id[]=3-2&enabled[]=on

基本上,这是一个 AJAX 请求,用于打开/关闭列表中的特定功能。 Zaproxy 正在对请求进行模糊测试:id 值为 3-2 时,应该有一个整数 - 要更新的项目的 id

问题是这个请求是有效的。它应该会失败,但代码实际上正在更新 id = 3 的项目。

我按照我应该的方式做事:使用 Eloquent 的 Model::find($id) 方法检索模型,传入 id来自请求的值(经过一些调查,确定为字符串“3-2”)。据我所知,Eloquent 库应该通过将 ID 值绑定(bind)到参数来执行查询。

我尝试使用 Laravel 的 DB 类执行查询,代码如下:

$result = DB::select("SELECT * FROM table WHERE id=?;", array("3-2"));

并得到 id = 3 的行。

然后我尝试对我的 MySQL 数据库执行以下查询:

SELECT * FROM table WHERE id='3-2';

并且它确实检索了 id = 3 的行。我还尝试了另一个值:“3abc”。看起来任何以数字为前缀的值都会检索一行。

所以最终,这似乎是 MySQL 的问题。就我而言,如果我要求一行 id = '3-2' 并且没有具有该确切 ID 值的行,那么我希望它返回一个空集结果。

我有两个问题:

  1. 有没有办法改变这种行为?好像是数据库服务器级别的,那么数据库服务器配置有没有什么可以防止这种事情发生的呢?

  2. 在我看来,这是一个严重的安全问题。 Zaproxy 能够注入(inject)一些任意值并对我的数据库进行更改。不可否认,这对我的应用程序来说是一个相当小的问题,并且(可能)唯一可行的值将是带有数字前缀的值,但仍然...

最佳答案

SELECT * FROM table WHERE id= ? AND ? REGEXP "^[0-9]$";

这将比我在上面的评论中建议的更快。编辑:啊,我知道你不能改变查询。然后确认,您必须清理代码中的输入。另一个非常糟糕和肮脏选项,如果您处于无法更改查询但可以更改数据库的奇怪情况,则将 id 字段更改为 [VAR]字符。

关于mysql - 为什么 MySQL 允许 SELECT 查询中的非精确匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30062587/

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