我正在为公共消费编写一个Web应用程序......您如何克服/处理对用户输入的恐惧?作为一名Web开发人员,您知道存在的技巧和漏洞,特别是在Web上可以利用这些技巧和漏洞,使用像Firebug等附加组件更容易使用
有时它会如此压倒你只想忘记整个交易(确实让你欣赏内联网开发!)
很抱歉,如果这不是一个可以简单回答的问题,但也许是有用的想法或策略......谢谢!
答案 0 :(得分:5)
一个词:服务器端验证(好吧,可能是三个单词)。
答案 1 :(得分:3)
在其他答案中有很多合理的建议,但我会添加一个较少的“编程”答案:
有计划处理它。
准备好应对恶意用户设法偷偷摸摸的事情。制定计划以减轻损害,恢复干净和完整的数据,并与用户(以及可能的其他利益相关方,如您持有的任何信用卡详细信息的发行人)进行沟通,以告诉他们发生了什么。知道如何检测违规并将其关闭。知道关键的操作和开发人员是可以到达的,所以在公共假期前的星期五下午5:01发现的坏人在离线前不会超过72个小时,更不用说开始修理。
制定计划并不能帮助你阻止糟糕的用户输入,但它可以帮助你克服恐惧。
答案 2 :(得分:2)
如果与“安全”相关的问题只需要推动它,那么安全性和漏洞就是软件生活中的事实,它们需要作为开发过程的一部分正面解决。
以下是一些建议:
答案 3 :(得分:1)
这很容易用粗体字写,在实践中更难做。
答案 4 :(得分:1)
首先,我会通过指出偏执狂是好事来安慰你。就像驾驶时有点害怕一样,害怕用户输入也是好事。尽可能多地假设最坏的情况,你不会失望。
第二,防守计划。假设您与外界的任何通信都完全受到损害。仅接收用户应该能够控制的参数。仅公开用户应该能够看到的数据。
清理输入。消毒消毒消毒。如果它的输入将显示在网站上(排行榜的昵称,论坛上的消息,任何内容),请对其进行适当的清理。如果它的输入可能被发送到SQL,那么也要清理它。实际上,甚至不要直接编写SQL,使用某种中介。
如果你使用HTTP,那么你真的只有一件事是无法防范的。如果您使用cookie来识别某人的身份,那么如果他们都使用相同的无线连接,那么就无法阻止咖啡馆中的其他人嗅到该咖啡馆中其他人的cookie。只要他们没有使用安全连接,没有什么可以拯救你。甚至Gmail也无法抵御这种攻击。你唯一能做的就是确保一个授权cookie不能永远持续下去,并考虑让他们重新登录,然后再做一些像改变密码或购买东西这样的大事。
但不要冒汗。你正在构建的任何系统都已经处理了很多安全细节(你正在建立在SOMETHING之上,不是吗?Spring MVC?Rails?Struts?)。这真的不那么难。如果存在巨额资金,您可以向安全审计公司付款以试图破解它。如果没有,只要试着考虑一切合理的东西,并在找到它们时修复漏洞。
但不要停止偏执。他们总是出去找你。这只是受欢迎的一部分。
P.S。还有一点提示。如果你有这样的javascript:
if( document.forms["myForm"]["payment"].value < 0 ) {
alert("You must enter a positive number!");
return false;
}
然后你肯定在后端有代码:
verify( input.payment >= 0 )
答案 5 :(得分:1)
我总是做的事情是将所有用户字符串包装在一个对象中,类似于StringWrapper
,这会强制您调用编码方法来获取字符串。换句话说,只需提供对s.htmlEncode()
s.urlEncode().htmlEncode()
等的访问权限。当然,您需要获取原始字符串,这样您就可以使用s.rawString()
方法,但现在您可以使用{{1}}方法获取审查原始字符串的所有用法。
因此,当您来'echo userString'时,您将收到类型错误,然后提醒您通过公共方法对字符串进行编码/转义。
其他一些常规事项:
答案 6 :(得分:0)
“引用”所有内容,使其在“目标”语言中没有任何意义:SQL,HTML,JavaScript等。
这会妨碍当然,所以你必须小心识别何时需要特殊处理,比如通过管理权限来处理一些数据。
答案 7 :(得分:0)
有多种类型的注入和跨站点脚本(请参阅this earlier answer),但有针对所有这些脚本的防御措施。您显然希望查看存储过程,白名单(例如HTML输入)和验证,以便开始。
除此之外,很难提供一般性建议。其他人提供了一些很好的技巧,例如总是进行服务器端验证和研究过去的攻击。</ p>
保持警惕,但不要害怕。
答案 8 :(得分:0)
您可以使用validation framework 在帮助下自动化验证 自定义验证属性。
<强> http://imar.spaanjaars.com/QuickDocId.aspx?quickdoc=477 强>
答案 9 :(得分:0)
对于您正在使用的语言/系统,应该有一些已知漏洞的文档。我知道Zend PHP认证涵盖了这个问题,你可以阅读学习指南。
为什么不聘请专家不时审核您的申请?考虑到您的关注程度,这是值得的投资。
答案 10 :(得分:0)
我们的客户总是说:“处理我的用户,因为他们不区分日期和文本字段!!”
我在Java中编码,我的代码充满了asserts
我假设客户端出现了一切错误,我在服务器上检查了一切。
答案 11 :(得分:0)
#1对我来说,总是构造静态SQL查询并将数据作为参数传递。这限制了您必须处理的引用问题。另请参阅http://xkcd.com/327/
这也有性能优势,因为您可以重复使用准备好的查询。
答案 12 :(得分:0)
实际上只需要处理两件事:
避免使用SQL injection。使用参数化查询将用户控制的输入保存在数据库中。用Java术语:使用PreparedStatement
。在PHP术语中:使用mysql_real_escape_string()
或PDO。
避免使用XSS。在显示期间退出用户控制的输入。在Java / JSP术语中:使用JSTL <c:out>
。在PHP术语中:使用htmlspecialchars()
。
这就是全部。您无需担心数据的格式。关于你如何处理它的方式。