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

Django 集成的子框架

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

恶意网站可以强迫你访问该 URL 。因此,如果你登录 example.com 的网页邮件账号之后,访问了带有指向 example.com/logout 之  的恶意站点,访问该恶意页面的动作将使你登出 example.com 。 Thus, if you’re logged in to the example.comwebmail account and visit the malicious page that has an  to example.com/logout , the act of visiting the malicious page will log you out from example.com .很明显,登出一个邮件网站也不是什么严重的安全问题。但是同样的攻击可能针对任何相信用户的站点,比如在线银行和电子商务网站。这样的话可能在用户不知情的情况下就下订单付款了。稍微复杂一点的CSRF例子在上一个例子中, example.com 应该负部分责任,因为它允许通过 HTTP GET 方法进行状态变更(即登入和登出)。 如果对服务器的状态变更要求使用 HTTP POST 方法,情况就好得多了。 但是,即便是强制要求使用POST 方法进行状态变更操作也易受到 CSRF 攻击。假设 example.com 对登出功能进行了升级,登出  按钮是通过一个指向 URL example.com/logout 的 POST动作完成,同时在  中加入了以下隐藏的字段:<input type="hidden" name="confirm" value="true">这就确保了用简单的指向example.com/logout的POST 不会让用户登出;要让用户登出,用户必须通过 POST 向example.com/logout 发送请求 并且发送一个值为’true’的POST变量。 confirm。尽管增加了额外的安全机制,这种设计仍然会遭到 CSRF 的攻击——恶意页面仅需一点点改进而已。 攻击者可以针对你的站点设计整个表单,并将其藏身于一个不可见的  中,然后使用 Javascript 自动提交该表单。防止 CSRF那么,是否可以让站点免受这种攻击呢? 第一步,首先确保所有 GET 方法没有副作用。 这样以来,如果某个恶意站点将你的页面包含为  ,它将不会产生负面效果。该技术没有考虑 POST 请求。 第二步就是给所有 POST 的form标签一个隐藏字段,它的值是保密的并根据用户进程的 ID 生成。 这样,从服务器端访问表单时,可以检查该保密的字段。不吻合时可以引发一个错误。这正是 Django CSRF 防护层完成的工作,正如下面的小节所介绍的。使用CSRF中间件django.contrib.csrf 开发包只有一个模块: middleware.py 。该模块包含了一个 Django 中间件类——CsrfMiddleware ,该类实现了 CSRF 防护功能。在设置文件中将 'django.contrib.csrf.middleware.CsrfMiddleware' 添加到 MIDDLEWARE_CLASSES 设置中可激活 CSRF 防护。 该中间件必须在 SessionMiddleware 之后 执行,因此在列表中 CsrfMiddleware 必须出现在SessionMiddleware 之前 (因为响应中间件是自后向前执行的)。 同时,它也必须在响应被压缩或解压之前对响应结果进行处理,因此 CsrfMiddleware 必须在 GZipMiddleware 之后执行。一旦将它添加到MIDDLEWARE_CLASSES设置中,你就完成了工作。 参见第十五章的“MIDDLEWARE_CLASSES顺序”小节以了解更多。如果感兴趣的话,下面是 CsrfMiddleware 的工作模式。 它完成以下两项工作:它修改当前处理的请求,向所有的 POST 表单增添一个隐藏的表单字段,使用名称是 csrfmiddlewaretoken,值为当前会话 ID 加上一个密钥的散列值。 如果未设置会话 ID ,该中间件将 不会 修改响应结果,因此对于未使用会话的请求来说性能损失是可以忽略的。对于所有含会话 cookie 集合的传入 POST 请求,它将检查是否存在 csrfmiddlewaretoken 及其是否正确。 如果不是的话,用户将会收到一个 403 HTTP 错误。 403 错误页面的内容是检测到了跨域请求伪装。 终止请求。该步骤确保只有源自你的站点的表单才能将数据 POST 回来。该中间件特意只针对 HTTP POST 请求(以及对应的 POST 表单)。 如我们所解释的,永远不应该因为使用了GET 请求而产生负面效应,你必须自己来确保这一点。未使用会话 cookie 的 POST 请求无法受到保护,但它们也不 需要 受到保护,因为恶意网站可用任意方法来制造这种请求。为了避免转换非 HTML 请求,中间件在编辑响应结果之前对它的 Content-Type 头标进行检查。 只有标记为text/html 或 application/xml+xhtml 的页面才会被修改。CSRF中间件的局限性CsrfMiddleware 的运行需要 Django 的会话框架。 (参阅第 14 章了解更多关于会话的内容。)如果你使用了自定义会话或者身份验证框架手动管理会话 cookies,该中间件将帮不上你的忙。如果你的应用程序以某种非常规的方法创建 HTML 页面(例如:在 Javascript 的document.write语句中发送 HTML 片段),你可能会绕开了向表单添加隐藏字段的过滤器。 在此情况下,表单提交永远无法成功。 (这是因为在页面发送到客户端之前,CsrfMiddleware使用正则表达式来添加csrfmiddlewaretoken字段到你的HTML中,而正则表达式不能处理不规范的HTML。)如果你怀疑出现了这样的问题。使用你浏览器的查看源代码功能以确定csrfmiddlewaretoken是否插入到了表单中。想了解更多关于 CSRF 的信息和例子的话,可以访问 http://en.wikipedia.org/wiki/CSRF 。人性化数据包django.contrib.humanize包含了一些是数据更人性化的模板过滤器。 要激活这些过滤器,请把'django.contrib.humanize'加入到你的INSTALLED_APPS中。完成之后,向模版了加入{% load humanize %}就可以使用下面的过滤器了。apnumber对于 1 到 9 的数字,该过滤器返回了数字的拼写形式。 否则,它将返回数字。 这遵循的是美联社风格。举例:1 变成 one 。2 变成 two 。10 变成 10 。你可以传入一个整数或者表示整数的字符串。intcomma该过滤器将整数转换为每三个数字用一个逗号分隔的字符串。例子:4500 变成 4,500 。45000 变成 45,000 。450000 变成 450,000 。4500000 变成 4,500,000 。可以传入整数或者表示整数的字符串。intword该过滤器将一个很大的整数转换成友好的文本表示方式。 它对于超过一百万的数字最好用。例子:1000000 变成 1.0 million 。1200000 变成 1.2 million 。1200000000 变成 1.2 billion 。最大支持不超过一千的五次方(1,000,000,000,000,000)。可以传入整数或者表示整数的字符串。ordinal该过滤器将整数转换为序数词的字符串形式。例子:1 变成 1st 。2 变成 2nd 。3 变成 3rd 。254变成254th。可以传入整数或者表示整数的字符串。标记过滤器包django.contrib.markup包含了一些列Django模板过滤器,每一个

上一页  [1] [2] [3] [4] [5] [6]  下一页


Django 集成的子框架