SQL INJECTION和两个查询

时间:2010-01-26 15:09:46

标签: sql-injection

所以,我读了一篇关于SQL注入的文章,并且有一个例子:

SELECT * FROM table_name WHERE smth = 'x'; 
UPDATE table_name SET smth ='smth@email.addr' WHERE user = 'admin';

为什么它不起作用?或者这是一篇旧文章,现在这种方式是无稽之谈?那么黑客如何更新mysql呢? 感谢。

5 个答案:

答案 0 :(得分:2)

现在大多数网站都在使用参数化SQL - 而不是内联SQL。例如,如果有解析的内联SQL,则会出现上述情况,类似于以下内容:

非参数化伪

string sql = "SELECT * FROM table_name WHERE smth='" + UserInput + "'";
ExecuteSql(sql);

... UserInput定义网站上的元素。

您可以添加

,而不是将有效数据添加到UserInput字段
UserInput = '';DROP table_name;

...您实际上会在查询结束时添加新逻辑,导致恶意使用系统。

参数化语句消除了SQL注入的可能性,因为您无法通过在签名中插入逻辑来修改查询结构。

如果您尝试将UserInput字段设置为恶意查询,但该网站在语句中使用了参数,那么您将失去运气。

参数化伪:

Adapter proc;
proc.StoredProcedure = "GetUserNames"
proc.AddParameter("@USER",UserInput);
proc.Execute();

...因为@USER现在等于文字“'\; DROP table_name;”,SQL将其视为常规的ol'参数。

答案 1 :(得分:0)

这取决于你如何执行上面的代码。

许多代码语言都有专门的数据库通信类,您可以使用sql参数而不是连接字符串来提供这些类。

SQL注入的风险是忘记在查询中转义某些用户输入,从而允许执行格式错误的查询。

答案 2 :(得分:0)

SQL注入攻击背后的想法是:

我有一个网站,让用户搜索有关动物的信息。用户输入动物名称,然后运行:

select * from animals where name = '$[what the user typed in]';

因此,如果他们输入了羊,则查询变为:

select * from animals where name = 'sheep';

然而,如果他们输入:`sheep';放桌子动物'?如果我只是将他们输入的内容复制到查询中并运行它,我将运行:

select * from animals where name = 'sheep'; drop table animals;

这会很糟糕。

如果设置网站和数据库的人不小心查找并清理用户输入的任何SQL,则仍会发生此类攻击。

答案 3 :(得分:0)

DB 101热烈地警告SQL注入,所以现在大多数开发人员都知道它并阻止它。这通常通过使用某种预准备语句来完成,其中您的参数是通过阻止执行任意SQL的机制注入的。懒惰的编程仍然可能导致漏洞,当然,它们就在那里,但是盲目的动态SQL构建是罕见而罕见的。

答案 4 :(得分:0)

当您有查询“模板”并且需要用户输入来填写某些查询时,可能会发生SQL注入攻击。例如,您可能有一个PHP脚本,它执行以下操作:

<?php
$smth_value = $_POST["smth"];  // some form field
$smth_user  = $_POST["user"];  // some other form field
$smth_email = $_POST["email"]; // yet another form field

$sql1 = "SELECT * FROM table_name WHERE smth = '".$smth_value."'";  
$sql2 = "UPDATE table_name SET smth ='".$smth_email."' WHERE user = '".$smth_user."'";

mysql_query($sql1);
mysql_query($sql2);    
?>

如果一个人知道我的表的结构(或以某种方式计算出来),他们可以通过将SQL文本放入表单字段中将SQL注入“查询”,从而导致我的SQL变量字符串看起来像两个有效的查询分开用分号。例如,有人可以输入“smth”表单字段,如:

';DELETE FROM table_name WHERE 1=1 OR smth='

然后$ sql1最终看起来像:

SELECT * FROM table_name WHERE smth = '';DELETE FROM table_name WHERE 1=1 OR smth=''

...并且从table_name获取所有数据。

这就是为什么PHP中有函数如mysql_escape_string来帮助保护字符串免受这些攻击。如果您知道某个变量应该是一个数字,请将其强制转换为数字。如果您有文本,请将其包装在字符串转义函数中。这是如何防守的基本思路。