在将网站公开之前,实现Web应用程序技术细节的程序员应考虑哪些方面?如果Jeff Atwood可以忘记同一站点中所有的HttpOnly cookie,站点地图和跨站点请求伪造,那么我还能忘记什么重要的事情?
我正在从Web上考虑这一点开发人员的观点,例如其他人正在为网站创建实际的设计和内容。因此,尽管可用性和内容可能比平台更重要,但是您在程序员中几乎没有发言权。您需要担心的是,您的平台实施稳定,性能良好,安全并且可以满足任何其他业务目标(例如花费不多,构建时间太长,并且在Google中的排名与内容支持)。
从开发人员的角度考虑这一点,该开发人员已在一个相当受信任的环境中为Intranet类型的应用程序做过一些工作,并且即将第一枪并为整个开发一个潜在的流行网站糟糕的万维网。
此外,我正在寻找比起模糊的“网络标准”响应更具体的内容。我的意思是,HTML,JavaScript和HTTP上的CSS几乎都是给定的,尤其是当我已经指定您是专业的Web开发人员时。那么,超越那个标准呢?在什么情况下,为什么?提供指向该标准规范的链接。
#1 楼
这里的想法是,我们大多数人应该已经知道此列表中的大部分内容。但是可能只有一两个您从未真正研究过,不完全了解甚至从未听说过的项目。界面和用户体验
请注意,浏览器执行的标准不一致,并确保您的网站在所有主要浏览器上都能正常运行。至少要针对最新的Gecko引擎(Firefox),WebKit引擎(Safari和某些移动浏览器),Chrome,受支持的IE浏览器(利用应用程序兼容性VPC图像)和Opera进行测试。还应考虑浏览器如何在不同的操作系统上呈现您的网站。
请考虑人们如何使用主要浏览器以外的网站,例如手机,屏幕阅读器和搜索引擎。 —一些可访问性信息:WAI和Section508,移动开发:MobiForge。
阶段:如何在不影响用户的情况下部署更新。有一个或多个测试或暂存环境可用于实现对体系结构,代码或主要内容的更改,并确保可以以受控方式部署它们而不会破坏任何内容。有一种自动方式,然后将批准的更改部署到实时站点。结合使用版本控制系统(git,Subversion等)和自动构建机制(Ant,NAnt等),可以最有效地实现此功能。
不要直接向用户显示不友好的错误用户。
请勿将用户的电子邮件地址以纯文本形式发送,否则将被垃圾邮件杀死。
将属性
rel="nofollow"
添加到用户生成的链接中,以避免垃圾邮件。在您的网站中建立经过深思熟虑的限制-这也属于安全性范围。
了解如何进行逐步增强。
如果POST成功,则在POST之后重定向,以防止刷新提交再次。
不要忘记考虑可访问性。这总是一个好主意,在某些情况下这是法律要求。 WAI-ARIA和WCAG 2是这方面的好资源。
阅读“别让我思考”。
安全性
摘要,但OWASP开发指南从上到下涵盖了网站的安全性。
了解注入特别是SQL注入以及如何防止注入。包括cookie和隐藏的表单字段值!)。
使用salt散列密码,并在行中使用不同的salt防止彩虹攻击。使用慢速哈希算法,例如bcrypt(经过时间测试)或scrypt(甚至更强,但较新)(1、2)来存储密码。 (如何安全存储密码)。 NIST还批准了PBKDF2来对密码进行哈希处理”,并且它已在.NET中获得FIPS的批准(更多信息在这里)。避免直接使用MD5或SHA系列。精美的身份验证系统。以微妙且无法测试的方式犯错是一件容易的事,直到被黑之前,您甚至都不知道。
了解处理信用卡的规则。(也请参阅此问题)
对输入敏感数据(例如凭据,个人身份信息,信用卡信息)的任何网站使用SSL / TLS / HTTPS。我们的加密是免费的证书颁发机构,可以为您提供帮助。
防止会话劫持。
避免跨站点脚本(XSS)。
避免跨站点请求伪造(CSRF)。
避免点击劫持。
使系统保持最新使用最新的修补程序。
确保数据库连接信息的安全。
让自己了解影响平台的最新攻击技术和漏洞。 tform。
阅读《 Google浏览器安全手册》。
阅读《 Web应用程序黑客手册》。
考虑最小特权原则。尝试以非超级用户身份运行您的应用服务器。 (tomcat示例)
在所有用户提供的带有
rel="noopener noreferrer"
的链接上放置target="_blank"
,以防止目标页面上的JavaScript将您的页面重定向到其他地方,例如假登录页面。更多信息考虑使用严格的内容安全策略。
性能
必要时实施缓存,正确理解和使用HTTP缓存以及HTML5清单。 >合并/连接多个样式表或多个脚本文件,以减少浏览器连接的数量,并提高gzip压缩文件之间重复项的能力。
请访问Yahoo Exceptional Performance网站,其中有很多很棒的指南,包括改进前端-最终性能及其YSlow工具(需要Firefox,Safari,Chrome或Opera)。另外,Google页面速度(与浏览器扩展一起使用)是性能分析的另一种工具,它也可以优化图像。 br />将SVG图像精灵用于工具栏等较小的相关图像。 SVG着色有点棘手。您可以在此处阅读。
繁忙的网站应考虑跨域拆分组件。具体来说...
静态内容(即图像,CSS,JavaScript和通常不需要访问Cookie的内容)应放在一个不使用Cookie的单独域中,因为该域及其域的所有Cookie子域随每个请求一起发送到该域及其子域。这里的一个不错的选择是使用内容分发网络(CDN),但要考虑CDN可能会失败的情况,方法是包括其他CDN或可以提供的本地副本。
最小化浏览器呈现页面所需的HTTP请求总数。
选择模板引擎并使用gulp或grunt等任务运行器呈现/预编译它
确保其中包含
favicon.ico
文件网站的根目录,即/favicon.ico
。即使HTML中根本没有提到图标,浏览器也会自动请求它。如果没有/favicon.ico
,这将导致大量404,从而耗尽服务器的带宽。SEO(搜索引擎优化)
使用“搜索引擎友好”网址,即使用
example.com/pages/45-article-title
代替example.com/index.php?page=45
将
#
用作动态内容时,将#
更改为#!
,然后在服务器上使用$_REQUEST["_escaped_fragment_"]
代替googlebot而不是#!
。换句话说,./#!page=1
变为./?_escaped_fragments_=page=1
。另外,对于可能使用FF.b4或Chromium的用户,history.pushState({"foo":"bar"}, "About", "./?page=1");
是一个不错的命令。因此,即使地址栏已更改,页面也不会重新加载。这样,您就可以使用?
而不是#!
来保留动态内容,并在通过电子邮件向我们发送此页面后的链接时通知服务器,并且AJAX无需再次提出其他请求。不要使用说“单击此处”的链接。您正在浪费SEO机会,这会使使用屏幕阅读器的人感到更难。
拥有XML网站地图,最好在默认位置
/sitemap.xml
。当您有多个指向同一个URL时,请使用
<link rel="canonical" ... />
内容,也可以通过Google网站管理员工具解决此问题。使用Google网站管理员工具和Bing网站管理员工具。
立即开始安装Google Analytics(分析)(或像Matomo这样的开源分析工具)。
请知道robots.txt和搜索引擎蜘蛛的工作方式。那里可能有行为不端的蜘蛛。
如果您有非文本内容,请查看Google的视频等站点扩展。在Tim Farley的答案中有一些很好的信息。
技术
了解HTTP以及诸如GET,POST,会话,Cookie之类的东西,以及“无状态”的含义。
根据W3C规范编写XHTML / HTML和CSS,并确保它们能够通过验证。这样做的目的是避免浏览器怪异的模式,并且作为一个额外的好处,可以更轻松地与非传统浏览器(例如屏幕阅读器和移动设备)一起使用。
了解如何在浏览器中处理JavaScript。
了解如何加载页面使用的JavaScript,样式表和其他资源,并考虑它们对感知性能的影响。现在,广泛认为将脚本移动到页面底部是适当的,但通常是诸如分析应用程序或HTML5填充之类的异常。 >请注意,JavaScript可以并且将被禁用,因此AJAX是扩展,而不是基准。即使大多数用户现在仍将其保留,请记住NoScript变得越来越流行。即使现代的爬虫机器人支持将JavaScript生成的内容编入索引,请考虑将服务器端呈现用于其他爬虫机器人或禁用JavaScript的用户。
了解301和302重定向之间的区别(这也是SEO问题)。
尽可能多地了解您的部署平台。
考虑使用Reset Style Sheet或normalize.css。
考虑JavaScript框架(例如jQuery,MooTools,Prototype,Dojo或YUI) 3),这将在使用JavaScript进行DOM操作时隐藏很多浏览器差异。
将可感知的性能和JS框架结合在一起,请考虑使用诸如Google Libraries API之类的服务来加载框架,以便浏览器可以使用已缓存的框架的副本,而不是从您的站点下载副本。
不要重新发明轮子。在进行任何操作之前,请搜索有关如何执行操作的组件或示例。有人完成并发布了OSS版本的代码的机率高达99%。另一方面,在确定需求之前,不要从20个库开始。特别是在客户端Web上,保持事物的轻量化,快速和灵活几乎最终变得越来越重要。
错误修复
了解您会花费20%的时间进行编码,而80%的时间用于维护,因此进行相应的编码。
建立一个好的错误报告解决方案。
有一个系统供人们与您联系以提出建议和批评。 >记录该应用程序如何用于将来的支持人员和进行维护的人员。
进行频繁备份! (并确保这些备份可以正常使用)有一个还原策略,而不仅仅是备份策略。
使用版本控制系统来存储文件,例如Subversion,Mercurial或Git。
不要忘记做验收测试。 Selenium等框架可以提供帮助。尤其是如果您完全自动化测试,也许可以使用诸如Jenkins之类的持续集成工具。
请确保使用诸如log4j,log4net或log4r之类的框架具有足够的日志记录。如果您的实时站点出了点问题,则需要一种找出原因的方法。
记录日志时,请确保同时捕获已处理的异常和未处理的异常。报告/分析日志输出,因为它将向您显示站点中关键问题的位置。
其他
同时实现服务器端和客户端方面的监视和分析(应该是主动而不是被动)。
使用诸如UserVoice和Intercom之类的服务(或任何其他类似工具)来不断与您的用户保持联系。因为它们不是有用的答案,而是因为它们太详细,超出范围,或者对于希望了解他们应该了解的事情的人来说太过分了。也请随时进行编辑,我可能错过了一些东西或犯了一些错误。
评论
您的某些SEO建议是不好的。使用表格还是div都没关系(Google本身已经确认了这一点)。那个SEF URL东西……我讨厌那些“假URL”,其中ID是唯一真正确定页面的东西。 “ 45-blah”将是同一页。这也不是用户友好的。
–心怀不满的山羊
09年3月6日在0:29
然后编辑它。我并没有写大部分内容:我只是维护它-我继承了这份工作,因为我问了这个问题,专门征求了这个更大的答案,并且我真的很想知道我们能提出什么。贡献越多越好。
–乔尔·科恩(Joel Coehoorn)
09年3月16日在1:18
还有一点要注意:如果您确实要回来编辑它,请尽量尊重所写内容。不要仅仅删除您不同意的部分:实际上要花一些时间解决缺点并提供更好的东西。
–乔尔·科恩(Joel Coehoorn)
09年3月16日在1:19
我建议您添加到“安全性”部分的一件事是,应将您提供的所有文件与允许的文件夹白名单进行比较,或将Web服务器“监禁”。这样可以阻止有人使用http://server/download.php?file = .. / .. / etc / password。切勿向用户公开文件路径。
– Philluminati
2011-2-12在13:24
例如,您不仅会跳上汽车并开始驾驶。取而代之的是,您要学习有关该车的正确操作的课程,并最终必须通过测试以证明自己可以驾驶。对于某些人来说,这需要很多很多小时的学习。是的,我等同于学习如何正确构建Web应用程序与学会驾驶汽车,因为与正确的挡泥板弯折机相比,无法正确构建应用程序肯定会导致更大程度的破坏人们的生命,包括更大范围的破坏。经济损失。死亡?好吧,取决于开发人员搞砸了哪种类型的应用程序。
–NotMe
2012年4月24日4:36