Ngăn thông báo lỗi hiển thị SQL


10

Trong bảng của tôi, tôi đã tạo một chỉ mục trên 'col1' để ngăn các mục trùng lặp hoạt động tốt nhưng thông báo lỗi kết quả được hiển thị cho người dùng khi họ cố gắng thêm một mục trùng lặp dường như là một mối quan tâm bảo mật vì nó hiển thị SQL bao gồm tiền tố bảng.

Có cách nào để ngăn Joomla hiển thị SQL trong thông báo lỗi không?

Tôi đã thử thay đổi cài đặt báo cáo lỗi trong cấu hình toàn cầu nhưng nó không có tác dụng như tôi có thể nói ...

Thông báo ví dụ:

lỗi

Lưu không thành công với lỗi sau: Sao chép mục 'Kiểm tra' cho khóa 'TestKey' SQL = INSERT INTO `jml_mycomp_tbl1` (` id`, `col1`,` order`, `state`,` created_by`) VALUES ('0' , 'Kiểm tra', '2', '1', '730')


1
Tôi mới sử dụng Joomla, nhưng bạn hoàn toàn đúng, mọi lỗi người dùng trong môi trường sản xuất không được chứa bất kỳ SQL nào. Không chỉ vì bảo mật, mà bởi vì nó vô nghĩa với người dùng và mang lại trải nghiệm xấu cho người dùng. Trong môi trường sản xuất, display_errors(cài đặt PHP) sẽ bị tắt và các lỗi đó chỉ nên được ghi vào nhật ký lỗi phía máy chủ của bạn.
MrWhite

Chỉ tò mò, có lẽ bạn đã kiểm tra điều này nhưng bạn không có bất kỳ cài đặt gỡ lỗi nào được kích hoạt phải không? Kiểm tra: Cấu hình toàn cầu> cài đặt hệ thống gỡ lỗi. Kiểm tra: Cấu hình toàn cầu> Mức báo cáo lỗi. Kiểm tra: Plugin> Trình gỡ lỗi Chỉ tò mò nếu bạn có bất cứ điều gì lạ xảy ra. Tôi hỏi bởi vì tôi đã đọc bài học này.theartofj Joomla.com/developing-extensions/
Chad Windnagle

@ChadWindnagle Xin chào Chad, vâng, tôi đã thử tắt nó đi nhưng không có tác dụng ...
doovers

Xin lỗi chỉ cần chỉnh sửa, bạn có thể chỉ cho tôi biết bạn đã xem nội dung cập nhật? thnx!
Chad Windnagle

@ChadWindnagle Không tôi chưa thấy chỉnh sửa của bạn! Tôi đã thử báo cáo lỗi nhưng tôi quên mất việc vô hiệu hóa plugin (cảm ơn vì mẹo này) mà tôi mới thử nhưng vẫn không có kết quả!
doovers

Câu trả lời:


6

Có lẽ bạn có thể sử dụng lệnh try Catch:

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

Cảm ơn lời đề nghị nhưng vì tôi đang sử dụng JTablegiải pháp tốt nhất là ghi đè checkphương thức như trong câu trả lời của tôi.
doovers

Đây là câu trả lời hay
David Addoteye

3

Vì dường như không thể ngăn chặn hành vi này, tôi đã thực hiện giải pháp sau đây. Thêm một kiểm tra trùng lặp để JTable checkghi đè phương thức:

// 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

Bạn nên thay đổi mã của mình để chèn lần đầu tiên kiểm tra trùng lặp và trả lại lỗi thích hợp (lỗi mà bạn viết) cho người dùng và không dựa vào việc hiển thị lỗi thực tế được trả về bởi MySQL.


Vâng tôi nghĩ rằng tôi có thể phải làm điều đó nhưng tôi vẫn lo ngại rằng Joomla rất vui khi hiển thị SQL trong một thông báo lỗi được hiển thị cho người dùng. Chắc chắn đây là một mối quan tâm an ninh ?? Tôi nghĩ rằng toàn bộ điểm của tiền tố bảng ngẫu nhiên là một biện pháp bảo mật không? Có lẽ cách tốt nhất là tự xử lý lỗi của bạn nhưng có thể có tình huống mà bạn không thể thấy trước ... Có vẻ hơi lạ đối với tôi!
doovers

Vâng, Joomla! không hiển thị thông báo lỗi SQL cho người dùng, mã của bạn thì có.
Ivo

Tôi không đồng ý, mã của tôi không hiển thị thông báo lỗi nhưng cho phép mã lõi Joomla hiển thị nó. Theo tôi, mã lõi không nên hiển thị tiền tố của bảng trong bất kỳ trường hợp nào vì đây là vấn đề bảo mật ...
doovers

Tại sao bạn không sử dụng INSERT IGNORE thay vì INSERT?
Ivo

Đề xuất tốt và tôi có thể làm điều đó nhưng vì tôi đang sử dụng JTablenên tôi có xu hướng ghi đè checkphương thức và kiểm tra trùng lặp ở đó. Tôi muốn hiển thị một thông báo lỗi cho người dùng, không phải với SQL trong đó!
doovers
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.