当前位置:K88软件开发文章中心网站服务器框架django → 文章内容

Django 安全

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-25 14:19:32

ed@example.comSubject: hellocc: spamvictim@example.com就像SQL注入那样,如果我们信任了用户提供的主题行,那样同样也会允许他构建一个头部恶意集,他也就能够利用联系人表单来发送垃圾邮件。解决方案我们能够采用与阻止SQL注入相同的方式来阻止这种攻击: 总是校验或者转义用户提交的内容。Django内建邮件功能(在 django.core.mail 中)根本不允许在用来构建邮件头部的字段中存在换行符(表单,收件地址,还有主题)。 如果您试图使用 django.core.mail.send_mail 来处理包含换行符的主题时,Django将会抛出BadHeaderError异常。如果你没有使用Django内建邮件功能来发送邮件,那么你需要确保包含在邮件头部的换行符能够引发错误或者被去掉。 你或许想仔细阅读 django.core.mail 中的 SateMIMEText 类来看看Django是如何做到这一点的。目录遍历目录遍历 :是另外一种注入方式的攻击,在这种攻击中,恶意用户诱骗文件系统代码对Web服务器不应该访问的文件进行读取和/或写入操作。例子可以是这样的,某个视图试图在没有仔细对文件进行防毒处理的情况下从磁盘上读取文件:def dump_file(request): filename = request.GET["filename"] filename = os.path.join(BASE_PATH, filename) content = open(filename).read() # ...尽管一眼看上去,视图通过 BASE_PATH (通过使用 os.path.join )限制了对于文件的访问,但如果攻击者使用了包含 .. (两个句号,父目录的一种简写形式)的文件名,她就能够访问到 BASE_PATH 目录结构以上的文件。对她来说,发现究竟使用几个点号只是时间问题,比如这样:../../../../../etc/passwd。任何不做适当转义地读取文件操作,都可能导致这样的问题。 允许 写 操作的视图同样容易发生问题,而且结果往往更加可怕。这个问题的另一种表现形式,出现在根据URL和其他的请求信息动态地加载模块。 一个众所周知的例子来自于Ruby on Rails。 在2006年上半年之前,Rails使用类似于 http://example.com/person/poke/1 这样的URL直接加载模块和调用函数。 结果是,精心构造的URL,可以自动地调用任意的代码,包括数据库的清空脚本。解决方案如果你的代码需要根据用户的输入来读写文件,你就需要确保,攻击者不能访问你所禁止访问的目录。备注不用多说,你 永远 不要在编写可以读取任何位置上的文件的代码!Django内置的静态内容视图是做转义的一个好的示例(在 django.views.static 中)。这是相关代码:import osimport posixpath# ...path = posixpath.normpath(urllib.unquote(path))newpath = ''for part in path.split('/'): if not part: # strip empty path components continue drive, part = os.path.splitdrive(part) head, part = os.path.split(part) if part in (os.curdir, os.pardir): # strip '.' and '..' in path continue newpath = os.path.join(newpath, part).replace('\\', '/')Django不读取文件(除非你使用 static.serve 函数,但也受到了上面这段代码的保护),因此这种危险对于核心代码的影响就要小得多。更进一步,URLconf抽象层的使用,意味着不经过你明确的指定,Django 决不会 装载代码。 通过创建一个URL来让Django装载没有在URLconf中出现的东西,是不可能发生的。暴露错误消息在开发过程中,通过浏览器检查错误和跟踪异常是非常有用的。 Django提供了漂亮且详细的debug信息,使得调试过程更加容易。然而,一旦在站点上线以后,这些消息仍然被显示,它们就可能暴露你的代码或者是配置文件内容给攻击者。还有,错误和调试消息对于最终用户而言是毫无用处的。 Django的理念是,站点的访问者永远不应该看到与应用相关的出错消息。 如果你的代码抛出了一个没有处理的异常,网站访问者不应该看到调试信息或者 _任何_代码片段或者Python(面向开发者)出错消息。 访问者应该只看到友好的无法访问的页面。当然,开发者需要在debug时看到调试信息。 因此,框架就要将这些出错消息显示给受信任的网站开发者,而要向公众隐藏。解决方案正如我们在第12章所提到的,Django的DEBUG 设置控制这些错误信息的显示。 当你准备部署时请确认把这个设置为:False 。在Apache和mod_python下开发的人员,还要保证在Apache的配置文件中关闭 PythonDebug Off 选项,这个会在Django被加载以前去除出错消息。安全领域的总结我们希望关于安全问题的讨论,不会太让你感到恐慌。 Web是一个处处布满陷阱的世界,但是只要有一些远见,你就能拥有安全的站点。永远记住,Web安全是一个不断发展的领域。如果你正在阅读这本书的停止维护的那些版本,请阅读最新版本的这个部分来检查最新发现的漏洞。 事实上,每周或者每月花点时间挖掘Web应用安全,并且跟上最新的动态是一个很好的主意。 花费很少,但是对你网站和用户的保护确是无价的。接下来?你已经完成了我们安排的程序。 以下的附录内容中包含了可能在你的Djang项目中用得上的引用资源.在运行你的Django网站时,无论是为你或几个朋友的小网站,或者是下一个google,我们祝你好运。

上一页  [1] [2] [3] 


Django 安全