在Stack Overflow上,尽管基本解决方法已广泛使用了十多年,但我在问答中看到许多PHP代码都具有极易受到SQL注入攻击的MySQL查询。
为何今天仍在使用这些类型的代码片段?
在Stack Overflow上,尽管基本解决方法已广泛使用了十多年,但我在问答中看到许多PHP代码都具有极易受到SQL注入攻击的MySQL查询。
为何今天仍在使用这些类型的代码片段?
Answers:
我认为这主要是由于a)无知b)懒惰。初学者通常对sql注入了解不多,即使他们听说了sql注入,也还是会忽略它,因为这样编码起来非常简单。
PHP故意使很少了解的人可以非常轻松地创建有用的动态网页。这意味着PHP将吸引许多初学者,他们创建有用的东西,从其他有用的例子中学习,并转而教其他人如何做这个很酷的有用的东西。结果是很多错误的代码,以及大量不了解的程序员。
更糟糕的是,大部分合格的程序员都不愿与PHP无关。这减少了愿意教别人的有经验的人的基础。但是为什么他们避免使用PHP?结合多种因素。在某种程度上,他们不喜欢与语言疣打交道。部分原因是因为他们更喜欢使用良好的代码,并且那里没有很多优质的PHP。
问题的确切位置曾经造成Perl。作为一个光辉的例子,以马特·怀特(Matt Wright)为例,他是一个热情的少年,他在1990年代开始提供许多有用的,有据可查且易于安装的CGI脚本。不幸的是,他对安全一无所知,而想要使用他的东西的人也一无所知。结果就是Matt Wright脚本档案,对于早期的CGI脚本,这是无休止的安全问题源。尽管进行了http://www.scriptarchive.com/nms.html之类的工作,但直到共享托管提供商使PHP比其他任何方式都方便之前,Perl的问题才得以改善。这导致了从Perl到PHP的问题。
作为人类和程序员,我发现犯错,忽略某些事情非常容易,尤其是在时间紧迫时。
责怪某种语言很容易,也许太诱人了,因为它本身就太容易使用了。但这将掩盖更大的人类易失性问题,而不管选择使用哪种编程语言。
诚然,自汇编语言以来,我们已经走了很长一段路,我想我会以更现代的语言(例如PHP,Python,Ruby或Java)提高生产力。
实际上,PHP(和其他脚本语言)降低了进入门槛。这可能意味着更多的编程新手将首先尝试PHP。但这当然也不意味着与其他语言的程序员相比,所有PHP程序员在某种程度上都没有资格,或者从错误中学习的能力较低。
Rasmus Lerdorf于1994年以原始形式创建了PHP,此后便有了长足的发展。以其最现代的形式,它支持面向对象的编程以及一流的框架,例如Symfony。PHP作为一种语言已摆脱了其最初的限制,并已发展为在程序员选择使用它的方式方面提供了极大的灵活性。您可以使用它来创建9,000行意大利面条代码的脚本,也可以在现代的MVC框架(例如Symfony)的上下文中使用它:这是您的选择!
我强烈怀疑安全漏洞不仅限于一种语言。诱使所有PHP程序员注销,因为他们的能力稍差,或者更倾向于编写不安全的代码。但是我想知道其中有多少是语言偏见,有多少是事实?
我认为问题的一部分在于人们只是简单地复制代码而又不费心去学习他们在做什么,但是在我看来,我们教授porgamnming的方式被打破了,这真的是原因,这就是为什么存在如此多不良代码的原因之一。我们在上下文之外教授语法,因此初学者不知道何时使用某些内容,何时不使用某些内容,语法打算解决哪些问题以及不打算解决哪些问题。因此,当扳手会是更好的工具时,他们会使用锤子。
因此,例如,您可以像这样组织课程,而不是仅仅讲语法(显然会有更多步骤,这只是从基本问题到更复杂问题的构建的基本示例,而不仅仅是讲语法):
我认为您会发现类似数量的MS SQL + ASP / ASP.NET示例,它们同样容易受到攻击。
我觉得问题部分源于以下事实:当您尝试教一些东西时,例如使用WHERE子句过滤数据,那么您真的不想通过适当地转义查询字符串或使用参数化命令来使示例混乱。
我已经培训开发人员很多年了,我可以同情那些在教程中编写可怕代码的人。有时这是最容易理解的。但是,顺便说一句,我总是指出易受攻击的代码,并将其变成一个有趣的附带主题。
PHP的原始作者Rasmus Lerdorf在其臭名昭著的博客文章中倡导“无框架”开发。尽管对于SQL查询,他使用PDO,所以不存在SQL注入的风险。与具有ORM层的现代MVC框架相比,它仍然非常丑陋和过时。
您可以将这种不良做法归咎于PHP本身。旧版PHP(直到2006年左右)将转义所有GET和POST输入变量,以便它们适合按DEFAULT进行数据库查询插值。参见http://php.net/manual/en/security.magicquotes.php
stripslashes()
,您已经做错了。
不要混淆教程的目的,它只是为了简单地演示一些东西,以及在生产环境中应该做的事情。例如,我编写的大多数教程代码几乎没有错误/异常检查。我试图提醒读者,该代码仅演示如何执行特定任务,而不演示如何涵盖所有可能的结果。
most tutorial code I have written has little or no error/exception checking.
。
当我学习PHP时,我看了一些这些PHP + MySQL书籍,是的,我觉得它助长了这种不良做法。但是我很同情,因为他们在教语言,而不是好的编程习惯。否则它将在哪里结束?