代码之家  ›  专栏  ›  技术社区  ›  davidsleeps

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

  •  4
  • davidsleeps  · 技术社区  · 16 年前

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

    有时候,它是如此的让人难以承受,以至于你想忘记整个过程(但这确实让你很欣赏内部网的开发!)

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

    13 回复  |  直到 16 年前
        1
  •  5
  •   ChssPly76    16 年前

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

        2
  •  3
  •   itowlson    16 年前

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

    做好准备,以防恶意用户从你身边偷偷溜走。制定计划以减轻损害,恢复干净完整的数据,并与用户(以及潜在的其他相关方,如您持有的任何信用卡详细信息的发行人)沟通,告诉他们发生了什么。知道如何发现漏洞并关闭它。要知道关键的运营和开发人员是可以联系到的,因此,一个坏人在公共假日前的周五下午5:01发动袭击,在你下线之前不会有72个小时以上的空闲时间,更不用说开始解决问题了。

        3
  •  2
  •   GrayWizardx    16 年前

    如果您需要解决与“安全性”相关的问题,那么安全性和漏洞利用是软件生命中的一个事实,它们需要作为开发过程的一部分迎面解决。

    以下是一些建议:

    • 正确看待它——任何流行或有用的应用程序都会发生安全性、漏洞利用和危害,请做好准备并期待它们的出现
    • 测试它,然后再次测试-QA、验收测试和签核应该是您的设计和生产过程的一流部分,即使您是一个人的车间。让用户作为一个专门的(有声的)用户进行测试将是你发现问题的最有用的工具
    • 了解您的平台-确保您了解正在部署的技术和硬件。确保应用了相关修补程序和安全更新
    • 研究-查看与您自己的应用程序相似的应用程序,看看他们遇到了什么问题,浏览他们的论坛,阅读他们的bug日志等。
    • 多看一眼——争取尽可能多的人来审查你的设计和代码。这应该是对QA资源的补充
        4
  •  1
  •   Kobi    16 年前
    • 检查服务器端的所有内容-再次验证输入,检查权限等。
    • 清理所有数据。

    用粗体字写起来很容易,但在实践中要做到这一点要难一些。

        5
  •  1
  •   Mike Weller    16 年前

    我经常做的事情是将所有用户字符串包装到一个对象中,比如 StringWrapper 它强制您调用编码方法来获取字符串。换句话说,只需提供访问 s.htmlEncode() s.urlEncode().htmlEncode() s.rawString()

    因此,当您使用“echo userString”时,会出现一个类型错误,然后会提醒您通过公共方法对字符串进行编码/转义。

    其他一些一般事项:

    • 喜欢白名单胜过黑名单
    • 不要过分地去除不好的输入。我希望能够使用<帖子/评论/等中的人物!只需确保数据编码正确即可
    • 使用参数化SQL查询。如果您自己正在SQL转义用户输入,那么您就做错了。
        6
  •  1
  •   Brandon Yarbrough    16 年前

    首先,我想通过指出偏执狂是好的来安慰你。就像开车时有点害怕是好的一样,害怕用户输入也是好的。尽可能多地假设最坏的情况,你就不会失望。

    第二,防御性编程。假设你与外部世界的任何交流都被完全破坏了。只接受用户应该能够控制的参数。仅公开用户应该能够看到的数据。

    清理输入。消毒消毒。如果是将在网站上显示的输入(排行榜的昵称、论坛上的消息等),请对其进行适当的清理。如果它是可能发送到SQL的输入,也要对其进行清理。事实上,甚至不要直接编写SQL,而是使用某种中介。

    但别担心。无论你在什么系统上构建,很多安全细节都会得到处理(你是在什么东西上构建的,不是吗?春季MVC?轨道?Struts?)。其实没那么难。如果牵涉到大笔资金,你可以付钱给一家安全审计公司,试图打破它。如果没有,那就试着想想一切合理的办法,一旦发现漏洞就修补。

    还有一个提示。如果您有如下javascript:

    if( document.forms["myForm"]["payment"].value < 0 ) {
      alert("You must enter a positive number!");
      return false;
    }
    

    verify( input.payment >= 0 )
    
        7
  •  0
  •   Don    16 年前

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

    当然,这会造成阻碍,因此您必须小心地确定何时需要特殊处理,例如通过管理权限来处理某些if数据。

        8
  •  0
  •   Community Mohan Dere    9 年前

    有多种类型的注入和跨站点脚本(请参阅 this earlier answer ),但它们都有防御措施。首先,您显然需要查看存储过程、白名单(例如,对于HTML输入)和验证。

    除此之外,很难给出一般性的建议。其他人给出了一些很好的建议,比如总是进行服务器端验证和研究过去的攻击。

    保持警惕,但不要害怕。

        9
  •  0
  •   this. __curious_geek    16 年前
    • web应用程序层中没有验证。
    • 所有验证和安全检查都应由域层或业务层完成。
    • 抛出带有有效错误消息的异常,并让这些执行在表示层或web应用程序上被捕获和处理。

    你可以用 validation framework 使用帮助自动执行验证 自定义验证属性的定义。

    http://imar.spaanjaars.com/QuickDocId.aspx?quickdoc=477

        10
  •  0
  •   Rimian    16 年前

    应该有一些您正在使用的语言/系统的已知漏洞的文档。我知道Zend PHP认证涵盖了这一问题,您可以阅读学习指南。

    为什么不雇佣一位专家来不时审核你的申请呢?考虑到你的关注程度,这是一项值得的投资。

        11
  •  0
  •   mohdajami    16 年前

    我们的客户总是说:“与我的用户打交道,因为他们不区分日期和文本字段!!”

    我用Java编写代码,代码中充满了 asserts 我假设客户端的一切都是错误的,我在服务器上检查所有这些。

        12
  •  0
  •   NickZoic    16 年前

    #对我来说,第一件事就是始终构造静态SQL查询,并将数据作为参数传递。这极大地限制了您必须处理的报价问题。另见 http://xkcd.com/327/

    这还具有性能优势,因为您可以重用准备好的查询。

        13
  •  0
  •   BalusC    16 年前

    实际上,您只需要注意两件事:

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

    2. 避开 XSS <c:out> . 在PHP术语中:使用 htmlspecialchars()

    这就是全部。您不必担心数据的格式。就跟你处理这件事的方式差不多。