【问题标题】:Can a URI variable ever be maliciousURI 变量会不会是恶意的
【发布时间】:2023-11-30 06:52:01
【问题描述】:

给出以下简单代码:

 function loadthis ($var)
 {
      $id = $this->model->get_id($var);
 } 

问题:是否可以通过 URI 变量传递任何恶意代码?

场景: www.mydomain.com/mycontroller/loadthis/dosomethingreallybadhere

额外信息:

  • 我在模型上使用活动记录,所以我知道他们不能进行 SQL 注入
  • 在此示例中,我没有使用 form_validation 类(但我在其他地方将它用于我的表单)
  • 我将我的 URI 字符限制为 Codeigniter 提供的默认字符

    $config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
    

【问题讨论】:

  • 我已经改进了我的问题 AlphaMale - 请参阅 scanario - 这可能是某种恶意代码吗?
  • 点斜杠和波浪字符在目录遍历和本地文件包含攻击中很有用。冒号可用于构建导致将用户重定向到任意网站或远程文件包含攻击的攻击。百分比字符在注入 sql where 子句时很有用。还有很多例子。来自用户的任何数据都可能是恶意的,无论是在 URL、cookie、POST 数据、HTTP 标头还是其他任何地方。

标签: php security codeigniter uri xss


【解决方案1】:

对于允许的字符,您无能为力……主要是您试图阻止的是将 MySQL 或可能的恶意脚本注入您的站点的任何人。总有一种可能性,但我认为你对你所拥有的东西相当安全。您要过滤的主要内容是:

  1. 引号、单引号和分号,因为这些可用于 MySQL 注入攻击。
  2. HTML 标记字符,例如 ,因为这些字符可用于注入恶意脚本。

这绝不是一个结束所有列表。这些是您应该注意的主要事项。我强烈建议您阅读https://www.owasp.org/index.php/Main_Page

上的安全最佳实践

【讨论】:

    【解决方案2】:

    是和不是。

    “数据”本身并不危险,它只是数据。如果数据包含您未预料到的内容,这取决于您对它的处理可能会产生不良后果。因此,对于通过 URL 接收到的数据,或者从 用户可以控制的地方接收到的真正任何数据,您无法知道或保证该数据包含什么。因此,请勿编写使用此数据的代码,如果该数据包含您未预料到的内容,则会破坏或打开安全漏洞。

    如果您将具有未知内容的数据视为外来对象并进行相应处理,则它并不危险。如果你把它当成你知道里面有什么,即使你不知道,这危险的。是的,这是一个令人费解的答案。 ;)

    【讨论】:

      【解决方案3】:

      当然,这取决于代码。如果不分析所有代码库,你永远不能说“它非常安全”。您的受限 URL 字符集似乎是合理的(如果它足以满足您的应用程序)。但是我可以想象至少一个输入可能是恶意的示例,如果用户在 URL 中输入\..\..\,这在某些情况下可能会打开一个自定义文件(在 Windows 上)。

      如果你只关心SQL注入,如果你有这样的代码:

      SELECT * FROM articles WHERE article_id = $id
      

      恶意用户可以将 $id 设置为 0 or 1 like 1,它会通过您的受限字符集。

      XSS 也可以这样做,如果你忘记正确转义(经常发生在生成的 JavaScript 代码中),但这个例子更难想。

      无论如何,没有真正/完美/安全的方式来限制用户输入以获得安全性。避免 XSS/SQL/任何注入的唯一方法是检查所有代码,并确保无论您使用输入还是 输出 某个变量,它都根据使用的上下文正确转义.规则是不要限制输入,但要做好可以包含任何内容的准备

      如果输入的是字符串,请准备好可以包含任何字符并对其进行处理。 按原样将其保存到数据库中,并确保在保存过程中不会造成任何损害。如果在构建 SQL 查询时需要对其进行转义,请在其中进行转义。如果您需要将字符串(或其中的一部分)放入 HTML 输出中,请正确转义它。当然,您需要非常小心,以确保您在所有地方都进行了适当的转义。

      【讨论】:

      • 我的代码库是 Codeigniter PHP 框架。它已经对 SQL 注入提供了保护——所以我并不担心——只是想知道上面的场景是否“安全”
      • 正如我所说,你不能说它是否安全,除非你检查整个代码库。您的方法似乎合理,可能是一个好的开始,但其他地方总是存在错误。您的方案看起来不错,但它是否“安全”取决于您对变量的确切操作。