只有在提交表单时才会发生SQL注入? [关闭]

问题描述 投票:-4回答:3

我很担心sql注入$ _GET或其他实例,它可能会发生像我不知道的事情?

php sql
3个回答
0
投票

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

考虑您是否有以下用户页面:/ user / {userid}

有人请求:/ user / 1; DROP TABLE用户;

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

SELECT * FROM users WHERE id=$userId

...那个查询现在是:

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

所以你可以看出为什么这可能是一个问题。


-1
投票

Sorak已经回答了你的问题,但要提供更多细节..

当使用用户提供的数据形成应用程序中的SQL查询而没有正确的清理时,SQL注入漏洞是可利用的。它可以通过多种方式完成。

如果在执行SQL查询之前未正确完成数据验证,则不仅在Web应用程序中,而且后端API也容易受到攻击,因为api使用者可以注入恶意查询来接管服务器/破坏数据/转储整个表或如果可能,甚至DB。

对于前者Facebook API必须每天处理1000个第三方应用程序/移动应用程序。让我们假设如果API容易受到这种攻击,那么这些API消费者中的任何一个都可以利用它来根据注入的严重程度获得对app服务器/数据的一些控制。


-1
投票

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

考虑我们有数据库表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>');

现在,如果普通用户请求公司在1970年创建,如http://localhost/companies.php?year=1970,那么我们得到公司列表:

array(2) {
  [0]=>
  array(2) {
    ["NAME"]=>
    string(17) "Cheap Prices, LLC"
    ["ESTABLISHED"]=>
    int(1970)
  }
  [1]=>
  array(2) {
    ["NAME"]=>
    string(13) "TotalFun Inc."
    ["ESTABLISHED"]=>
    int(1970)
  }
}

但是,如果某些恶意用户希望获得员工薪水而不是公司列表呢?然后,他/她可以通过提交此类URL http://localhost/companies.php?year=0%20union%20select%20name,%20salary%20from%20worker并获取工作人员工资列表来使用SQL注入:

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服务器

© www.soinside.com 2019 - 2024. All rights reserved.