让我感到奇怪。为什么通过SQL注入仍然发生这么多数据泄露?没有解决办法吗?
#1 楼
没有针对SQLi的常规修补程序,因为没有针对人类愚蠢的修补程序。已经建立了既易于使用又可解决问题(特别是参数绑定)的技术,但是仍然必须使用这些技术。许多开发人员根本不了解安全问题。大多数人担心应用程序根本不会运行,也不在乎安全性,特别是如果它使事情(甚至略微)变得更加复杂,并带来测试之类的额外费用。这类问题不仅限于SQLi,而是在缓冲区溢出,证书检查,XSS,CSRF ...中发现的。由于需要额外的测试和开发人员所需的额外专业知识,因此进行安全编程的成本更高。只要市场更喜欢便宜的产品,并且对安全性不怎么在意,您就会获得便宜且不安全的解决方案。尽管设计安全性在很大程度上有助于改善安全性,但开发人员经常会因为无法理解设计而以其自身的方式来解决该设计问题。
评论
缺乏意识和懒惰...
– Matthieu M.
16-6-27在6:34
“没有针对SQLi的常规修补程序,因为没有针对人类愚蠢的修补程序。”那是一个美丽的报价!
– miva2
16年6月27日在9:36
sqli有一些通用的修复程序,就像缓冲区溢出有一些修复程序一样,它们涉及在不允许这些发生的更高级别的构造上进行工作。使用大多数托管语言可修复缓冲区溢出,如linq之类的技术可修复sqli。只要人们直接使用sql,sqli就会在那里,但是对于那些想要它的人来说已经不存在了
–罗南·蒂博道
16年6月27日在9:50
您并不总是人类的愚蠢(至少不是开发商的愚蠢)!我知道许多巴西公司在这里做便宜的事:他们聘请培训生而不是全职的开发人员,而是聘请了一批见习生来避税,并减少了雇员的工资。这些都是大公司!这样的大三学生还不知道(其中一些是在他们的学期的第一学期),甚至对此类问题也没有意识,并且负有建立当然会存在缺陷的系统的责任。我在这里看到太多了。我什至可以给5到6个名字。这是一件非常可悲的事情。
–马拉沃斯
16-6-27在14:20
@Malavos:我不一定是开发者的愚蠢。基于薪水而不是知识来雇用开发人员也是愚蠢的。
– Steffen Ullrich
16 Jun 27'15:42
#2 楼
因为这不是问题。上一次出现SQL注入漏洞的公司何时被告上法庭,并因re顾用户数据而遭到巨额罚款,董事是否因疏忽而被警告,罚款或锁定?专业机构的合格监管者/审计师必须批准并签署面向公众的计算机系统,然后才能投入使用?用防火材料,警报器和良好的逃生路线建造建筑物。不是。我们引入了强制使用不易燃建筑材料,带有火灾中断的防火设计,火灾警报器的法规。设计。不是。事实并非如此。我们必须制定法规,要求合格的工程师批准建筑设计,并针对特定用途进行设计和建造,一旦出现故障,社会就会将工程师告上法庭。人们将死”将是使食品加工清洁安全的足够充分的理由,但事实并非如此。在一个完全不受监管的行业中。
即使是关心它的公司,它们也不能有效地宣传“我们代码中没有已知的SQL注入漏洞”作为任何人都在乎的营销重点。客户问销售人员的问题不是那种。对于他们来说,这不是竞争优势,而是成本,开销。对其进行防护可降低它们的竞争力,降低移动速度,并为相同的功能执行更多的工作。
激励措施都是为了保持生存状态。因此,它一直存在。
使SQL注入成为公司的问题,它们将使它消失。您是否使用Cookie。他们做到了。因此,对面向公众的计算机系统进行监管以使它们更烦人可以生效-即使当前的监管非常无用。
评论
我不知道什么时候该出台与计算机科学有关的立法
– prusswan
16年7月5日在17:57
小心@prusswan的要求。至少在美国,游说者已经制定或尝试了绝大多数已制定或尝试过的技术监管法律,而这些法律很少或根本不了解大局。
– Paul
16年7月6日在0:46
好吧,有些立法总比没有立法好
– prusswan
16年7月6日在6:27
@prusswan我因此驳斥您的论点:没有立法比坏立法更好。
– daiscog
16年7月6日在11:13
@prusswan真的吗?您宁愿有立法,也宁愿没有立法?如果该法规要求您的加密具有后门,该怎么办?如果该法规强迫您对所有哈希使用md5怎么办?如果该法规要求您将所有密码以纯文本格式保存,未加密且未加盐该怎么办?您是否绝对确定某些法规总比没有法规强?
– Kyeotic
16年7月6日在17:20
#3 楼
SQL注入仍然存在,因为软件界仍然不了解,应通过将语法树构造为一等对象来完成树结构化值(如查询或标记)的编程生成,而不是通过串联表示a片段的字符串近年来,随着诸如LINQ to SQL或SQLAlchemy之类的查询生成器工具的可用性不断提高,已经有了一些进步,但这只是在编程语言方面。关系数据库仍然没有提供一种标准的,引人注目的替代接口,该接口根本不是基于以字符串形式发送查询。查询的结构(连接哪些表,过滤条件,要投影的列)是固定的。当您有一个需要在运行时构造查询文本的应用程序时,使用准备好的查询参数会很麻烦。
因此,如果可以构建一个标准的,非文本的,树状结构的协议来描述查询并将其传达给数据库,并且设计成比文本查询更易于使用,则可以解决从长远来看这个问题。但是,直到行业采用阻力最小的路径是安全的方法后,问题才会消失。只要我们坚持不安全的默认安全系统,在这些系统上编写安全代码会花费不必要的精力,那么问题就出在我们身上。 (请考虑一下在内存管理的语言中根本不存在的所有缓冲区溢出!)
请注意,与SQL注入相同的根本问题困扰着Web,即跨站点脚本的名称-实际上这只是将JavaScript注入动态HTML页面。 Javascript程序员是一个非常常见的模式,他们没有通过将DOM当作对象树来使用DOM,而是使用
innerHTML
属性将其设置为由简单字符串连接构建的HTML文本。如果没有将innerHTML
属性放入浏览器的DOM实现中,则将永远不会存在许多XSS漏洞。 此外,对于那些还没有看过Tony Hoare关于空指针的演讲的人来说,它同时是正交的(空指针,而不是SQL注入),但是与此同时却非常相关:
Tony Hoare,“空引用:十亿美元的错误”。
评论
关系数据库仍然不提供标准,...以字符串形式发送查询。网络可以访问数据库,因此生成安全查询的API始终在应用程序端。此外,这将要求他们以每种语言实现该解决方案。他们已经实现了驱动程序来进行通信,执行事务并允许更轻松地进行参数化查询。我认为我们不能真正要求他们更多。
–沃尔夫特
16-6-27在6:58
我认为,如果将innerHTML限于创建匿名纯文本对象,那么使用innerHTML不会有任何问题。能够将字段设置为重要更为实用:无论是什么,而不必为粗体文本创建并插入单独的嵌套对象。不幸的是,我不知道创建此类聚合对象的机制,而该机制根本无法创建更多“危险”的对象。
–超级猫
16年6月28日在22:21
无法充分支持此答案。我已经说了几十年了,听到至少一个人也这么说真是太好了。
– RBarryYoung
16年6月29日在15:09
至于天真的使用字符串连接带来的最简单的漏洞,在那些不知道自己在做什么的人编写的代码中仍然很常见,因为尚未删除不太安全的API。如果用PHP和其他语言编写的DB接口函数完全删除了旧式的扁平字符串API(打破了大量现有代码),那么许多不真正知道如何编程的人编写的自制代码将更加安全。
– Peter Cordes
16年6月29日在19:26
我是SQL开发人员,因此不同意“当您的应用程序需要在运行时构造查询文本时,使用准备好的查询参数会很麻烦。”在程序中创建安全查询比手工操作更容易。
–狗仔队
16年6月30日在13:41
#4 楼
测试时,很容易测试您期望发生的事情。例如,当在数据库中填写“名称”字段时,您可能会选择一些自己熟悉的东西,例如“ John Doe”。这样可以正常工作,并且您的应用程序似乎可以正常运行。 />当然,您不会对应用程序的名称进行测试,因此,在您进行的所有测试中,此类名称都会暴露出安全隐患。安全声明很容易证明存在安全漏洞(您只需要测试上述名称即可)。也很容易证明一个特定的孔已被修复。很难证明没有其他安全漏洞。
评论
@Walfrat太糟糕了,O'Brien可能想开设一个帐户。
–用户
16年6月27日在13:42
+1是一个很好的答案。缺少适当的测试案例是(IMHO)比人类的愚蠢或错误更好的理由。很难断言在功能上对现有测试用例正确的东西是“错误”,并且不使用最佳实践也不是真正的“愚蠢”,而只是缺乏对主题的了解。如果测试用例始终包含SQL注入,那么问题就不会那么频繁地出现,并且最佳实践很可能会得到遵守。
– TTT
16年6月27日在14:47
@MichaelKjörling我认为@Walfrat的观点是,只需在测试输入数据中包含奇数'就可以对SQLi进行一些测试。我认为他并不是要在应用程序级别推广过滤撇号(尽管我可以看到您如何这样解释)。
– marcelm
16年6月27日在20:20
我的回答确实是在试图解决这个问题:为什么17年后问题仍然存在?不是:如何最好地修复SQL注入。
–尼克·盖蒙(Nick Gammon)
16年6月27日在22:00
没有什么比具体示例可以更快,更清楚地说明问题了。无法回答这个答案足够...
–杜安涅夫
16-6-29在16:58
#5 楼
Steffen的回答很不错,但我想补充一下。我认为原因可以细分为以下主题:缺乏知识或对开发人员的教育
在企业开发环境中搅动
提前交付
从顶部开始对安全性的重视不足
所以让我们分解一下。
开发人员培训
有一个这些天非常重视用户教育。教用户如何维护强密码。教用户如何识别网络钓鱼。教用户如何...。您明白了。有些企业可能很多,但是我只能说自己的专业经验,而且我没有在很多企业工作过;),确实有培训计划。但是这些培训计划可能不完整,或者达不到所需知识的深度。这并不是要贬低构建这些程序的辛苦工作。但是要说,就像在学校环境中一样,不同的人学习的方式也不同。而且,除非您有针对开发人员的继续教育计划,否则将很难传达“使用参数化查询,这是在PHP,Java,Python,Ruby,Scala,NodeJS等中的实现方式”。有效地吸引受众的开发,交付和维护开发人员程序是艰苦的工作。
开发人员流失
上面,我提到的一件事是针对不同的学习类型有效地吸引受众。原因之一是许多企业对开发人员的流失率很高,因为开发人员是承包商,他们在不同公司的项目之间转移。而且公司的安全性并不总是相同的。一个公司可能根本没有一个安全程序,而另一个公司可能有一个出色的安全程序,开发人员突然被新的信息轰炸,在他们搬到另一家公司之前的六个月中,都需要他们提供这些信息。真可惜,但它确实发生了。不幸的是,完成项目的最快途径通常是不通过安全控制来完成项目。它以仍然无法解决的最坏的方式完成它。我们知道,当需要维护项目和解决问题时,它将导致更多的工作,更多的时间和更多的资金,但是管理层只是希望项目退出。
我提到的另一个项目正在为众多编程语言开发安全培训计划。许多企业没有一两种语言。因此,开发人员喜欢(或鼓励)尝试新的功能。其中包括语言和框架。这意味着安全程序必须不断发展。
管理支持
在这里,我们在管理层。每次,似乎是在一次公共违规事件中,都有本可以实施的控制措施,这些控制措施并不难,但是却被遗漏了。尽管上课后又下课,但总是首先推动交付产品而第二次担心总是回到产品公司。管理人员必须从头开始推动,以便在开始时花时间建立安全性。他们必须了解,将花费更多的工作,更多的时间和更多的金钱来解决问题,维护产品和支付罚款。但是,成本效益分析指出的问题是产品交付,而不是罚款或所需的维护工作。这些方程式必须改变,这在一定程度上要归功于MBA级别的教育(低迷,整个圈子)。必须告诉业务经理,要在不断增加的违规情况下取得成功,安全必须放在首位和居中。岁,有很多原因。作为安全从业人员,我们只能做很多事情来教育和提高人们对在安全性不被视为SDLC的组成部分时发生的情况的认识。
评论
“开发人员培训” ...对...有时候,没有它,人们会变得更好。我的一个朋友今年早些时候在德国完成了一个理应认可的Java课程(无论如何)。 SQL课程的明星?字符串串联和一个称为safe()的方法,该方法通过转义引号-和仅引号来使字符串“安全”。在5分钟内,我发现了2-3种不同的方法来对老师提供的示例代码进行SQLi。谁知道自动SQLi探测工具会从那堆代码中产生什么呢?
– thkala
16 Jun 28'23:57
然后那些程序由无能的人来操作。但这并不意味着开发人员培训无效。我已经看到了它的工作原理。与其假设开发人员的培训无效,不如查看失败的原因。所以,对...
–h4ckNinja
16年6月29日在17:22
我要添加“数据库供应商试图将所有内容塞入一个呼叫中”。如果运行某些sql的方法始终是调用采用任意SQL的函数,则开发人员必须做很多安全工作。供应商可以轻松地添加仅允许一个选择的功能(可能称为“选择”吗?),而无需语句分隔符,注释,“删除”,“更新” ...非常安全,并且可以满足用户(尤其是初学者)的许多需求-因此可以大大减少攻击面。
– TextGeek
16年7月1日在22:17
@TextGeek SQL Server和C#/。NET之间的集成非常棒。您有几种工具可以使用安全的选择和更新,无论如何-仍然,许多开发人员只是忽略这些选择,而直接进行不安全的通用“仅执行此SQL”调用。
– T. Sar
16年7月6日在11:02
#6 楼
我同意很多答案,但是没有提出一个非常重要的观点:代码并不能神奇地修复自身,并且有很多已经使用了17年的代码。我已经看到许多公司编写了干净且安全的新代码,而在某些较旧的部分中该应用程序仍可能受到攻击。最糟糕的是:修复旧代码很昂贵,因为它要求开发人员深入研究在不同时代以不同的编码风格和技术编写的代码。有时,修复旧代码以免导致SQL注入需要一个人重新创建当天买回来的整个库(这是我几年前必须要做的事情)。新代码没有SQL注入,但是在过去的4到5年中,我个人还没有看到任何专业编写的新代码。 (唯一的例外是,开发人员必须对旧代码进行快速而肮脏的修复,并使用与其余代码相同的样式/技术。)#7 楼
我相信这是因为许多开发人员仅出于“完成”的价值而学到了足够的知识来完成工作。他们通常从过时的在线教程中学习如何构建SQL代码,然后在代码“工作”到可以说“我可以将东西放入数据库中并生成结果页面”的程度时,他们很满意。考虑这个在梯子上的家伙:他为什么没有适当的脚手架?因为他正在完成工作。将梯子靠在楼梯上的墙上,这样就可以了。直到没有。
与
INSERT INTO users VALUES($_POST['user'])
相同。它工作正常。直到没有。另一件事是他们不了解危险。当那个家伙坐在不稳定的梯子上时,我们了解重力和跌落。通过从未经验证的外部数据构建SQL语句,他们不知道该怎么做。听说过SQL注入。
#8 楼
我认为主要原因是开发人员培训不是从最佳实践开始的,而是从理解语言开始的。因此,新程序员以为他们已经接受过使用工具来创建某些东西的培训,因此可以按照他们的教学方式来创建查询。下一步也是最危险的步骤是允许某人在不进行审查的情况下做出任何事情,因此有继续的机会做出更多错误的选择,而又不知道问题出在哪里,并养成无视整个行业公认的最佳做法的习惯。因此,总而言之-训练有素的程序员在一种环境下工作,该环境除了最终产品外没有其他价值。它与智力或“人类愚蠢”无关。多年来,已经有一种系统的方法已被很好地定义,对于以更快或更便宜的实现为名,生产软件的任何人都忽略了该过程是一种疏忽。也许有一天,这种行为的法律后果将使我们能够采取更多的控制措施,例如医疗或建筑行业,否则,如果不遵守这些规则和公认的做法,将会导致失去执照或其他处罚。
评论
同意google“ sql examples”,您将获得很多SQL表达式的示例,但都不是安全的,因为它们都是字符串。如果这是您学习如何编写SQL的方式,那么这就是您将在第一个项目中使用的方式...
–马克·拉卡塔(Mark Lakata)
16年6月30日在17:26
@MarkLakata这也是我的观察。新人们严重依赖Google。 Google倾向于举出绝对可怕的例子...动态查询从真正的宽表中为一列选择*。这些令人恐惧的SQL示例如何一直浮在新开发人员使用的Google搜索的顶部,这令人难以置信。
–布赖恩·诺伯劳
16年7月13日在13:25
#9 楼
为什么SQL注入漏洞尚未消失?隐喻地讲,出于同样的原因,自1895年首辆汽车出现碰撞事故以来,甚至是当今最具创新性和现代性的自动驾驶汽车,特斯拉S型(自动驾驶)或Google自动驾驶汽车碰撞事故时有发生。时间。汽车是由人类创造(和控制)的,人类会犯错。当某些东西是安全的但实际上引入了新的漏洞(例如,由于开发补丁的时间/预算有限,或者开发人员有漏洞)时,他们往往会在安全性设计中犯严重的错误,或者倾向于用“快速修复”来破坏事物。他写此修复程序时遇到了很大的麻烦。
总是由开发人员引起的吗?从本质上讲是肯定的,但一线开发人员并非总是如此。例如,当地一家超级市场要求网络开发公司为其创建网站。开发人员从托管公司租用一些共享的托管空间来托管站点,并安装WordPress和一些有用的插件。
现在,Web开发公司的开发人员不必为了引入易受攻击性而引入SQL注入漏洞。这里可能出什么问题?以下是一些示例:
托管公司未更新到最新的PHP版本,而使用过的PHP版本通常容易受到SQLi攻击。配置了一些公共的附加软件,例如phpMyAdmin,并且没有对其进行更新。容易受到SQLi的攻击。<br />
现在提出的问题是谁负责?夸张地说,是超市,Web开发公司,托管公司,WordPress社区,WordPress插件开发人员还是滥用漏洞的攻击者? -这不是陈述,是夸张的,只是出现一些问题时可能会提出的一些问题。风险因素,因为某些开发人员倾向于具有“那不是我的代码”的态度。您可以想象有时候造成这种情况的复杂程度。
评论
使用Wordpress本身应被视为漏洞。
–AndréBorie
16年6月27日在10:28
我认为车祸不是一个很好的比较。自1895年以来,没有任何方法可以确保不会发生车祸,并且在减少事故数量(例如道路上的白线,近光大灯,更好的路口和交通信号灯设计)及其影响(安全气囊)方面取得了进展,安全带,易碎区)。相比之下,SQL注入可以通过设计更改(句号)完全固定。现代汽车并没有因为公司缺乏激励,无能为力,懒惰或无能而崩溃,但这就是SQLi存在的原因。
–TessellatingHeckler
16-6-27在17:34
@EvanderConsus Web开发公司。他们被合同提供一个可在Internet上使用的网站,而他们提供的网站不适合其目的。暗示他们可能会因为自己的工具不好而对自己不负责任,因此在他们选择了无成本,无须担保,没有技术支持的未知工具(这些工具以前有很多已知漏洞)之后,他们只是愚蠢的。 “我们与您签约建造了一座新建筑物,但倒塌了”,“ *这不是我们的错,我们使用了一些业余家庭铁匠提供的免费钢材,怎么可能知道它不够坚固呢?” “哦好的”
–TessellatingHeckler
16年6月27日在17:48
我真的不了解车祸与SQL注入有什么关系。
– Ellesedil
16年6月27日在19:04
@WanderNauta Evander问:*现在提出的问题是谁负责?”-我并不是说自由钢铁总是更糟,只是说您不能通过调用“开源!从地面上腾出免费的钢材,不要经过冶金测试,然后再发现它很弱,这是您的责任。供应商工具可能不会更好,但是如果他们按适当目的出售它,则您不负责任。
–TessellatingHeckler
16年6月27日在19:35
#10 楼
首先,没有人正确地写出安全要求,他们说“产品应该是安全的”,这绝不是可测试的。所有这些人都可能拥有大学学位,并且一直在解决我们甚至没有开始关注的问题...问题是,他们从未被教导过如何安全地开发软件。首先是在学校,然后是大学,然后是他们从事的任何工作,其中的任何培训都是“在职”的,因为软件公司太害怕培训万一离开的开发人员。同样,在更少的时间内完成更多工作的压力也越来越大,他们正忙于解决一个问题并继续解决下一个问题,随着下一个问题的到来,他们几乎没有时间进行反思。测试超出他们正在开发的内容的范围,如果发现问题,则很可能是开发人员要解决的问题。开发人员的口号是“不要测试您不准备解决的问题”
第三,出于与软件开发人员相同的原因,测试人员也没有受过培训来发现安全漏洞,实际上,很多测试(以我的观点)只是重复开发团队的测试。第四,上市时间是一个很大的因素,如果您首先去那里就可以赚钱,可以看到安全地发展对发展速度有重大影响-我的意思是说,谁有时间建立威胁模型! ;)
最后不只是SQL注入,自1960年代以来就已经知道缓冲区溢出,并且您仍然可以以惊人的规律性偶然发现它们。
评论
“第二职业开发人员并不愚蠢……他们都可能拥有大学学位。”我雇用的最聪明的开发人员拥有一所技术学校的两年制学位。一些最差的人有博士学位。一张纸既没有智慧也没有常识,而我却普遍缺乏这两种知识。不幸的是,学术界倾向于重视论文而不是经验,因此新开发人员被教导错误的事情,因为从事教学的人自己并不了解任何东西。
–DVK
16年6月27日在20:50
仍然证明他们并不愚蠢。它显示了在教授软件开发人员方面学术界和行业之间的巨大差距。正在向学生讲解dejour语言,这很可能是javascript ...当面对现实问题或可靠性,性能可伸缩性,不干净的数据等时,这是完全不切实际的...您最终将不得不在应用程序中进行管理。
–科林·卡西迪(Colin Cassidy)
16-6-28在4:54
大学似乎只是在教你如何听起来聪明,而对实际用途一无所知。
–暗恋
16年6月28日在15:35
没有。在最初的问题中,大学教学大纲中很少关注产品安全
–科林·卡西迪(Colin Cassidy)
16年6月28日在19:34
@colincassidy,您的评论应读为:大学教学大纲中没有任何产品安全方面的关注。
– Jim B
16年6月30日在17:22
#11 楼
是的,在人类学上,人类是愚蠢的。是的,从政治上讲,激励结构不能充分惩罚易受攻击的应用程序
是的,该过程有缺陷-代码编写很急;坏/旧的代码并不总是会被丢弃。
是的,从技术上讲,默认情况下,将数据作为代码进行处理和混合比较困难。
但是,有一个更积极的观点(让我们忽略上面答案解释的99%的SQLi漏洞)。因为我们很棒,所以SQLi仍然存在于经过精心设计和精心开发的网站上。黑客统治。您只需查看过去十七年来为恢复对人类的某种信念而开发的数百种攻击媒介和数千种SQLi有效负载。每年都会带来DEFCON / BlackHat / RSA / IEEESSP提出的新技术。 Facebook,Google和类似公司的漏洞赏金计划都必须为关键的SQLi至少淘汰一次。
部分原因是由于我们系统中的复杂性和层数,每个层都以更新和更有趣的方式对数据进行变异。我们越来越需要使用更少的资源来做更多的事情,更快。而且,只要我们无法切实地测试进入系统的所有路径,就没有人会证明对注射问题的解决方案。
#12 楼
因为在大多数3年的教育周期和同等学习中都没有涉及此类安全问题,所以许多开发人员(包括我本人)都遵循了这种做法。考虑到领域的广泛性,实际上3年甚至不足以应付实际的学习计划。因此,诸如安全性之类的东西被放弃了。永远不会尝试自己学习新事物,这些人总是会编写容易产生SQLi的代码,直到受过良好教育的同事指出该问题为止(或直到发生实际的SQLi为止)。在学习中(很多年前),我们的老师总是告诉我们在创建手动SQL查询时要使用PreparedStatements,因为这是“最佳实践”,但他们没有说为什么。这总比没有好,但还是很可悲。
我不确定那些老师是否还了解自己。
我们学习了如何在jsp上显示内容,但不了解跨站点脚本是什么。因此,很久以前我就自己掌握了所有这些知识,但是我敢肯定,许多开发人员每天仅做8个小时(出于正当理由),只要没有人显示他们出了什么问题,它不会改变。
评论
有时,某些开发人员低估了SQLi的风险。
–史蒂芬(Stephan)
16年6月29日在14:45
通常没有受过教育的人。它使我想起了这个网站上的一篇帖子,那里的一个学生对查询有疑问。我向他展示了如何使代码正常工作,并指出它很容易出现SQLi,建议使用PreparedStatements重构代码。他的回答是“但仅用于课堂练习,不会重复使用此代码,我不在乎”。这是我们必须反对的一种态度。在任何情况下,尽可能正确地进行编码都是很重要的,尤其是如果您不太了解自己在做什么。
– niilzon
16年7月8日在7:01
#13 楼
如果正确使用准备好的语句,则无法进行SQL注入。“如果原始语句模板不是从外部输入派生的,则不会发生SQL注入。”
https://en.m.wikipedia.org/wiki/Prepared_statement
不幸的是,人们通常根本无法正确使用预处理语句。
如果这样做,SQL注入将成为过去。 />是的,很长一段时间以来,php / MySQL已经有一个准备好的语句实现,如果可以使用内存,则已经有10多年的历史了。
#14 楼
其他答案指出了几乎所有原因。但是还有其他事情,我认为这是所有人中最危险的安全问题。开发人员试图为技术添加越来越多的功能,有时会偏离技术的实际目的。有点像客户端脚本语言最终被用于服务器端编码,还是被允许访问远程资源以及客户端本地存储。大蜜罐。通过研究一些高级SQL注入,我们可以看到它们如何在稳定的SQLi攻击中发挥了作用。 。就像调用run(value, printf)
而不是printf(value)
一样。最后一件事,虽然在不同类型的数据库之间进行转换非常容易,但是服务器端代码中所需的更改非常庞大。 >
有人应该在不同类型的数据库之间进行抽象,并使其更容易在不同的数据库之间进行切换。假设有一个php插件,它接受输入QL命令和数据库类型,并且可能是列入白名单的过滤器以清理输入。
#15 楼
我个人认为这是编程中一个更普遍问题的特例,因为IDE和语言过于宽容。我们以灵活性和效率的名义赋予开发人员巨大的力量。结果是“将要发生的一切都会发生”,并且安全漏洞不可避免。#16 楼
PDO(或其他“安全”方法)不比mysql_(或其他“不安全”方法)安全。它使编写安全代码变得更加容易,但是将未转义的用户提供的字符串连接到查询中,而不必理会参数,则更加简单。评论
我不确定这是否能回答问题。这是对另一个答案的评论吗?
– schroeder♦
16年6月28日在7:19
我相信他的意思是说SQL注入仍然存在的原因是因为上述“安全方法”没有完全保护免受SQL注入的侵害,人们需要意识到完全保护自己,并确保您使用的数据库能够处理所需的情况。
–小玲宝
16年6月28日在20:07
使安全代码难于编写会导致更多的错误,从而降低安全性。
– Cees Timmerman
16年7月6日在12:19
评论
您知道疟疾仍然存在吗?实际上杀死了人。缓冲区溢出漏洞利用已经存在了30多年了,尽管对于厂商来说修复起来并不难,但它们仍然是一回事。
我会对SQL提出同样的问题。
非技术精明的客户只是不会支付代码更改的费用,直到他们看到不利于其利润的不良情况:“这不在预算之内!”,“我看不到问题,最近15年来一直运转良好”。他们不知道自己已经通过SQL注入被黑客入侵了,因为他们从不检查服务器日志,并且黑客永远无法向他们发送电子邮件...
在数千年来的裤子穿上,掏腰包仍然是“一件事”。