【问题标题】:Good way to sanitize input in classic asp在经典asp中清理输入的好方法
【发布时间】:2021-11-04 12:59:32
【问题描述】:

我必须更新工作中的旧项目。虽然我熟悉 php 脚本,但我没有任何经典 asp 的经验。

  • 有什么我应该使用的功能吗?
  • 能否为我提供一些基本保护的好功能?
  • 在 asp 中有没有类似参数化查询的东西?

谢谢!

【问题讨论】:

  • “清理”是思考问题的错误方式。

标签: security asp-classic sanitization


【解决方案1】:

是的,您可以在经典 ASP(更准确地说,经典 ADO)中使用参数化查询。

这是link

至于编码输出,我可能想为最新的 Microsoft Anti-XSS 库创建一个包装器,并使用 Server.CreateObject 调用它。由于我在 .Net 中花费的时间更多,因此我远不是这类事情的专家,所以我认为这会起作用。

Server.HTMLEncode 确实不够好,因为它只将一些编码字符列入黑名单。 Anti-XSS 库要好得多,因为它将可接受的内容列入白名单。

【讨论】:

  • +1 用于包装 Microsoft Anti-XSS 库。经过多次试验和错误,这就是我们最终要做的。
  • 换句话说:您对其进行消毒。您将其隔离到它自己的地方,在那里没有危险,它可以被视为代码。
  • 小心使用 CreateObject 调用服务器应用程序上的 COM 资源。当其他用户激活相同时,它会实例化多个进程,并可能导致资源和权限问题,从而导致 500 错误。
【解决方案2】:

始终使用 Server.HTMLEncode 清理用户输入。

例如,如果您从表单文本框中设置变量:

firstName = Server.HTMLEncode(trim(request.form("firstname")))

【讨论】:

  • 实际上,您永远不应该使用 HTMLEncode 清理输入。这仅对清理 输出 有用。无法保证输入将由 Web 浏览器显示。唯一需要保护的是 SQL 注入(例如,单引号字符和分号)。更好的是要求例如在查询参数中使用 CLNG 的 int。
【解决方案3】:

注意 SQL 注入。不要将用户输入连接到 SQL 字符串然后执行它。相反,始终使用参数化查询。

【讨论】:

  • 是的,我可以在经典的 asp 中使用参数化查询吗?
【解决方案4】:

有很多以 Is 开头的函数,例如 IsNumberIsArray 等等,可能会很有趣。此外,如果您需要一个整数,您可以使用CLng(Request("blabla")) 来获取它,因此如果它不是整数,CLng 函数将引发错误。

【讨论】:

    【解决方案5】:

    一种方法可能是在header.asp 文件中添加一个检查,该文件遍历Request 对象以查找不适当的字符。例如:

    <%
        for each x in Request.Form ' Do this for Request.Querystring also
            If InStr(x,"<") <> 0 Then
                ' encode the value or redirect to error page?
            End If
        next
    %>
    

    【讨论】:

    • Request 对象是只读的,因此您无法直接编辑值,但我为某些项目创建了一个 Dictionary 对象,我已将传入表单中的所有值转储到该对象中,并且这些值可以以任何你喜欢的方式进行操作......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 2010-10-28
    • 1970-01-01
    • 2016-07-21
    • 2017-07-22
    相关资源
    最近更新 更多