【问题标题】:Is JRequest::getVar('Variable') is safe or not in joomla?JRequest::getVar('Variable') 在 joomla 中是否安全?
【发布时间】:2013-02-13 07:47:47
【问题描述】:

我想知道 JRequest::getVar() 函数是否足以防止 sql 注入或 XSS,或者在 joomla 站点中使用其他一些东西来防止 XSS 或 sql 注入必须更好。

【问题讨论】:

  • 为什么你会认为一种与数据库无关的方法会神奇地保护你免受 SQL 注入?
  • Jrequest::getVar() 的行为就像 $_REQUEST、$_POST 和 $_GET。在 joomla 官方网站上,他们写道,使用 Jrequest::getVar() 而不是使用 post 和 get 一定很好,因为它可以过滤坏字符。
  • 嗯。过滤(特别是在请求级别)通常是错误的方法。考虑一下,如果 Joomla 过滤掉's,您将不再能够拥有包含“在 Joe's 吃饭”的文本字段,并且姓氏为“O'Malley”的任何人都会被告知他们的名字无效。 :P 根据需要对数据进行转义,对于它要去的域。

标签: joomla joomla2.5 joomla1.5 joomla1.6


【解决方案1】:

假设您正在为 Joomla 2.5+ 开发,您不应该再使用 JRequest,因为它已被弃用。

获取请求变量的新方法是这样的:

$jinput = JFactory::getApplication()->input;
// expecting integer, default 0
$user_id = $jinput->post->get('user_id', 0, 'INT');
// expecting string, default empty string
$user_name = $jinput->post->get('user_name', '', 'STRING')

$jinput 的第三个参数是过滤器,所以如果你知道你想要例如要返回的整数,设置适当的过滤器。

请注意,使用JInput,必须关闭magic quotes

为了防止 sql 注入,请使用

$db = JFactory::getDbo();
// $value is not safe
$value = $db->quote($value);

针对 XSS

$filter = JFilterInput::getInstance();
// $value is not safe
$value = $filter->clean($value);

在阅读了您的 cmets 之后,我只想补充一点,它本身并没有“坏字符”。此外,针对 sql 注入或 xss 的过滤也非常不同。为了更好地理解过滤和转义,请参考The Great Escapism

【讨论】:

  • 请注意,2.5 中的整个 Joomla Core 都使用 JRequest,因为 JInput 在任何仍然打开魔术引号的站点上都会失败! (我知道在 PHP 5.3 中已弃用并在 5.4 中删除 - 但仍然有太多网站仍然打开此功能!)
  • 只是为了补充上面的好答案,可以过滤的类型包括-int、integer、uint、float、double、bool、boolean、word、alnum、cmd、base64、string、html、 safe_html、数组、路径、原始文件和用户名。有关过滤器类型的更多信息docs.joomla.org/Retrieving_request_data_using_JInput 另外,请考虑在area51.stackexchange.com/proposals/58842/joomla 支持 Joomla StackExchange 网络
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
相关资源
最近更新 更多