给出以下简单代码:
function loadthis ($var)
{
$id = $this->model->get_id($var);
}
问题:是否可以通过URI变量传递任何恶意代码?
情景: www.mydomain.com/mycontroller/loadthis/dosomethingreallybadhere
额外信息:
我将URI字符限制为Codeigniter提供的默认字符
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
答案 0 :(得分:1)
对于允许使用的字符,你没有太多的东西......主要是你试图阻止的是任何人注入MySQL或可能是恶意脚本到你的网站。总有可能,但我认为你对自己拥有的东西相当安全。您要过滤的主要内容是:
这绝不是所有列表的结尾。这些是您应该注意的主要事项。我强烈建议您阅读https://www.owasp.org/index.php/Main_Page
上的安全最佳做法答案 1 :(得分:0)
是和否。
“数据”本身并不危险,只是数据。这取决于你使用它做什么,如果数据包含你不期望的东西,可能会产生不良后果。因此,对于通过URL接收的数据,或者从某个地方收到的任何数据用户可以控制,您无法知道或保证该数据包含的内容。因此,不要编写使用此数据的代码,如果数据包含您未预料到的内容,则会破坏或打开安全漏洞。
如果您将数据视为外来对象并对其进行相应处理,则包含未知内容的数据并不危险。 是危险的,如果你把它视为你知道它里面有什么,即使你没有。是的,这是一个令人费解的答案。 ;)
答案 2 :(得分:0)
当然,这取决于代码。如果不分析所有代码库,你永远不能说“它是完全安全的”。您受限制的URL字符集似乎是合理的(如果它足以满足您的应用程序)。但是,如果用户将\..\..\
放入URL中,我可以想象至少有一个输入可能是恶意的示例,在某些情况下可能会打开自定义文件(在Windows上)。
如果你只关心SQL注入,如果你有这样的代码:
SELECT * FROM articles WHERE article_id = $id
恶意用户可以将$ id设置为通过限制字符集的0 or 1 like 1
。
对于XSS也可以这样做,如果你在某个地方忘记正确逃脱(经常在生成的JavaScript代码中发生),但这个例子更难以想到。
无论如何,没有真正/完美/安全的方法来限制用户输入以获得安全性。避免XSS / SQL /无论注入的唯一方法是遍历所有代码并确保无论您在哪里使用输入或输出某个变量,都可以根据使用的上下文进行适当的转义。规则是不限制输入,但准备好可以包含任何内容。
如果输入是一个字符串,那么准备就可以包含任何字符并处理它。将其保存到数据库中,因为它是,并确保在保存期间它不会造成任何伤害。如果在构建SQL查询时需要转义它,请在那里将其转义。如果需要将字符串(或其中的一部分)放入HTML输出中,请将其正确地转义。当然,您需要非常小心,确保在所有地方都能正确逃离。