오류 메시지에 SQL이 표시되지 않도록 방지


10

내 테이블에서 나는 'col1'에 인덱스를 작성하여 중복 항목을 잘 작동 시키지만 중복 항목을 추가하려고 할 때 사용자에게 표시되는 결과 오류 메시지는 SQL을 포함하여 보안 문제로 보입니다. 테이블 접두사

Joomla가 오류 메시지에 SQL을 표시하지 못하게하는 방법이 있습니까?

전역 구성에서 오류보고 설정을 변경하려고 시도했지만 알 수있는 한 효과가 없습니다 ...

메시지 예 :

오류

다음 오류로 저장하지 못했습니다. 키 'TestKey'에 대한 중복 항목 'Test'SQL = INSERT INTO`jml_mycomp_tbl1` (`id`,`col1`,`ordering`,`state`,`created_by`) VALUES ( '0' , 'Test', '2', '1', '730')


1
Joomla를 처음 사용하지만 프로덕션 환경의 모든 사용자 영역 오류에는 SQL이 포함되어서는 안됩니다. 보안뿐만 아니라 사용자에게는 무의미하고 나쁜 사용자 경험을 제공하기 때문입니다. 프로덕션 환경에서는 display_errors(PHP 설정)이 꺼져 있어야하며 이러한 오류는 서버 측 오류 로그에만 기록되어야합니다.
MrWhite

궁금한 점은 이미 확인했지만 디버그 설정을 활성화하지 않았습니까? 글로벌 구성> 디버그 시스템 설정을 확인하십시오. 글로벌 구성> 오류보고 레벨을 확인하십시오. 확인 : 플러그인> 디버그 플러그인 이상한 일이 있으면 궁금합니다. 나는이 읽고 있던 때문에 나는 물어 learn.theartofjoomla.com/developing-extensions/...
차드 Windnagle

@ChadWindnagle 안녕 차드, 네, 나는 그것을 해제하려고했지만 효과가 없습니다 ...
도버

방금 수정 한 죄송합니다. 업데이트 된 콘텐츠를 보셨다고 알려주시겠습니까? thnx!
차드 윈드 나글

@ChadWindnagle 아니요 편집 내용을 보지 못했습니다! 나는 오류보고를 시도했지만 지금 막 시도했지만 여전히 효과가없는 플러그인 비활성화 (팁 감사)를 잊어 버렸습니다!
도버

답변:


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내 대답에서와 같이 방법 을 재정의하는 것이 었습니다 .
도버

이것은 정답입니다
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을 보여 드리겠습니다. 확실히 이것은 보안 문제입니다 ?? 무작위 테이블 접두사의 요점은 보안 조치 아니오라고 생각했습니다. 어쩌면 가장 좋은 방법은 자신의 오류 처리를 수행하는 것이지만 예측할 수없는 상황이있을 수 있습니다 ... 나에게 조금 이상한 것 같습니다!
도버

음, 줌라! 사용자에게 SQL 오류 메시지를 표시하지 않으면 코드가 나타납니다.
Ivo

동의하지 않습니다. 코드에 오류 메시지가 표시되지 않지만 Joomla 핵심 코드가이를 표시하도록 허용합니다. 내 의견으로는, 핵심 코드는 보안을 위해 어떤 상황에서도 테이블 접두사를 표시해서는 안됩니다 ...
doovers

왜 INSERT 대신 INSERT IGNORE를 사용하지 않습니까?
Ivo

좋은 제안과 내가 할 수는 있지만 사용하고 있기 때문에 메소드 JTable를 재정의하고 check거기에서 복제본을 테스트 하는 경향이 더 큽니다 . SQL이 아닌 사용자에게 오류 메시지를 표시하고 싶습니다!
0:49에
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.