【问题标题】:Joomla disable database errorJoomla 禁用数据库错误
【发布时间】:2014-05-12 02:52:14
【问题描述】:

我在 joomla 上使用 db->e​​scape 方法转义所有输入。 例如:

site.com/index.php?view=test&id=5'

在我的模型中,我在查询中使用 id, 查询代码:

$db= JFactory::getDBO();
$id = $db->escape($id);
$query="SELECT name FROM jos_test WHERE id=$id"                     
$database->setQuery($query);
$result = $database->loadResult();

现在,我在 url 末尾添加一个 '
Joomla 在 '.
之前添加反斜杠 但它会给出语法错误并显示表名。这是一个安全问题。
如何禁用 joomla sql 语法错误?

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'' at line 1 SQL=SELECT `name` FROM `jos_test` WHERE id=5\'

【问题讨论】:

  • 你有打开或关闭魔术引号吗?
  • 不,魔术报价已关闭。
  • 好的,您能否提供您的查询代码并将其添加到您的初始问题中?

标签: joomla


【解决方案1】:

您应该使用以下任一方法解析您的 GET 参数 JRequest::getVar 方法,如果这是旧的 Joomla 1.5 或 在 Joomla 2.5/3+ 中使用 JInput 类。

$input=JFactory::getApplication()->input;
$id = $input->get('id', 0, 'INT');

这样您就可以安全地将它们用于数据库查询。 进行数据库查询的正确方法是described here

最后一定要在公开之前disable error reporting编辑configuration.php文件。将$error_reporting 参数更改为'None'

【讨论】:

  • 我禁用错误报告,但未禁用 joomla sql 语法错误
【解决方案2】:

尝试以下方法:

$db = JFactory::getDbo();    
$query = $db->getQuery(true);     
$query->select($db->quoteName('name'))
      ->from($db->quoteName('#__test'))
      ->where($db->quoteName('id') . ' = ' . $id);    
$db->setQuery($query);    
$results = $db->loadResult();

这使用最新的数据库查询编码标准。

希望对你有帮助

【讨论】:

  • 当我们使用(int) if input not int时,input设置为0;但仅在数字参数上,如何在string中做到这一点????
  • ID 只能是数字,如果您使用的是字母数字,那么这是错误的方法。要使其成为字符串,只需从代码中删除(int),就像我在上面的回答中所做的那样;)
【解决方案3】:

你应该尝试这样的事情(从表名我想你正在使用 Joomla 1.5):

$db = JFactory::getDBO();
$id = JRequest::getVar('id', 0, 'INT');

$query="SELECT name FROM #__test WHERE id = " . $id;
$db->setQuery($query);
$result = $db->loadResult();

在 Joomla 3 中,您可以使用查询生成器并避免被贬低的 JRequest:

$db = JFactory::getDBO();
$id = JFactory::getApplication()->input->get('id', 0, 'INT');
$query = $db->getQuery(true);
$query->select('name')
  ->from('#__test')
  ->where('id = ' . $id);
$db->setQuery($query);
$result = $db->loadResult();

【讨论】:

  • 别忘了逃跑
  • 其实JRequest或JInput做了所有的过滤/转义,不需要额外转义。
  • 我指的是数据库表名“#__test”和列名“name”:)
猜你喜欢
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
相关资源
最近更新 更多