Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.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 如何注入此sql查询?_Php_Mysql_Sql Injection - Fatal编程技术网

Php 如何注入此sql查询?

Php 如何注入此sql查询?,php,mysql,sql-injection,Php,Mysql,Sql Injection,我有一个php代码,从get请求中获取页码,然后运行sql查询,根据页码从数据库中选择记录 $maxPerPage = 20; $page = $_GET["p"]; $applicants = DB::query('SELECT * FROM registrees ORDER BY id DESC LIMIT '.$page*$maxPerPage.','.$maxPerPage); 我的问题是有人能在这段代码中注入SQL查询吗?如果可能的话,我需要可以在这里运行的sql注入示例。在本

我有一个php代码,从get请求中获取页码,然后运行sql查询,根据页码从数据库中选择记录

$maxPerPage = 20;

$page = $_GET["p"];

$applicants = DB::query('SELECT * FROM registrees ORDER BY id DESC LIMIT 
'.$page*$maxPerPage.','.$maxPerPage);

我的问题是有人能在这段代码中注入SQL查询吗?如果可能的话,我需要可以在这里运行的sql注入示例。

在本例中,您是通过PHP而不是sql保存的

解释
注意事项:遇到格式不正确的数值
注意事项。PHP7.1引入了更严格的 关于在算术表达式中使用字符串的规则

表达式
$page*$maxPerPage
是一个算术表达式,但您试图将字符串
$page
乘以整数。这引起了注意

您可以通过不启用
错误报告(E\u通知)来忽略通知
或通过使用
@
运算符抑制通知:

@$numberOfApples = "10 apples" + "5 apples";
无论是否抑制通知,该值都将转换为数字,忽略数字后的额外文本。这发生在乘法的结果被插值到SQL字符串之前,因此它被保证为整数,因此它不受SQL注入的影响

另一种解决方法是在从
$\u GET
超全局获取时强制将
$page
设置为整数:

$page = (int) $_GET["p"];
一旦你这样做了,你就可以在乘法中使用它,而不会引起注意。但通过将其转换为整数,您已经过滤掉了任何可能导致SQL注入的内容

因此,上面的注释无法提供SQL注入攻击的示例,因为在这个示例中没有任何可能的攻击

但是使用查询参数而不是串接字符串仍然是一个好习惯。原因是,如果使用不同的方法,则需要程序员深入了解表达式在每种情况下的计算方式。如果他们看到像您这样的字符串连接表达式,他们当然会注意到它是一个潜在的SQL注入漏洞,并且需要一些时间来分析它,直到他们理解它是安全的

您希望使您的代码易于后续人员维护。这意味着要明确一致。毫无疑问,在某些情况下,您必须使用查询参数,因为您插入的是字符串,而不是算术表达式的结果。任何阅读您的代码的程序员都会想,“为什么只在某些时候使用查询参数?”


因此,我同意其他意见,即您应该使用查询参数,而不是字符串连接,即使您知道由于PHP表达式的某些细微差别,它在特定情况下是安全的。

使用mysqli\u real\u escape\u string($connection,$\u GET[“p”]);确保输入的安全

是的。。。只需将适当的字符串添加到GET p参数。。。0;从表格名称中删除;你所说的正确字符串是什么意思?@xTrimy我认为在这里注入一些东西会很困难,但是,你甚至想冒险吗?为什么不像您应该的那样正确地编码,并以正常的方式防止sql注入呢;从登记处删除--通常在注入时,您希望在注入的SQL之后添加一个
--
,以向服务器指示在注入的代码之后的任何内容都应被视为注释。我假设您遇到错误“遇到格式不正确的数值”,因为
maxPerPage
$page
注入后附加了一些额外的代码。@jnevil这不起作用
$page
在成为查询字符串的一部分之前乘以20。将数字以外的任何东西乘以20将得到零。如果它是一个数字,结果将是一个数字,并且没有任何内容被“注入”。仅供参考,mysqli\u real\u escape\u字符串不会保护输入