我很担心sql注入$ _GET或其他实例,它可能会发生像我不知道的事情?
只要您将用户提交的数据集成到查询中并传递给服务器而不检查它,就会发生SQL注入。使用GET参数也很容易发生这种情况。
考虑您是否有以下用户页面:/ user / {userid}
有人请求:/ user / 1; DROP TABLE用户;
如果您正在构建这样的查询:
SELECT * FROM users WHERE id=$userId
...那个查询现在是:
SELECT * FROM users WHERE id=1;DROP TABLE users;
所以你可以看出为什么这可能是一个问题。
Sorak已经回答了你的问题,但要提供更多细节..
当使用用户提供的数据形成应用程序中的SQL查询而没有正确的清理时,SQL注入漏洞是可利用的。它可以通过多种方式完成。
POST
请求的表格如果在执行SQL查询之前未正确完成数据验证,则不仅在Web应用程序中,而且后端API也容易受到攻击,因为api使用者可以注入恶意查询来接管服务器/破坏数据/转储整个表或如果可能,甚至DB。
对于前者Facebook API必须每天处理1000个第三方应用程序/移动应用程序。让我们假设如果API容易受到这种攻击,那么这些API消费者中的任何一个都可以利用它来根据注入的严重程度获得对app服务器/数据的一些控制。
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服务器