防止错误消息显示SQL


10

在我的表中,我已经在'col1'上创建了一个索引,以防止重复条目正常工作,但是在用户尝试添加重复条目时向用户显示的结果错误消息在我看来似乎是安全问题,因为它显示了SQL,包括表前缀。

有什么方法可以阻止Joomla在错误消息中显示SQL?

我试过更改全局配置中的错误报告设置,但据我所知,它没有任何作用。

消息示例:

错误

保存失败并出现以下错误:键'TestKey'的条目'Test'复制了SQL = INSERT INTO`jml_mycomp_tbl1`(`id`,`col1`,`ordering`,`state`,`created_by`)VALUES('0' ,“测试”,“ 2”,“ 1”,“ 730”)


1
我是Joomla的新手,但是您绝对正确,生产环境中的所有userland错误都不应包含任何SQL。不仅是为了安全,还因为它对用户没有意义,并给用户带来不良的体验。在生产环境中,display_errors(PHP设置)应处于关闭状态,并且此类错误应仅记录到服务器端错误日志中。
怀特先生

只是好奇,您可能已经检查过了,但是您没有碰巧启用任何调试设置吗?检查:全局配置>调试系统设置。检查:全局配置>错误报告级别。检查:插件>调试插件如果您有任何奇怪的事情,请很好奇。我问,因为我读这个learn.theartofjoomla.com/developing-extensions/...
乍得Windnagle

@ChadWindnagle嗨,乍得,是的,我尝试将其关闭但没有任何作用……
doovers

抱歉,刚刚编辑过,您能让我知道您看到了更新的内容吗?谢谢!
乍得·温德纳格

@ChadWindnagle不,我没有看到您的编辑!我确实尝试了错误报告,但是我忘记了禁用插件(感谢提示),我现在才尝试但仍然没有效果!

Answers:


6

也许您可以使用try catch命令:

try
{
//Your code to run the SQL here 
}
catch (Exception $e)
{
$this->setError('The error message you want');
return false;
}

感谢您的建议,但是由于我使用的JTable是最佳解决方案,因此check像我的回答中那样覆盖该方法。
2014年

这是一个很好的答案
David Addoteye

3

由于似乎无法阻止这种行为,因此我实现了以下解决方案。向JTable check方法覆盖添加重复检查:

// Check for duplicate entry
$db = JFactory::getDbo();
$query = $db->getQuery(true);

$query->select('COUNT(*)');
$query->from($this->get('_tbl'));
$query->where($db->quoteName('col1') . ' = ' . $db->quote($this->col1));

$db->setQuery($query);
$result = $db->loadResult();

if ($result) 
{
    $this->setError(" Duplicate entry for col1 = '" . $this->col1 . "'");
    return false;            
}

1

您应该更改使插入的代码,使其首先检查重复项并向用户返回正确的错误(您编写的错误),而不要依赖于显示MySQL返回的实际错误。


是的,我以为我可能必须这样做,但是我仍然担心Joomla很高兴在显示给用户的错误消息中显示SQL。当然这是一个安全问题?我以为随机表前缀的全部意义是为了安全起见,不是吗?也许最佳做法是自行处理错误,但可能存在无法预见的情况……对我来说似乎有点奇怪!
2014年

好吧,Joomla!不会向用户显示SQL错误消息,而您的代码会显示。
伊沃

我不同意,我的代码没有显示错误消息,但是允许Joomla核心代码显示它。我认为,
出于

为什么不使用INSERT IGNORE而不是INSERT?
伊沃

很好的建议,我可以这样做,但是由于我正在使用,所以我JTable将更倾向于覆盖该check方法并在那里进行重复测试。我想向用户显示错误消息,只是不显示SQL!
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.