描述您现在应该在构建软件时所做的事情,因为它们随着时间的推移而增加,并且最终变得越来越多或不可能。
如果您'重新建立一个热门的新网络启动,就会有很多决定是为了重新关注的内容。大多数事情,你' ll build将需要大约相同的时间来构建,而不管您建立它们的顺序,还有少数内容,稍后修复更昂贵。
如果你不在发展中尽早做这些事情,他们会变得非常努力地努力。这基本上是一个拯救表面的东西列表,如果有人在开发过程中早些时候有人在他们身上有一段时间,那么就可以获得大量的时间和努力。
如果您'重新使用整数ID来识别数据或对象,Don' T在1.以巨大的数字(例如,2 ^ 33)启动它们,以便在任何其他角色中出现任何对象ID Willever您的应用程序(如计数,NatherIndex,字节大小,时间戳等)。如果你做的是,这需要大约5秒钟,你会推出并缩短一大群令人讨厌的臭虫。只要您拥有生产数据,它就会非常困难。
此原因的那种错误是偶然地使用一些其他值作为ID:
//加载用户'朋友,返回friend_id =&gt的地图; true $ fired_ids = user_get_friends($ user_id); //获得前8个朋友。$ first_few_friends = array_slice($ fired_ids,0,8); //渲染这些朋友.Render_user_friends($ user_id,array_keys($ first_few_friends);
因为array_slice()在php中丢弃阵列索引并重新编写它们,这是' t' t' s的前8个朋友,但用户有ids 0到7的用户,例如。 Mark Zuckerberg(ID 4)和Dustin Moskovitz(ID 6)。如果您在此idange中有ID,那么稍后是ISN' T一个ID将被视为idand的ID,操作将有效并导致意外行为。如果您在巨大号码中启动ID,则这是可以避免的。
在大多数情况下,您可以忽略UTF-8和Unicode,直到稍后。但是,其中Unicode的一个方面您现在应该解决:仅存储有效的UTF-8字符串。
假设您'在内部存储数据作为UTF-8(这几乎肯定的选择,并且肯定是正确的选择如果您不知道如何Unicodeworks),您只需要在您的应用程序中消毒所有数据并确保它&# 39; S有效的UTF-8。
如果您的应用程序发出无效的UTF-8,其他系统(如浏览器)以意想不到和有趣的方式遗漏。您最终将被迫核查,您只能享受有效的UTF-8以避免这些问题。如果你没有' tsanitized你的数据,你' ll基本上有两个选项:
截至2011年Facebook在第二组中,并在前往浏览器的路上花费了几毫秒的OFCPU时间消毒,这将为数百个服务器的CPU坐在Datacent的utf-8的价格中。数据库。
您可能会对Unicode学习足够的信息,以在几个小时内解决这个问题。你不需要学习,只是基础知识。您的语言可能已经有一个函数,这些功能将对您进行消毒。
当您有替代方案时,Don' t设计安全系统,这些安全系统是DefaultPermit,基于黑名单的或以其他方式枚举不良的尝试。当Facebook推出平台时,它用基于黑名单的CSS过滤器推出,这依赖于所有的CSS过滤器,以枚举所有"坏" CSS的一部分并过滤。这是一个糟糕的设计选择,并导致基本上是无限的安全孔。
非常困难在复杂的系统和坏战中枚举不良,但是一个移动的目标。而不是尝试这样做,设计白名单的安全系统,您列出了允许的东西,并拒绝任何您不' tunerstand。假设事情很糟糕,直到你验证它们'重新确定。
设计基于黑名单的系统很容易,因为它们更容易编写和接受更多输入。对于CSS过滤器,产品目标是使用户能够正常使用CSS,并认为该系统与他们熟悉的系统没有什么不同。基于白名单的系统将拒绝某些有效,安全的输入并造成产品摩擦。
但这是一个比基于黑名单的系统无法拒绝某些危险输入并创建安全漏洞的替代方案更好的世界。它还会产生产品摩擦,因为修复这些孔时会破坏现有的用途,并且向后兼容的摩擦使将系统从黑名单迁移到白名单非常困难。因此,无论您做什么,基本上都不会遇到麻烦,并且需要立即破解很多安全漏洞,因此您甚至没有时间为自己感到难过。
设计基于黑名单的安全性是您现在可以进行的最糟糕的折衷之一。另请参见"计算机安全中的六个最笨拙的想法&#34 ;:
如果您不使用SQL,则不适用,但如果您使用的是:检测何时由于语法错误而导致查询失败(在MySQL中,错误为1064)。如果故障发生在生产中,则应尽可能大声地进行故障。 (我在2008年在Facebook上实现了此功能,并直接将其发送给我和其他几个人。系统最终得到了完善。)
这基本上会创建一个高信号流,告诉您应用程序中SQLinjection漏洞的位置。它会有一些误报,理论上也可能有误报,但是在Facebook上,考虑到信号的重要性,信号很高。
当然,这里真正的解决方案是永远在您的应用程序中没有SQL注入孔。据我所知,该系统正确地检测到我们从2008年中期到我在2011年离开时所遇到的oneSQL注入漏洞,该漏洞属于一个隔离的半生产层的ahackathon项目,并且没有使用查询转义系统,其余的应用程序都可以。
希望无论您使用哪种语言编写的代码,都可以使用良好的查询库来为您进行转义。如果是这样,请使用它们。如果您正在使用PHP并且还没有合适的解决方案,则qsprintf()的Phabricator实现类似于Facebook的系统,并且在该系统中很成功。