2010-02-22 2 views
12

나는 해커 집단과 문제가있다. 그들은 내 고객의 사이트 몇 번 해킹, 내 클라이언트는 더 화가 :(내 클라이언트 (수백 레코드가) 자신의 데이터베이스를 잃고, 지금은 좀 더 소개 다음있어 모든 :(mysql_real_escape_string을 사용하여 SQL 삽입을 방지 할 수있는 곳은 무엇입니까?

를 입력했다 얻는다;

  • 고정 파일 권한이
  • 변경된 FTP 및 호스트 로그인 정보
  • 모든 원격 MySQL은 이제 SQL 인젝션 문제에 대한 작업

에 액세스 허가. 나는 mysql_real_escape_ 추가 관리자 패널 로그인 매개 변수에 문자열. 그렇다면이 mysql_real_escape_string을 어디에서 사용해야합니까? 나는 사이트에서 이메일 양식이 거의 없다. 나는 거기에 추가 할 필요가 없다고 생각한다 ...

나는 메인 페이지로 index.php가있다. index.php?somesql=과 같은 URL을 통한 SQL 주입 공격을 막기 위해이 페이지에서해야 할 일이 있습니까?

제발 알려주세요! 나는 그렇게 많이 감사한다! !! :(

예를 들어

:.

나는 그런 코드를 가지고,

public function showDetails($id) { 

    // SQL Jobs Details 
    $this->sql_job = "SELECT * FROM jobs WHERE id=".mysql_real_escape_string($id); 
    $this->rst_job = mysql_query($this->sql_job);   
    $this->row_all = mysql_fetch_assoc($this->rst_job);  

    // SQL State 
    $this->sql_state = "SELECT title FROM state WHERE id=" . $this->row_all[$this->tbl_jobs['f4']]; 
    $this->rst_state = mysql_query($this->sql_state); 
    $this->row_state = mysql_fetch_assoc($this->rst_state); 
........ 

이 충분히 $ ID에 대한 인 mysql_real_escape_string를 사용하는 것입니다을하지 않는 $ this-> row_all [$ this-> tbl_jobs [ 'f4']

+2

나는 MSSQL 사람이므로 잘하면이게 적용됩니다 - 왜 웹 사이트 로그인은 무언가를 삭제할 수있는 권한이 있습니까? 데이터베이스를 잃어 버리는 것에 관해서는, 백업은 어디에 있습니까 ?? –

+1

"SELECT * FROM jobs where id =". mysql_real_escape_string ($ id)은 SQL 삽입에 취약합니다. $ id = "1 or sleep (50)" – rook

+0

+1 루크. mysql_real_escape_string은 마술 총알이 아니며 단지 문자열 이스케이프 함수이며 따옴표 안에 사용될 때만 작동합니다. – Cheekysoft

답변

13

기본적으로 안전하지 않은 데이터 (사용자 입력, 데이터베이스, 파일 또는 외부 웹 사이트의 값, 즉 이 아닌 모든 데이터)를 사용할 때마다 100 %이 안전한 지 확인하십시오). mysql_real_escape_string을 사용하여 이스케이프해야합니다. according to OWASP에 유의하십시오.이 함수는 동적 테이블 이름을 이스케이프하는 데 안전하지 않습니다 (그러나 이것은 "기본"사용자 입력 삽입보다 훨씬 적습니다).

OWASP article on SQL injection 전체를 살펴보고 나머지 웹 사이트를 탐색 해 보시기 바랍니다. 웹 응용 프로그램의 보안에 대한 훌륭한 정보 소스입니다.

IMO, SQL 삽입을 방지하는 가장 좋은 방법은 prepared statements을 사용하는 것입니다.

mysql_real_escape_string()을 사용하려면 문자열을 따옴표로 묶어서 사용하는 경우에만 작동합니다. 인용 부호없는 값을 에 사용하지 마십시오. 여기에는 숫자 값이 포함됩니다. 대신 사용자 입력이 실제로 숫자임을 확인하십시오.

+0

사용자 입력 그 자체 일뿐만 아니라. 매개 변수로 사용하는 모든 데이터는 이스케이프해야하는 문자를 포함하지 않는다는 것을 절대적으로 확신 할 수 없습니다 (영원을 위해). 예 : (어떤 이유로) 데이터베이스에서 데이터를 가져와 다른 쿼리에서이 데이터를 사용하면 사용자 상호 작용은 없지만 데이터를 이스케이프 처리해야합니다. 또는 준비된 진술을 사용하십시오. – VolkerK

+0

네 말이 맞아, 너의 정밀함으로 내 대답을 업데이트 할거야. 감사! – Wookai

3

웹 개발의 황금 규칙 중 하나는 사용자 입력을 신뢰하지 말라는 것입니다. 따라서 데이터가 데이터베이스에 저장되는 곳이면 어디에서나 mysql_real_escape_string()을 호출해야합니다.

또한 앞으로 클라이언트를 화나게하지 않으려면 정기적으로 데이터베이스를 백업해야합니다. 내가 너의 고객이라면, 나는 지금 분노 할 것이다.

사이트 보안을 위해 행운을 빕니다.

+0

답장을 보내 주셔서 감사합니다. db로부터 데이터를 호출하는 것은 어떨까요? 이 경우 mysql_real_escape_string()을 사용해야합니까? 또는 SQL에서 변수에 대한 jsut 데이터베이스로 이동? –

3

SQL 삽입을 방지하는 가장 좋은 방법은 준비된 문과 바인드 변수를 사용하는 것입니다.어떤 버전의 MySQL을 사용하고 있습니까? 준비된 진술은 4.1 이상에서 사용할 수 있습니다. 사용자 입력 할

3

양대 것들이다

  1. 입력 필터링
  2. 출력

입력 필터링 데이터/[전]/그것이에 저장된 변환하는 프로세스이다 탈출 데이터베이스 mysql_real_escape_string()을 실행하는 것은 db 삽입을 위해 사용자 데이터를 삭제하는 더 좋은 방법이 있지만이 단계에 해당되지만이 단계에서는 공백, 불경스런 필터링, 마크 업 변환 등을 트리밍 할 수도 있습니다.

출력 이스케이프 처리는 악의적 인 행동을 허용하지 않는 브라우저에 사용자 콘텐츠를 보낼 때주의를 기울입니다. 이것은 htmlentities() 또는 다른 선택적 선별 프로세스를 실행하는 것을 의미합니다.

자원 조절 (DOS 예방), 양식 토큰 (CSRF 보호) 등과 같이 할 수있는 다른 일들이 있습니다. OWASP으로 가서 읽기를 시작하십시오.

관련 문제