Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.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_Sql - Fatal编程技术网

Php 只有当有表单要提交时才会发生SQL注入?

Php 只有当有表单要提交时才会发生SQL注入?,php,sql,Php,Sql,我对sql注入感到困惑,$\u GET或其他类似于我不知道的情况的实例如何?。只要用户提交了数据,并将其集成到查询中并传递到服务器而不进行检查,sql注入就会发生。使用GET参数也很容易发生这种情况 考虑是否在:/user/{userid}处有用户页面 某人请求:/user/1;删除表用户 如果您正在构建这样的查询: SELECT * FROM users WHERE id=$userId 。。。现在的问题是: SELECT * FROM users WHERE id=1;DROP TABLE

我对sql注入感到困惑,$\u GET或其他类似于我不知道的情况的实例如何?。

只要用户提交了数据,并将其集成到查询中并传递到服务器而不进行检查,sql注入就会发生。使用GET参数也很容易发生这种情况

考虑是否在:/user/{userid}处有用户页面

某人请求:/user/1;删除表用户

如果您正在构建这样的查询:

SELECT * FROM users WHERE id=$userId
。。。现在的问题是:

SELECT * FROM users WHERE id=1;DROP TABLE users;

因此,您可以了解这可能是一个问题的原因。

Sorak已经回答了您的问题,但要提供更多详细信息

如果应用程序中的SQL查询是使用用户提供的数据形成的,而没有进行适当的清理,则可以利用SQL注入漏洞进行攻击。这可以通过多种方式实现 例如

  • 带有
    POST
    请求的表单
  • 或带有URL参数()的博客文章/动态网页(GET请求)
  • 或具有路径参数的RESTful资源()
  • 甚至在提交给API或应用程序的JSON/XML请求中
如果在执行SQL查询之前未正确执行数据验证,不仅在web应用程序中,而且在后端api中,都容易受到此攻击,因为api使用者可以注入恶意查询以接管服务器/损坏数据/转储整个表,甚至在可能的情况下转储数据库


例如,Facebook API每天必须处理1000个第三方应用程序/移动应用程序。假设API易受此攻击,那么这些API使用者中的任何一个都可以利用此攻击,根据注入的严重性获得对应用程序服务器/数据的某种控制

SQL注入可以发生在用户可以控制发送到数据库引擎的SQL查询参数的任何地方。这包括获取/发布等

假设我们有一个数据库表COMPANY,其中保存的是公司数据,另一个是保存员工工资的WORKER表。我们想建立一个网页,从数据库中提取公司名单建立在一个由用户在URL提供的日期

我们的守则是:

<?php

class RamDb extends SQLite3
{
    function __construct()
    {
        $this->open(':memory:');
    }
}

$db = new RamDb();

// table mockup
$db->exec("CREATE TABLE COMPANY(
                       NAME STRING,
                       ESTABLISHED INT
                              )
          ");
$db->exec("CREATE TABLE WORKER(
                       NAME STRING,
                       SALARY INT
                              )
          ");

$db->exec("insert into company(name, established) 
           select 'TotalFun Inc.', 1970 
           union 
           select 'Cheap Prices, LLC', 1970
           ");

$db->exec("insert into worker(name, salary) 
           select 'Tadeus Mackevic', 120000
           union 
           select 'Sandra Lipkovic', 230000
           ");

$sql = "SELECT * FROM company WHERE ESTABLISHED = {$_GET['year']}";

$result = $db->query($sql);

$data = [];
while($row = $result->fetchArray(SQLITE3_ASSOC)) {
    $data[] = $row;
}

var_dump('<xmp>',$data, '</xmp>');
然而,如果一些恶意用户希望获得员工工资而不是公司列表,该怎么办?然后他/她可以通过提交这样的URL
http://localhost/companies.php?year=0%20union%20select%20name,%20salary%20来自%20worker
并获取员工工资列表:

array(2) {
  [0]=>
  array(2) {
    ["NAME"]=>
    string(15) "Sandra Lipkovic"
    ["ESTABLISHED"]=>
    int(230000)
  }
  [1]=>
  array(2) {
    ["NAME"]=>
    string(15) "Tadeus Mackevic"
    ["ESTABLISHED"]=>
    int(120000)
  }
}

一般来说,SQL注入意味着将SQL语句和字段值一起提交到web服务器

您能解释一下为什么您认为它只能在表单提交时发生吗?对于像我这样的乞丐,我认为它发生在用户输入或填充将存储在数据库中的内容时,如果您没有对其进行清理,然后,数据将损坏您的数据库。基本上,如果涉及某种用户输入,SQL注入总是有可能的。关键字“用户输入”。@Yupik灾难关键字您的上一个示例不起作用,因为“where id=;”不是有效的SQL表达式,只需要了解要点即可。这是一个重要的概念,不是黑客课程。是的,当然,但op似乎不是一个非常熟悉SQL注入的人,因此最好给出一个工作示例,这样他就可以自己尝试了。不管怎样,你已经编辑了它,所以它很好:)没关系,我理解逻辑。在某种程度上,是的,但你永远不应该相信用户的输入。始终查看预期的数据类型并确保其正确。在本例中,您希望使用整数,因此如果您仅将$userId强制转换为int,则它将保护您,并使用(int)或intval()请在此处注释为什么此答案被否决。
array(2) {
  [0]=>
  array(2) {
    ["NAME"]=>
    string(15) "Sandra Lipkovic"
    ["ESTABLISHED"]=>
    int(230000)
  }
  [1]=>
  array(2) {
    ["NAME"]=>
    string(15) "Tadeus Mackevic"
    ["ESTABLISHED"]=>
    int(120000)
  }
}