Php 只有当有表单要提交时才会发生SQL注入?
我对sql注入感到困惑,$\u GET或其他类似于我不知道的情况的实例如何?。只要用户提交了数据,并将其集成到查询中并传递到服务器而不进行检查,sql注入就会发生。使用GET参数也很容易发生这种情况 考虑是否在:/user/{userid}处有用户页面 某人请求:/user/1;删除表用户 如果您正在构建这样的查询: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
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请求中
例如,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>');
然而,如果一些恶意用户希望获得员工工资而不是公司列表,该怎么办?然后他/她可以通过提交这样的URLhttp://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)
}
}