1

给出以下简单代码:

 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~%.:_\-';
    
4

3 回答 3

1

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

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

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

于 2012-04-20T07:01:36.740 回答
0

是和不是。

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

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

于 2012-04-20T07:05:51.283 回答
0

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

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

SELECT * FROM articles WHERE article_id = $id

恶意用户可以设置 $id 来0 or 1 like 1传递您的受限字符集。

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

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

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

于 2012-04-20T07:06:04.717 回答