如果从一个SQL query我移除所有的角色,是否有一些其他的方式做到SQL注的攻击的数据库?

怎么可以这样做?任何人都可以得到我的例子吗?

有帮助吗?

解决方案

是的,是有的。摘录 维基百科

"SELECT * FROM data WHERE id = " + a_variable + ";"

清楚的是,从这句话,提交人旨在a_variable要一些相互关联的"id"一领域。然而,如果事实上,它是一串随后的终端用户可操纵的声明,因为他们的选择,从而绕过需要逃脱的人物。例如,设置a_variable到

1;DROP TABLE users

将下降(删除)的"用户",从表中的数据库,由于SQL将呈现如下:

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

SQL注射 一个简单的攻击战斗。我将做非常仔细的研究,如果我是你。

其他提示

是的,根据该声明所使用。你最好保护自己,无论是通过使用储存程序,或者至少参数化的询问。

看看 维基百科 为预防的样品。

是的,这是确定可能的。

如果你有一种形式,你期待一个整数使你的下一个选择的发言,然后你可以进入任何类似的东西:

SELECT*FROM thingy 在attributeID=

  • 5(很好的答案,没问题)
  • 5;DROP table users;(糟糕,糟糕,糟糕的...)

以下网站的细节进一步古典SQL注工艺: SQL注射的小抄.

使用的参数化查询或存储程序是没有任何好转。这些都是预先做出的查询使用过的参数,它可能的来源的注入。它还描述了在这一页面: 攻击存储程序SQL.

现在,如果你剿简单的报价,防止只有一个给定的攻击。但不是所有的人。

一如既往,不信任数据来自外部。过滤它们在这3个等级:

  • 接口水平显而易见的东西(一滴下来选择名单好比一个免费的文字栏)
  • 逻辑水平,用于检查相关的数据的性质(int,string,length)、权限(可以将这种类型的数据可使用这一用户在该网页)...
  • 数据库访问等级(简单逃脱报价...).

有趣的,并不要忘了检查 维基百科 答案。

/调查

我建议你通过变量和参数,而不是建立自己的SQL。否则,就会总是以一种方法来做一个SQL注,在礼貌,我们目前不知道的关闭。

代码你创造那么喜欢的东西:

' Not Tested
var sql = "SELECT * FROM data WHERE id = @id";
var cmd = new SqlCommand(sql, myConnection);
cmd.Parameters.AddWithValue("@id", request.getParameter("id"));

如果你有一个名字就像我有一个'。这是非常讨厌所有的字被删除或标记为无效。

你也可能想看看这个 计算器问题有关SQL注射.

参数化的内联SQL或参数化存储程序是最好的方式来保护自己。正如其他人已经指出的那样,简单地剥/逃跑的单一的报价字是不够的。

你会发现我专门谈论"参数化的"存储程序。简单地使用存储程序是不够的,要么如果你恢复连接的程序是通过参数在一起。换句话说,包完全相同的脆弱SQL statement在一个存储程序并不能使它任何安全。你需要使用的参数,在你的存储的过程,就像你会与联SQL。

还--即使是你做的只是看撇号,你不要删除它。你想要的 逃脱 它。你做的是,通过替换的每一撇与两撇号。

但参数化查询/存储程序是好多了。

由于这一相对较旧的问题,我不会打扰写了一个完整和全面的回答,因为大多数方面,回答已经提到这一海报或另一个。
我找到必要的,但是,带来了另一个问题,是不是碰上任何人在这里-SQL走私。在某些情况下,能够"偷运"的报价符'到您的查询 甚至如果你试图要删除它.事实上,这可能是可能的,即使如果使用适当的命令、参数、存储程序,等等。

检查出完整的研究报告在 http://www.comsecglobal.com/FrameWork/Upload/SQL_Smuggling.pdf (公开的,我是初级研究员在本)或只是谷歌"SQL走私".

...呃约50000000其他的方式

也许财产以后喜欢 5; drop table employees; --

得sql可以是这样的:select * from somewhere where number = 5; drop table employees; -- and sadfsf

(-- 开始一个评论)

是的,绝对是:根据你的SQL dialect和此,有许多方法可以实现注射,不使用撇号。

唯一可靠的防御对SQL注的攻击是使用的参数化SQL发言支持提供的数据库的界面。

而是,试图找出其人物过滤出,我坚持要参数化的查询,而不是和删除的问题。

这取决于你如何放在一起的查询,但在本质上是的。

例如,在Java如果你要这么做(蓄意地令人震惊的例子):

 String query = "SELECT name_ from Customer WHERE ID = " + request.getParameter("id");

然后有一个很好的机会你开自己注射攻击。

Java有一些有用的工具,以防止这些,例如预处理语句(在哪里你通过在一串喜欢"选择name_从客户WHERE ID=?"和JDBC层处理逃脱的同时,替换?令牌你),但其他一些语言不那么有用。

事情是撇号的也许真正的输入和你不得不逃离他们增加一倍,他们当你是使用内联SQL在你的代码。你在找什么是regex模式,如:

\;.*--\

一半的结肠用于过早结束真正的发言中,一些注射SQL随后通过一个双人连字符意见的后SQL从原来的真发言。连字符,也可以省略的攻击。

因此,答案是:没有,只需删除顿号不会保证你的安全离SQL注射。

我只能重复其他人已经说过。参数化SQL是的路要走。当然,这是一个疼痛的屁股编码it-但是一旦你做了一次,然后就不难剪切和粘贴这些代码,使得修改所需要的。我们有很多。网应用程序,允许网站的访客指定一个整体范围内的搜索标准和代码生成的SQL选择声明在飞行中-但是一切都可能已被输入由一个用户进入了一个参数。

当你期待一个数字参数,应该总是可验证的输入,以确保它的数字。超越有助于防止注射,确认步骤将会使程序更加用户友好。

如果你曾经收到id="你好",当你预期id=1044,它的总是更好地返回一个有用的错误用户,而不是让数据库返回一个错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top