SQL注入今天有风险吗?

我一直在阅读关于SQL注入攻击以及如何避免这些攻击,虽然我似乎无法让工作中的“可怕”的例子,例如看到这篇文章

我在数据库中创build了一个PHP文件和一个表,并通过$_GET传递了一个值,并试图通过bob'); drop table students; --来删除表bob'); drop table students; -- bob'); drop table students; -- bob'); drop table students; --它没有工作。 PHP会自动转义\'和查询有错误,没有任何伤害。 尝试复制“ AND WHERE 1=1 ”等login“攻击”时出现同样的问题

示例代码:

 <?php $id = $_GET['id']; $sql = "INSERT INTO Users (Username) VALUES ($id)"; echo $sql; mysql_query($sql) or die(mysql_error()); 

我会传递sql.php?id=1); delete from Users; -- sql.php?id=1); delete from Users; --

那么,这是一些过时的东西,曾经适用于PHP3的日子或什么的,现在甚至新手都受到像魔术引号的东西保护?

我在Ubuntu上使用PHP5。

恰恰相反。 魔术引号在PHP5中被弃用,并且在PHP5.4中被完全移除 ,因为它们给编程世界带来的困惑比它们的好。 检查魔术引号是否是主动的,并且在必要的时候严格地逃脱任何SQLinput仍然是非常非常重要的…虽然没有理由感到难过,但是我们都曾经在那里,而我的不知情的屁股已经被无数的魔语次:)

关于魔术引号的PHP手册解释了一切。

不,这还是非常重要的。

和XSS和CSRF一样。 永远不要低估正确input过滤的重要性。

嘿,在这种情况下,通过将magic_quotes_gpc设置为“on”来保存。

你很快就会搞砸了

2007年,利用SQL注入漏洞实现了历史上最大的身份盗窃:请参见“ SQL注入攻击导致Heartland,Hannaford破坏 ”(ComputerWorld,2009年8月18日)。

OWASP 在2007年报告说 ,注入攻击(SQL注入是其中一个例子)仍然是最常见的软件安全问题之一。

您也可以search最近的SQL注入新闻,并find每月报告的许多案例。

然而,XKCD漫画中的例子并不一定是最常见的利用types。 通过在一个请求中执行第二个SQL语句来删除一个表可能不会使攻击者获得有价值的数据,这只会是破坏行为。

此外,一些查询接口默认情况下不允许多查询 。 也就是说,无论分号是多less,数据库客户机API都只执行给定SQLstring的单个语句。 这打破了漫画中显示的例子。

注意: PDO的query()方法默认支持多查询。 所以它容易受到XKCD风格的攻击。

正如其他人所指出的那样,SQL注入的风险越大,就会改变SQLexpression式的逻辑,并将查询应用于除了您所期望的之外的额外行。

例如:

 $sql = "UPDATE Users SET PASSWORD = MD5('" . $_POST["password"] . "'||salt) " . "WHERE user_id = " . $_POST["userid"]; 

当我发送请求参数userid设置为string123 OR userid=456什么? 我会重置我自己的密码(用户ID 123)以及用户ID 456的密码。即使用每个用户的盐密码散列也不能防止这种情况。 现在我可以login到任何一个帐户。

有很多方法可以执行SQL注入。

魔术引号不考虑字符编码,因此容易受到基于多字节字符的攻击。

至于今天风险很大,谷歌的search会出现无数易受攻击的网站。 9月10日左右, Bugzilla报告了一个SQL注入漏洞。所以,网站仍然处于危险之中。 他们应该是吗? 那里的工具是为了防止注射,所以没有。

该特定的攻击不起作用,因为mysql_query将只执行一个语句。

我仍然可以滥用你的代码,例如,如果我安排了id为SELECT password FROM Users WHERE Username='admin'我可能有一个能够让你的系统公开一些内部信息的战斗机会。

基本上,如果你允许未经过滤的input到你的SQL中,将会有一些非常有创意的方法来创build你没有想到的数据,并暴露你不想要的数据!

哦,我的SQL注入不是一个风险,它是一个巨大的安全漏洞 。 它主要存在于php中,因为API使得您想要将任何旧数据插入到您的SQL查询中。

当我看到用PHP或ASP编写的站点时,我可以闻到他们所诟病的SQL注入向量。 人们试图用mysql_real_escape_string()intval()来保护他们的PHP应用程序,并且在其他语言中做类似的工作。 这是个错误。 这就像使用C语言而不是Java或Python进行编码,在前者中,您犯了一个错误,而您已经死了,但在后者中,只有语义缺陷可以存在。

我强烈要求人们使用mysqli与预先准备好的语句,或任何其他参数化 ,将文本代入代码,然后解释它只是不好的做法,恕我直言。

另一个说明,PHP的魔术报价是愚蠢的,谢天谢地,不推荐使用。 它只会造成更多的伤害,而不是好的。 如果您依靠魔术引号,这意味着当魔术引号被禁用时,您的应用将被拥有。 同样,它可能会打破其他不需要inputstring的应用程序。

这是一个非常积极的风险,魔术报价试图给你一个解决scheme,但我更喜欢总是发展与魔术报价。 这样我必须确保我自己实际上逃避了投入。 谁知道是否在实际部署脚本的服务器上启用或禁用魔术引号。

这仍然是一个大问题。 你不能假设在你使用的每一个PHP安装中magic_quotes都被打开了。

看是否魔术qotes打开,并清除了魔术引号的混乱:

 if ( get_magic_quotes_gpc() !== 0 ) { $foo = stripslashes( $foo ); } 

然后清理一下你的陈述:

 $foo = mysql_real_escape_string( $foo ); $sql = "select * from foo where bar='{$foo}'"; 

等等

事实上,如果你有这个能力的话,你最好严格地把magic_quotes转换成。

我希望能帮到你。

bobby表的例子不能用于mysql接口,因为它不会在一个调用中做多个查询。 mysqli接口容易受到多重查询攻击。 mysql界面更容易受到特权提升攻击:

在你的表单中inputaccount: admin password: ' or 1=1 --这样你的典型loginsql: select * from users where user_name = '$admin' and password = '$password' 。 或导致这是真实的,让我们login。

不能PHP查询参数? 如果可以的话(如果没有的话,我会感到惊讶),这是减轻所有SQL注入攻击的一个解决scheme。

正如我之前在stackoverflow上所提到的,我是PDO的坚定支持者,停止使用老式的mysql,让自己和你的客户一个大忙,学习PDO(这很容易),并利用准备好的语句和绑定参数。 即使您不需要准备好语句性能明智,您仍然获得安全的好处。

此外,如果魔术引号设置为开,我会build议在客户端将整个应用程序崩溃。 这只是为了保护愚蠢和惹恼聪明而devise的资源。 (它使用更多的CPU比手动转义,因为它编码的一切,即使你不需要它)

有很多不同的方式来执行SQL注入和相当多的方法来绕过基本的安全防范措施。

根据OWASP,这些攻击已经进入前10名的Web应用程序漏洞(排名第二)。

欲了解更多信息,请参阅2007年十大注射缺陷

不,越less担心SQL注入,就越有可能被攻击。

从网页传递给sql查询的参数往往是数字ID。 例如,让我们假设你有一个url http://foo.com/page.php?section=34从这个查询中使用部分ID:;

 SELECT content FROM sections WHERE section_id=$section; 

没有引号就像在你的例子中那样转义,并且在URL中的数字之后将会传递给查询…所以这个风险是真实的。

最简单的经验法则是假设所有的用户input都可能被污染。 检查数据types是否是你期望的,variables是在你期望的长度/大小范围内,文件是你允许的大小和types等等。对非外部数据的其他检查可以被保证 – 在你呼叫一些重要的pipe理员之前-level函数,做一个检查($userlevel != ADMIN)?die():important_function();

总会有更大的鱼,或者是比你更大的混蛋。 避免对数据的假设,你有一个开始。

不是今天 ,但是只有20:34 UTC

监护人作业数据库攻击certificate了数据库安全的困难,2009年11月6日

守护乔布斯网站黑客可能是一个SQL注入,而不是一个“复杂”的攻击,2009年10月27日

无论何时从string构buildSQL,SQL注入都是一个真正的危险。

我也发现,试图避免从string中构buildSQL是毫无意义的努力。 迟早你的SQL的完整forms(不只是可能是参数的东西)必须在运行时生成。

我必须开发一个服务器,这是没有办法让我禁用magic_quotes! 我在每一页上都包含了这个,以消除魔术引号的影响,所以我可以在没有“双重转义”的情况下自行逃脱。 即使我可以从阅读这个品味呕吐,我还没有find一个更好的解决办法。

 if (get_magic_quotes_gpc()) { $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST); while (list($key, $val) = each($process)) { foreach ($val as $k => $v) { unset($process[$key][$k]); if (is_array($v)) { $process[$key][stripslashes($k)] = $v; $process[] = &$process[$key][stripslashes($k)]; } else { $process[$key][stripslashes($k)] = stripslashes($v); } } } unset($process); } 

根据OWASP 2017十大排名 ,仍然是最严重的攻击事件。

“SQL注入总是头号风险,这反映了有多less事件,以及其他因素,使得它在那里非常高”Troy Hunt – 违反网站的创始人haveibeenpwned.com

只要记住,使用SQL注入,我们可以转储整个数据库,通过上传web shell来控制web服务器等。