如何克服对用户输入的恐惧(网络开发)

时间:2009-12-20 06:16:10

标签: user-input

我正在为公共消费编写一个Web应用程序......您如何克服/处理对用户输入的恐惧?作为一名Web开发人员,您知道存在的技巧和漏洞,特别是在Web上可以利用这些技巧和漏洞,使用像Firebug等附加组件更容易使用

有时它会如此压倒你只想忘记整个交易(确实让你欣赏内联网开发!)

很抱歉,如果这不是一个可以简单回答的问题,但也许是有用的想法或策略......谢谢!

13 个答案:

答案 0 :(得分:5)

一个词:服务器端验证(好吧,可能是三个单词)。

答案 1 :(得分:3)

在其他答案中有很多合理的建议,但我会添加一个较少的“编程”答案:

有计划处理它。

准备好应对恶意用户设法偷偷摸摸的事情。制定计划以减轻损害,恢复干净和完整的数据,并与用户(以及可能的其他利益相关方,如您持有的任何信用卡详细信息的发行人)进行沟通,以告诉他们发生了什么。知道如何检测违规并将其关闭。知道关键的操作和开发人员是可以到达的,所以在公共假期前的星期五下午5:01发现的坏人在离线前不会超过72个小时,更不用说开始修理。

制定计划并不能帮助你阻止糟糕的用户输入,但它可以帮助你克服恐惧。

答案 2 :(得分:2)

如果与“安全”相关的问题只需要推动它,那么安全性和漏洞就是软件生活中的事实,它们需要作为开发过程的一部分正面解决。

以下是一些建议:

  • 保持透视 - 安全,漏洞利用和妥协将发生在任何流行或有用的应用程序中,为它们做好准备并期望它们发生
  • 测试,然后重新测试 - QA,验收测试和签收应该是您设计和制作过程的一流部分,即使您是一个单独的商店。将用户作为专用(和声音)用户进行测试将是您发现问题最有用的工具
  • 了解您的平台 - 确保您了解所部署的技术和硬件。确保应用相关修补程序和安全更新
  • 研究 - 查看与您自己类似的应用程序,查看他们遇到的问题,浏览他们的论坛,阅读他们的错误日志等。
  • 务实 - 你无法修复每一个漏洞并关闭每个漏洞。挑选最有影响力的那些并解决这些问题
  • 很多眼睛 - 尽可能多的人来审查您的设计和代码。这应该是您的质量保证资源的补充

答案 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'时,您将收到类型错误,然后提醒您通过公共方法对字符串进行编码/转义。

其他一些常规事项:

  • 首选黑名单上的白名单
  • 不要过分摒弃糟糕的输入。我希望能够使用&lt;帖子/评论/等中的角色!只需确保正确编码数据
  • 使用参数化SQL查询。如果您是自己的SQL转义用户输入,那么您做错了。

答案 6 :(得分:0)

“引用”所有内容,使其在“目标”语言中没有任何意义:SQL,HTML,JavaScript等。

这会妨碍当然,所以你必须小心识别何时需要特殊处理,比如通过管理权限来处理一些数据。

答案 7 :(得分:0)

有多种类型的注入和跨站点脚本(请参阅this earlier answer),但有针对所有这些脚本的防御措施。您显然希望查看存储过程,白名单(例如HTML输入)和验证,以便开始。

除此之外,很难提供一般性建议。其他人提供了一些很好的技巧,例如总是进行服务器端验证和研究过去的攻击。<​​/ p>

保持警惕,但不要害怕。

答案 8 :(得分:0)

  • 网络应用程序层无验证。
  • 所有验证和安全检查应由域层或业务层完成。
  • 使用有效的错误消息抛出异常,并在表示层或Web应用程序中捕获和处理这些异常。
  

您可以使用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)

实际上只需要处理两件事:

  1. 避免使用SQL injection。使用参数化查询将用户控制的输入保存在数据库中。用Java术语:使用PreparedStatement。在PHP术语中:使用mysql_real_escape_string()PDO

  2. 避免使用XSS。在显示期间退出用户控制的输入。在Java / JSP术语中:使用JSTL <c:out>。在PHP术语中:使用htmlspecialchars()

  3. 这就是全部。您无需担心数据的格式。关于你如何处理它的方式。