Mencegah pesan kesalahan dari menampilkan SQL

10

Di meja saya, saya telah membuat indeks pada 'col1' untuk mencegah duplikat entri yang berfungsi dengan baik tetapi pesan kesalahan yang dihasilkan ditampilkan kepada pengguna ketika mereka mencoba untuk menambahkan entri duplikat bagi saya menjadi masalah keamanan karena menampilkan SQL termasuk awalan tabel.

Apakah ada cara untuk menghentikan Joomla menampilkan SQL dalam pesan kesalahan?

Saya sudah mencoba mengubah pengaturan pelaporan kesalahan dalam konfigurasi global tetapi sejauh ini saya tidak memiliki pengaruh ...

Pesan contoh:

Kesalahan

Gagal menyelamatkan dengan kesalahan berikut: Duplikat entri 'Tes' untuk kunci 'TestKey' SQL = INSERT INTO `jml_mycomp_tbl1` (` id`, `col1`,` memesan`, `state`,` dibuat_by`) VALUES ('0' , 'Tes', '2', '1', '730')

doovers
sumber
1
Saya baru mengenal Joomla, tetapi Anda benar sekali, kesalahan apa pun di lingkungan produksi tidak boleh mengandung SQL apa pun. Bukan hanya untuk keamanan, tetapi karena tidak berarti bagi pengguna dan memberikan pengalaman pengguna yang buruk. Dalam lingkungan produksi, display_errors(pengaturan PHP) harus dimatikan dan kesalahan tersebut hanya harus dicatat ke log kesalahan sisi server Anda.
MrWhite
Hanya ingin tahu, Anda mungkin sudah memeriksa ini tetapi Anda tidak memiliki pengaturan debug yang diaktifkan, kan? Periksa: Global Config> pengaturan sistem debug. Periksa: Global Config> Level pelaporan kesalahan. Periksa: Plugins> Plugin Debug Penasaran jika Anda memiliki sesuatu yang aneh terjadi. Saya bertanya karena saya membaca ini belajar.theartofjoomla.com/developing-extensions/…
Chad Windnagle
@ChadWindnagle Hai Chad, ya saya mencoba mematikannya tetapi tidak ada efek ...
doovers
maaf baru diedit, bisakah Anda memberi tahu saya bahwa Anda melihat konten yang diperbarui? thnx!
Chad Windnagle
@ChadWindnagle Tidak, saya belum melihat hasil edit Anda! Saya memang mencoba melaporkan kesalahan tetapi saya lupa menonaktifkan plugin (terima kasih atas tipnya) yang baru saja saya coba sekarang tetapi tetap tidak berpengaruh!
doovers

Jawaban:

6

Mungkin Anda bisa menggunakan perintah try catch:

try
{
//Your code to run the SQL here 
}
catch (Exception $e)
{
$this->setError('The error message you want');
return false;
}
Tuan Pham Ngoc
sumber
Terima kasih atas sarannya tetapi karena saya menggunakan JTablesolusi terbaik adalah mengganti checkmetode seperti pada jawaban saya.
doovers
Ini jawaban yang bagus
David Addoteye
3

Karena tampaknya tidak mungkin untuk mencegah perilaku ini, saya menerapkan solusi berikut. Tambahkan duplikat cek ke JTable checkmetode menimpa:

// 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;            
}
doovers
sumber
1

Anda harus mengubah kode Anda yang membuat sisipan untuk terlebih dahulu memeriksa duplikat dan mengembalikan kesalahan yang tepat (yang Anda tulis) kepada pengguna dan tidak bergantung pada menunjukkan kesalahan aktual yang dikembalikan oleh MySQL.

Ivo
sumber
Ya saya pikir saya mungkin harus melakukan itu, tetapi saya masih khawatir bahwa Joomla senang untuk menunjukkan SQL dalam pesan kesalahan yang ditampilkan kepada pengguna. Tentunya ini masalah keamanan ?? Saya pikir seluruh titik awalan tabel acak adalah sebagai langkah pengamanan, bukan? Mungkin praktik terbaik adalah dengan melakukan penanganan kesalahan Anda sendiri tetapi mungkin ada situasi yang Anda tidak dapat ramalkan ... Sepertinya agak aneh bagi saya!
doovers
Baiklah, Joomla! tidak menampilkan pesan kesalahan SQL kepada pengguna, kode Anda tidak.
Ivo
Saya tidak setuju, kode saya tidak menampilkan pesan kesalahan tetapi memungkinkan kode inti Joomla untuk menunjukkannya. Menurut pendapat saya, kode inti tidak boleh menampilkan awalan tabel dalam keadaan apa pun karena ini merupakan masalah keamanan ...
doovers
Mengapa Anda tidak menggunakan INSERT IGNORE sebagai ganti INSERT?
Ivo
Saran yang bagus dan saya bisa melakukan itu tetapi karena saya menggunakan JTablesaya akan lebih cenderung untuk menimpa checkmetode dan menguji duplikat di sana. Saya ingin menampilkan pesan kesalahan kepada pengguna, hanya saja tidak ada SQL di dalamnya!
doovers