Php URI变量可能是恶意的吗
给出以下简单代码:Php URI变量可能是恶意的吗,php,security,codeigniter,uri,xss,Php,Security,Codeigniter,Uri,Xss,给出以下简单代码: function loadthis ($var) { $id = $this->model->get_id($var); } 问题:是否可以通过URI变量传递任何恶意代码 场景:www.mydomain.com/mycontroller/loadthis/dosomethingreallybreach 额外信息: 我在模型上使用活动记录,所以我知道他们不能进行SQL注入 在本例中,我没有使用form_验证类(但我在其他地方对我的表单使用它)
function loadthis ($var)
{
$id = $this->model->get_id($var);
}
问题:是否可以通过URI变量传递任何恶意代码
场景:www.mydomain.com/mycontroller/loadthis/dosomethingreallybreach
额外信息:
- 我在模型上使用活动记录,所以我知道他们不能进行SQL注入
- 在本例中,我没有使用form_验证类(但我在其他地方对我的表单使用它)
- 我将URI字符限制为Codeigniter提供的默认字符
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
- 引号、单引号和分号,因为它们可以用于MySQL注入攻击
- HTML标记字符,如<或>,因为这些字符可用于注入恶意脚本
- 引号、单引号和分号,因为它们可以用于MySQL注入攻击
- HTML标记字符,如<或>,因为这些字符可用于注入恶意脚本 这决不是一个完全全的清单。这些是你应该注意的主要事情。我强烈建议您在是和否上阅读安全最佳实践 “数据”本身并不危险,它只是数据。这取决于您对它所做的操作,如果数据包含您没有预料到的内容,则可能会产生不必要的后果。因此,对于通过URL接收的数据,或者实际上是从用户可以控制的地方接收的任何数据,您无法知道或保证该数据包含什么。因此,不要编写使用此数据的代码,如果该数据包含您没有预料到的内容,则这些代码将破坏或打开安全漏洞 如果将内容未知的数据视为外来对象并进行相应处理,则该数据并不危险。如果你把它当作你知道里面有什么,即使你不知道,那是很危险的。是的,这是一个令人费解的答案 是和否 “数据”本身并不危险,它只是数据。这取决于您对它所做的操作,如果数据包含您没有预料到的内容,则可能会产生不必要的后果。因此,对于通过URL接收的数据,或者实际上是从用户可以控制的地方接收的任何数据,您无法知道或保证该数据包含什么。因此,不要编写使用此数据的代码,如果该数据包含您没有预料到的内容,则这些代码将破坏或打开安全漏洞
- 对于允许的字符,您可以做的事情不多。。。您试图阻止的主要是任何人将MySQL或恶意脚本注入您的站点。总有一种可能性,但我认为你拥有的东西是相当安全的。要筛选的主要内容包括:
这决不是一个完全全的清单。这些是你应该注意的主要事情。我强烈建议您在上阅读安全最佳实践,对于允许的字符,您可以做的不多。。。您试图阻止的主要是任何人将MySQL或恶意脚本注入您的站点。总有一种可能性,但我认为你拥有的东西是相当安全的。要筛选的主要内容包括:
如果将内容未知的数据视为外来对象并进行相应处理,则该数据并不危险。如果你把它当作你知道里面有什么,即使你不知道,那是很危险的。是的,这是一个令人费解的答案 当然,这取决于代码。如果不分析所有的代码库,就永远不能说“它非常安全”。您的受限URL字符集似乎是合理的(如果它对您的应用程序足够的话)。然而,我可以想象至少有一个例子,如果用户将
\\\\\\\
放在URL中,输入可能是恶意的,在某些情况下,这可能会打开一个自定义文件(在Windows上)
如果您只关心SQL注入,如果您有这样的代码:
SELECT * FROM articles WHERE article_id = $id
恶意用户可以将$id设置为0或1,如1
,从而通过您的受限字符集
如果您忘记正确地转义(通常发生在生成的JavaScript代码中),XSS也可以这样做,但是这个例子很难想象
无论如何,没有真正/完美/安全的方法来限制用户输入以获得安全性。避免XSS/SQL/whatever注入的唯一方法是检查所有代码,并确保无论在哪里使用输入或输出某个变量,都会根据使用的上下文对其进行正确转义。规则是不要限制输入,但要准备好可以包含任何内容
如果输入是一个字符串,请准备好可以包含任何字符并对其进行处理。按原样将其保存到数据库中,并确保在保存过程中不会造成任何伤害。如果在构建SQL查询时需要转义它,请在那里转义它。如果需要将字符串(或其一部分)放入HTML输出,请正确转义它。当然,您需要非常小心,以确保在所有位置都能正确转义。当然,这取决于代码。如果不分析所有的代码库,就永远不能说“它非常安全”。您的受限URL字符集似乎是合理的(如果它对您的应用程序足够的话)。然而,我可以想象至少有一个例子,如果用户将
\\\\\\\
放在URL中,输入可能是恶意的,在某些情况下,这可能会打开一个自定义文件(在Windows上)
如果您只关心SQL注入,如果您有这样的代码:
SELECT * FROM articles WHERE article_id = $id
恶意用户可以将$id设置为0或1,如1
,从而通过您的受限字符集
如果您忘记正确地转义(通常发生在生成的JavaScript代码中),XSS也可以这样做,但是这个例子很难想象
无论如何,没有真正/完美/安全的方法来限制用户输入以获得安全性。避免XSS/SQL/whatever注入的唯一方法是检查所有代码,并确保无论在哪里使用输入