diff options
Diffstat (limited to 'files/zh-cn/web/security/securing_your_site')
3 files changed, 239 insertions, 0 deletions
diff --git a/files/zh-cn/web/security/securing_your_site/configuring_server_mime_types/index.html b/files/zh-cn/web/security/securing_your_site/configuring_server_mime_types/index.html new file mode 100644 index 0000000000..577aacfb08 --- /dev/null +++ b/files/zh-cn/web/security/securing_your_site/configuring_server_mime_types/index.html @@ -0,0 +1,118 @@ +--- +title: Properly Configuring Server MIME Types +slug: Web/Security/Securing_your_site/Configuring_server_MIME_types +tags: + - HTTP +translation_of: Learn/Server-side/Configuring_server_MIME_types +--- +<h2 id="Background" name="Background">Background</h2> + +<p>默认情况下,许多web服务器会为那些未知内容类型的文件配置一个默认MIME类型<code>text/plain</code> 或者<code>application/octet-stream</code> 。当一种新的内容类型被创造或者被添加到web服务器上,web管理者在添加它到web服务器配置中可能会失败。主要原因是用户使用Gecko-based 的浏览器,而这种浏览器只相信由web服务器和web应用所发布的MIME类型</p> + +<h3 id="What_are_MIME_types.3F" name="What_are_MIME_types.3F">What are MIME types?</h3> + +<p>MIME类型描述了邮件或者web服务器或者web应用中的媒体内容的类型,其目的是为了指导web浏览器对媒体内容的处理和表现。MIME类型的示例如下:</p> + +<ul> + <li><code>text/html</code> 对于一般网页</li> + <li><code>text/plain</code> 对于一般文本</li> + <li><code>text/css</code> 对于级联样式表</li> + <li><code>text/javascript</code> 对于脚本</li> + <li><code>application/octet-stream</code> 意味着“下载这个文件”</li> + <li><code>application/x-java-applet</code> 对于 Java applets</li> + <li><code>application/pdf</code> 对于 PDF 文档</li> +</ul> + +<h3 id="Technical_Background" name="Technical_Background">Technical Background</h3> + +<p>完整的MIME类型列表可在 <a class="external" href="http://www.iana.org/assignments/media-types/index.html">IANA | MIME Media Types</a> 查看.</p> + +<p>在<a class="external" href="http://www.w3.org/Protocols/HTTP/1.1/spec.html">HTTP specification</a> 中定义了能够描述在web中使用的媒体类型的MIME超集。</p> + +<h3 id="Why_are_correct_MIME_types_important.3F" name="Why_are_correct_MIME_types_important.3F">Why are correct MIME types important?</h3> + +<p><img alt="Example of an incorrect MIME type result" class="internal" src="/@api/deki/files/729/=Incorrect-mime-screen.jpg" style="float: right;"> 假如web服务器或者应用报告内容的MIME类型不正确,根据HTTP规范,或许发起人想要处理和显示内容通过他所规定的MIME类型,因此web浏览器无法采取任何措施。</p> + +<p>对于某些浏览器,例如IE,它尝试允许web服务器对于错误配置通过其源码猜测它可能的正确MIME类型。</p> + +<p>这种做法将会避免许多由web管理员他们的错误。因为当内容的MIME类型错误,IE将会用可能正确的MIME类型来继续处理内容。例如你设置一个<code>img</code>的类型为<code>text/plain</code> ,IE可能会设置它为正确的MIME类型<code>images/*</code></p> + +<p>出于安全原因,使用正确的MIME类型的服务内容也是重要的; 恶意内容可能会影响用户的计算机,假装它是一个安全类型文档,实际上不是。</p> + +<div class="note"> +<p><strong>注意:</strong> 从历史角度, 只要HTML文档请求处理CSS文件 ,Firefox 能够正常加载CSS即使它设置了错误的MIME类型。处于安全原因, {{ gecko("2.0") }} 对于从请求文档不同来源加载的样式表,将不再这样做。如果CSS来自于不同来源,你必须设置它的正确MIME类型 (<code>text/css</code>).</p> + +<p>Gecko 1.9.1.11 (Firefox 3.5.11) 和 Gecko 1.9.2.5 (Firefox 3.6.5) 同样实施这种安全措施,但是提高它的实用性。如果样式表中的第一行看起来是一个很好的CSS构造,则存在允许加载的临时启发式算法。在Firefox 4中已经删除了启发式,您必须正确设置<code>text/css</code> 的MIME类型,才能够识别CSS。</p> +</div> + +<h2 id="Why_browsers_should_not_guess_MIME_types" name="Why_browsers_should_not_guess_MIME_types">为何浏览器不应该猜测 MIME 类型</h2> + +<p>除了违返了HTTP规范,让浏览器去猜测正确的MIME类型是一个差劲的策略。原因如下</p> + +<h4 id="Loss_of_control" name="Loss_of_control">失去控制</h4> + +<p>假如浏览器忽略报告的MIME类型,web管理员和用户不在对内容如何进行处理有发言权了。</p> + +<p>例如,面对web开发员的网址可能希望发送某些实例HTML文档,同时通希望能够以 <code>text/html</code>或者 <code>text/plain</code> 的MIME类型进行数据的处理和显示 或者 作为一个源代码。如果浏览器猜测它的正确MIME类型为 <code>text/html</code> 那么开发员不在有权利进行选择了。</p> + +<h4 id="Security" name="Security">安全性</h4> + +<p>一些内容类型,例如可执行程序,本质上是不安全的。原因是经过规范化的MIME类型都有经过严格规定浏览器如何对这类类型的文件进行操作。一个可执行程序不能够在用户的电脑浏览器上执行,但可以通过弹出会话询问是否下载这个文件</p> + +<p>MIME类型猜测导致IE浏览器的安全漏洞(通过利用IE能够将错误的MIME类型 修改为正确的类型)。这绕过了正常的下载对话框,导致InternetExplorer猜测内容是可执行程序,然后在用户的计算机上运行。</p> + +<h2 id="如何确定服务器发送内容的_MIME_类型">如何确定服务器发送内容的 MIME 类型</h2> + +<p>通过开发者工具的 ContentType 查看MIME类型。</p> + +<p>根据标准,通过一个 <code>meta</code> 标签来设置MIME类型 例如 <code><span class="nowiki"><meta http-equiv="Content-Type" content="text/html"></span></code><span class="nowiki"> 当包含</span>{{HTTPHeader("Content-Type")}} 时则忽略 <code>meta</code> 标签</p> + + + +<h2 id="如何为你的内容确定正确的_MIME_类型">如何为你的内容确定正确的 MIME 类型</h2> + +<p>这里有几种方法来确定文件的正确MIME类型</p> + +<ol> + <li>如果你的内容是通过供应商软件应用创建的,那么你可以阅读供应商文档确认不同媒体文件的MIME值</li> + <li>通过查看完整的MIME类型表 <a class="external" href="http://www.iana.org/assignments/media-types/index.html">IANA | MIME Media Types registry</a> </li> + <li>如果使用插件netscape gecko显示媒体类型,请安装插件,然后查看“帮助”>“关于插件”菜单,以查看哪些MIME类型与媒体类型相关联。</li> + <li>搜索文件扩展名 <a class="external" href="http://filext.com/">FILExt</a> 或者<a class="external" href="http://www.file-extensions.org/">File extensions reference</a> ,确认扩展名和哪种类型的MIME相关联</li> +</ol> + +<h2 id="如何设置服务器以发送正确的MIME类型">如何设置服务器以发送正确的MIME类型</h2> + +<p>基本的方法是配置你的服务器发送正确的HTTP <code>ContentType</code>类型给每个文档</p> + +<ul> + <li>如果您正在使用Apache Web服务器,只需将此示例.htaccess文件复制到包含要使用正确MIME类型发送的文件的目录中。 如果你有一个完整的文件子目录,只需将文件放在父目录中;您不需要将它放在每个子目录中。</li> + <li>如果您使用的是Microsoft IIS, 请参阅<a href="http://www.iana.org/assignments/media-types/index.html">IANA | MIME Media Types registry</a>这篇文章。</li> + <li>如果您使用服务器端脚本生成内容,通常可以在脚本顶部附近添加一行。 您可以从Perl,PHP,ASP或Java提供HTML以外的内容 - 只需相应地更改MIME类型即可。 + <ul> + <li>对于 Perl CGI,你应该在文档其他行之前输出 <code>print "Content-Type: text/html\n\n";</code>。如果您正在使用CGI模块, 你可以使用 <code>print $cgi->header('text/html');</code> 代替, 其中 <code>$cgi</code> 是对CGI实例的引用。</li> + <li>对于 PHP,你应该在文档其他行之前输出 <code>header('Content-Type: text/html');</code>。</li> + <li>对于 ASP, 你应该在文档其他行之前输出<code>response.ContentType = "text/html";</code>。</li> + <li>对于 Java servlet, 你需要在<code>doGet</code> 或 <code>doPost</code> 方法之前输出<code>response.setContentType("text/html");</code> ,其中 <code>response</code> 是对 <code>HttpServletResponse</code>的引用。</li> + </ul> + </li> +</ul> + +<h3 id="Related_Links" name="Related_Links">Related Links</h3> + +<ul> + <li><a href="/en/Incorrect_MIME_Type_for_CSS_Files" title="en/Incorrect_MIME_Type_for_CSS_Files">Incorrect MIME Type for CSS Files</a></li> + <li><a class="external" href="http://www.iana.org/assignments/media-types/index.html">IANA | MIME Media Types</a></li> + <li><a class="external" href="http://www.w3.org/Protocols/HTTP/1.1/spec.html">Hypertext Transfer Protocol — HTTP/1.1</a></li> + <li><a class="external" href="http://support.microsoft.com/default.aspx?sd=msdn&scid=kb;en-us;293336">Microsoft - 293336 - INFO: WebCast: MIME Type Handling in Microsoft Internet Explorer</a></li> + <li><a class="external" href="http://msdn.microsoft.com/workshop/networking/moniker/overview/appendix_a.asp">Microsoft - Appendix A: MIME Type Detection in Internet Explorer</a></li> + <li><a class="external" href="http://www.microsoft.com/windows/ie/downloads/critical/q290108/">Microsoft - Security Update, March 29, 2001</a></li> + <li><a class="external" href="http://www.microsoft.com/windows/ie/downloads/critical/Q313675/">Microsoft - Security Update, December 13, 2001</a></li> +</ul> + +<div class="originaldocinfo"> +<h3 id="Original_Document_Information" name="Original_Document_Information">Original Document Information</h3> + +<ul> + <li>Author: Bob Clary, date: 20 Feb 2003</li> +</ul> +</div> diff --git a/files/zh-cn/web/security/securing_your_site/index.html b/files/zh-cn/web/security/securing_your_site/index.html new file mode 100644 index 0000000000..be94236abd --- /dev/null +++ b/files/zh-cn/web/security/securing_your_site/index.html @@ -0,0 +1,48 @@ +--- +title: 确保你的站点安全 +slug: Web/Security/Securing_your_site +tags: + - HTTP + - NeedsTranslation + - Security + - TopicStub + - Web Development +translation_of: Web/Security/Securing_your_site +--- +<p>{{ draft() }}</p> + +<p>你可以采取一些措施来确保你的网站安全。本文提供了各种建议,以及提供更多有用信息的其他文章的链接。</p> + +<div class="note"><strong>Note:</strong> This article is a work in progress, and is neither complete nor does following its suggestions guarantee your site will be fully secure.</div> + +<h2 id="用户信息安全">用户信息安全</h2> + +<dl> + <dt><a href="/en/How_to_Turn_Off_Form_Autocompletion" title="en/How to Turn Off Form Autocompletion">如何关闭表单的自动完成功能</a></dt> + <dd>在Gecko中表单字段支持自动完成功能; 因此他们的值可以被记住,并且在下一次用户访问你的网站时自动被填充. 对于某些特定类型的数据, 你可能希望禁止这个功能.</dd> + <dt><a href="/en/CSS/Privacy_and_the_:visited_selector" title="en/CSS/Privacy and the :visited selector">隐私和:visited选择器</a></dt> + <dd>这篇文章讨论对于<code>getComputedStyle()</code>方法的改动, 消除恶意站点获取用户浏览历史的能力.</dd> +</dl> + +<h2 id="内容安全">内容安全</h2> + +<dl> + <dt><a href="/en/Properly_Configuring_Server_MIME_Types" title="en/Properly Configuring Server MIME Types">正确配置服务器的 MIME 类型</a></dt> + <dd>不正确的 MIME 类型有几种方式可以对您的站点造成潜在的安全问题. 这篇文章解释了其中的几种方式, 并且向您展示如何配置您的服务器,以让它使用正确的 MIME 类型提供文件服务.</dd> + <dt><a href="/en/Security/HTTP_Strict_Transport_Security" title="en/Security/HTTP Strict Transport Security">HTTP Strict Transport Security</a></dt> + <dd><code>Strict-Transport-Security:</code> 这个HTTP头允许站点只能使用 HTTPS。</dd> + <dt><a href="/En/HTTP_access_control" title="En/HTTP access control">HTTP 访问控制</a></dt> + <dd><span class="tlid-translation translation" lang="zh-CN"><span title="">跨源资源共享标准提供了一种指定可从其他域加载的内容的方法。</span> <span title="">您可以使用它来防止您的网站被不正当地使用;</span> <span title="">此外,您可以使用它来建立明确允许其他站点使用的资源。</span></span></dd> + <dt><a href="/en/Security/CSP" title="en/Security/CSP">内容安全策略</a></dt> + <dd>一种附加的安全层,有助于检测和减轻某些类型的攻击,包括跨站脚本(XSS) 以及数据注入攻击。 <span class="tlid-translation translation" lang="zh-CN"><span title="">这些攻击用于从数据窃取到站点破坏或恶意软件分发的所有内容。</span></span></dd> + <dt><a href="/en-US/docs/Web/HTTP/X-Frame-Options" title="en/The X-FRAME-OPTIONS response header">X-Frame-Options 响应头</a></dt> + <dd> + <p><code>X-Frame-Options:</code>该<a href="/en/HTTP" title="en/HTTP">HTTP</a> <span class="tlid-translation translation" lang="zh-CN">响应头可用于指示是否应允许浏览器在{{HTMLElement("frame")}}中呈现页面。站点可以通过确保其内容未嵌入到其他站点中来避免点击劫持攻击。</span></p> + </dd> +</dl> + +<h2 id="另外参考">另外参考</h2> + +<ul> + <li><a class="external" href="http://www.owasp.org/">开放Web应用程序安全项目 (OWASP)</a></li> +</ul> diff --git a/files/zh-cn/web/security/securing_your_site/turning_off_form_autocompletion/index.html b/files/zh-cn/web/security/securing_your_site/turning_off_form_autocompletion/index.html new file mode 100644 index 0000000000..fe8e97cdef --- /dev/null +++ b/files/zh-cn/web/security/securing_your_site/turning_off_form_autocompletion/index.html @@ -0,0 +1,73 @@ +--- +title: 如何关闭表单自动填充 +slug: Web/Security/Securing_your_site/Turning_off_form_autocompletion +tags: + - Autocompletion + - Forms + - 安全 + - 指南 + - 自动填充 + - 表单 +translation_of: Web/Security/Securing_your_site/Turning_off_form_autocompletion +--- +<p>本文介绍了网站如何禁用表单字段的自动完成功能。</p> + +<p>默认情况下,浏览器会记录用户网页上提交的<a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">输入</a>框的信息。这使得浏览器能够提供自动补全(在用户开始输入的时候给用户提供可能的内容)和自动填充(在加载的时候预先填充某些字段)功能。</p> + +<p>这些功能通常是默认启用的,但可能涉及用户的隐私,因此浏览器允许用户禁用这些功能。然而,一些数据可能会在将来失效(例如一次性密码)或包含敏感信息(例如唯一的政府身份识别码或信用卡安全码)。作为网站作者,你可能更希望浏览器不去记住这些字段的值,即使浏览器的自动填充功能已开启。</p> + +<p>重要的是,如果你关闭了自动填充,你就违反了这一条规则,<a href="https://www.w3.org/WAI/WCAG21/Understanding/identify-input-purpose.html">1.3.5: Identify Input Purpose in WCAG 2.1</a>。如果你制作的网站应该遵守WCAG,你就应该使用自动填充和自动补全。</p> + +<h2 id="禁用自动填充">禁用自动填充</h2> + +<p>要禁用的表单自动填充,你可以将 {{htmlattrxref("autocomplete", "input")}} 的属性设置为 "off":</p> + +<pre class="brush: html notranslate">autocomplete="off"</pre> + +<p>可以为整个表单设置或为表单中某个输入元素单独设置:</p> + +<pre class="brush: html notranslate"><form method="post" action="/form" autocomplete="off"> +[…] +</form></pre> + +<pre class="brush: html notranslate"><form method="post" action="/form"> + […] + <div> + <label for="cc">信用卡:</label> + <input type="text" id="cc" name="cc" autocomplete="off"> + </div> +</form></pre> + +<p>设置 <code>autocomplete="off"</code> 会有两种效果:</p> + +<ul> + <li>这会告诉浏览器,不要为了以后在类似表单上自动填充而保存用户输入的数据。但浏览器不一定遵守。</li> + <li>这会阻止浏览器缓存会话历史记录中的数据。若表单数据缓存于会话历史记录,用户提交表单后,再点击返回按钮返回之前的表单页面,则会显示用户之前输入的数据。</li> +</ul> + +<p>如果即使在 autocomplete 已经设置为 off 时,浏览器仍继续提供输入建议,那么你需要更改输入元素的 name 属性。</p> + +<h2 id="自动填充属性和登录">自动填充属性和登录</h2> + +<p>现代浏览器实现了内建的密码管理功能:当用户在一个网站上输入了用户名和密码,浏览器会为用户提供记忆功能。当用户再次访问这个网站时,浏览器使用保存的值自动填写登录字段。</p> + +<p>另外,浏览器可让用户指定一个主密码用来加密存储的登录信息。</p> + +<p>即使没有主密码,浏览器内置的密码管理对安全也有益无害。由于用户不需要记住已被浏览器存储的密码,因此他们可以放心选择更强的密码。</p> + +<p>由于这个原因,许多现代浏览器都不支持在登录字段中设置 <code>autocomplete="off"</code> :</p> + +<ul> + <li>如果一个网站为<a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form">表单</a>设置了<code>autocomplete="off"</code>,表单中包含用户名和密码字段,浏览器仍会为这次登录提供记忆功能,并且如果用户同意,用户在下一次访问网站时,浏览器会自动填写这些字段。</li> + <li>如果网站给用户名和密码的<a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">输入</a>框设置了 <code>autocomplete="off"</code>,浏览器仍会为这次登录提供记忆功能,并且如果用户同意,用户在下一次访问网站时,浏览器会自动填写这些字段。</li> +</ul> + +<p>这是 Firefox(38+)、Google Chrome(34+)、Internet Explorer(11+)上的表现。</p> + +<h3 id="使用_autocompletenew-password_阻止自动填充">使用 autocomplete="new-password" 阻止自动填充</h3> + +<p>如果你定义了一个用户管理页面,其中用户可以为其他人指定新的密码,因此你想阻止密码字段的自动填充,你可以使用 <code>autocomplete="new-password"</code>。</p> + +<p>这只是一个提示,浏览器不一定要遵守。但现代浏览器都已停止在设置了 <code>autocomplete="new-password"</code> 的 <code><input></code> 元素上使用自动填充。例如,Firefox 67 版(见 {{bug(1119063)}})在这种情况下会停止自动填充;而 Firefox 70版(见 {{bug(1565407)}})则可以建议一个安全生成的密码,而不自动填充已保存的密码。更多细节参见 <a href="https://wiki.developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete#Browser_compatibility"><code>autocomplete</code> compat table</a>。</p> + +<p>{{QuickLinksWithSubpages("/en-US/docs/Web/Security")}}</p> |