当前位置: 首页 > 面试题库 >

为什么此MySQLI Prepared语句允许SQL注入?

李星波
2023-03-14
问题内容

今天,当我在教学生如何防止SQL注入时,我有些尴尬。在专业项目中,我已经使用准备好的语句/参数化查询作为防止SQL注入的一层(尽管我从未专业地使用过mySQL)。从理论上讲,我认为使用准备好的语句时不可能进行SQL注入。

但是后来这起作用了…

$Search = $_GET['s'];
$stmt = $mysqli->prepare("SELECT * FROM products WHERE id = ?");
$stmt->bind_param("i", $Search);
$stmt->execute();
$Results = $stmt->get_result();

如果我传递参数“?s = 1 OR 1 = 1”,那么我可以获得所有产品的完整清单。我仍然无法在末尾插入另一个查询,但是我对为什么在mysql /
php中可以使用这种类型的基本SQL注入感到困惑。我假设参数“ 1 OR 1 = 1”将被拒绝,因为它不是数字的(显然,我可以运行该数字检查…)。

任何人都可以解释为什么这行得通,以及我对php / mysql中的预备语句不了解的地方吗?

我的学校计算机开箱即用地安装了Zend WAMP。

编辑:这是引起我困惑的字符串值:

$Search = "1 OR 1=1";

问题答案:

没关系,这里没有任何类型的SQL注入,您看不到所有产品的列表(至少您提供的代码无法显示它)

您不需要强制转换为int,让我们更深入地了解bind_param的实际作用:

它具有字符串“ i”,表示1个integer参数

您正在从$ _GET传递值,即 string

bind_param尝试将String转换为int,因此请检查以下php代码:

echo intval('a', 10); // output 0
echo intval('1a', 10); // output 1
echo intval('12a', 10); // output 12
echo intval('b1', 10); // output 0
echo intval('1 or 1=1', 10); // output 1
echo intval("?s=1 OR 1=1", 10); // output 0

因此,您输出id = 1的产品,也许您有一些?



 类似资料:
  • 问题内容: 好的,我有一个非常简单的mysql数据库,但是当我尝试通过mysql-admin运行此查询时,出现奇怪的错误 INSERT INTO自定义报告(研究,类型,模式,选择,描述)VALUES(‘1’,‘2’,‘3’,‘4’,‘5’); 错误: 1064-您的SQL语法有误;检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以便在“选择,描述” VALUES(“ 1”,“ 2”,“

  • 问题内容: 我在看注释: 我对最后一部分感到困惑: 我不确定它是如何工作的,也不知道如何使用它。据我了解,Java 8下的任何内容都不允许在同一元素上重复注释。 有人可以澄清吗? 问题答案: 之所以存在NotEmpty.List,是为了避免无法对同一元素重复相同的注释。借助于NotEmpty.List,可以将多个NotEmpty批注有效地应用于一个元素。注释处理通过NotEmpty注释列表(即No

  • 我在系统的分号后面加了一个分号。出来打印ln: 这对Java编译器来说是合法的,所以我检查了其他语句,它们也都是合法的。所以当我搜索并找到这些链接时: > 为什么Java在语句末尾不显示双分号错误? 当我用两个分号结束一行时,编译器并没有抱怨。为什么? 什么时候在方法结束括号后面加上分号? 为什么使用连续分号的代码会编译? “if”语句末尾的分号 我开始明白一个额外的分号意味着一个额外的空语句。

  • 问题内容: 此SQL查询是由SQL Server Managment Studio生成的,它引发了一个错误: 错误是:指向但我觉得这行没问题。 有什么事吗 编辑: 我只是注释掉 现在可以了,为什么呢? 编辑2: 我将其范围缩小到: 我在这里想念什么吗? 问题答案: 我认为这取决于SQL Server数据库版本。 我尝试对SQL Server 2000数据库使用SSMS 2005进行查询,但由于您描

  • 我们有一个员工姓名表,其中列有ID、name、salary 查询1不起作用,但查询2起作用。从我的开发经验来看,我觉得对此可能的解释是: sum()处理参数中指定的一组值。这里传递了'salary'列,因此它必须将此列的所有值相加。但是在where子句中,记录是一个接一个地检查的,就像第一条记录1是为了测试而检查的,等等。因此,不会计算sum(工资),因为它需要访问所有列的值,然后只有它返回一个值

  • 本文向大家介绍允许远程用户访问mysql服务sql语句,包括了允许远程用户访问mysql服务sql语句的使用技巧和注意事项,需要的朋友参考一下 mysql> grant all privileges on cakephp.* to cakephp@192.168.14.1 identified by 'lpfukia'; Query OK, 0 rows affected (0.01 sec) m