2010-04-01 2 views
1

큰 선택인데도 stackoverflow에서 긴 검색을 수행 한 후에도이 문제에 관해 언급 한 사람이 없었지만 XSS와 SQL 주입을 막기 위해 최선의 방법이 무엇인지, 데이터를 이스케이프 처리 한 다음 DB 또는 그것을 그대로 저장하고 그것을 출력 할 때 탈출?무엇이 최고인가, Escape 한 다음 저장 또는 저장 한 다음 출력을 벗어나려고합니까?

참고 : 가능한 경우 실습 예제를 제공하는 것이 좋습니다.

감사합니다.

+2

SQL을 이스케이프 처리하는 경우 잘못 처리하는 것입니다. 항상 매개 변수화 된 쿼리를 사용하십시오. – Nate

답변

5

데이터는 표시를 위해 의 HTML 이스케이프 처리를 통해 SQL 이스케이프 (SQL과 별도로 SQL에서 전송 됨)되어야합니다. 의 아주 행위는 SQL 주입을 포함하는 데이터가 은 SQL 주입 원인이 무엇 저장을 시도하기 때문에

+2

sql의 이스케이프와 html의 이스케이프 간의 차이점에 유의하십시오. – goat

+0

네, 탈출은 아주 다르며 각각의 경우에 올바른 이스케이프를 사용하는 것이 중요합니다. – SamB

1

출력을 이스케이프하고 저장 한 다음 이스케이프 처리합니다.


탈출하지 않고 저장하면 SQL 주입에 취약합니다.

예 :

mysql_query("SELECT * FROM `table` WHERE `abc`= '{$_POST['def']}'; 

이의 그것을 탈출 있지 않은 경우 테이블이 끊어지는 것이다

blah'; DROP TABLE `table`; SELECT * FROM `table` WHERE 'abc' = '123 

같다 [ '데프'] $ _POST한다고 가정 해 봅시다 : 당신은 쿼리를 .


탈출하지 않고 출력하면 XSS에 취약합니다.

그렇지 않으면 사용자가 다른 사용자가 볼 수있는 페이지에 유해한 Javascript를 삽입 할 수 있습니다.

+0

특정 예제의 경우에는 그렇지 않습니다. mysql_query()는 다중 질의를 지원하지 않는다. –

2

귀하의 질문은, 많은 이해가되지 않습니다.

어느 쪽이든, Parameterized queries을 사용하여 SQL 삽입을 방지해야합니다.

XSS/HTML 이스케이프의 경우 개인적으로는 삽입 시간에 수행하는 것이 좋습니다. 표시 될 때마다 대신 한 번만 처리해야하기 때문입니다. 작은 최적화지만 쉬운 것.

+5

삽입 시간에 이스케이프 처리가 잘못되었습니다. 삽입 시간에 문자열이 어디에 사용되는지 알 수 없습니다. 예를 들어 문자열을 HTML 또는 자바 스크립트로 보내거나 URL에서 검색어 매개 변수로 문자열을 사용하고자 할 수 있습니다. 또는 데이터베이스에 저장된 문자열을 분석 할 수도 있습니다. 이 유스 케이스 각각은 다른 이스케이프 메소드를 가지고있다. –

+0

특정 경우에 위생 처리 (예 : HTML 제거)가 적절합니다. 예를 들어 URL이있는 필드는 HTML을 저장해서는 안됩니다. 또한 누군가의 이름이 들어있는 필드는 HTML을 저장해서는 안됩니다. 그러나 전체 이름을 가진 필드는 언젠가 XML로 저장하여 성 및 성을 윤곽을 나타낼 수 있으므로 박탈해서는 안됩니다. 필드에 저장할 수있는 형식을 고려해야합니다. – outis

4

위해, 다음을 수행해야합니다 -

  1. 유효성 입력을 그것이 당신의 기대를 충족하는지 확인합니다. 그렇지 않으면 입력을 거부하고 중지하십시오. 충족되면 입력을 변경하지 않고 다음 단계 으로 계속 진행합니다.

  2. 입력을 매개 변수화 된 쿼리에 바인딩하거나 쿼리를 작성할 때 입력을 이스케이프 처리하십시오. 입력 을 이스케이프하면 입력이 변경되지 않습니다. 데이터베이스는 항상 사용자가 입력 한 정확한 문자열을 포함합니다.

  3. 사용자에게 표시 할 때 문맥에 따라 이스케이프 처리해야합니다. HTML 요소, HTML 속성, Javascript, CSS 또는 URL 중 어디에 표시하는지에 따라 동일한 문자열을 이스케이프 처리 할 수있는 약 5 가지 방법이 있습니다.http://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet을 참조하십시오. 다시 말하면 이스케이프는 문자열을 변경하지 않는다는 것을 기억하십시오. 사용자 은 항상 그가 입력 한 정확한 문자열을 참조해야합니다.

데이터베이스에 수정 된 문자열을 저장하고 싶지만 그렇게하지 마십시오. HTML로 이스케이프 처리하면 자바 스크립트에서 문자열을 절대 사용할 수 없습니다. 백 엔드 처리를 수행해야하는 경우 문자열을 탈출해야합니다. 곧 더 이상 옳은 일을 할 수없는 무대에 도달하게 될 것입니다.

이스케이프는 데이터를 한 레이어에서 다른 레이어로 전송하는 방법 일뿐입니다. 휴지 상태 (데이터베이스 또는 화면)에서 데이터는 사용자가 입력 한 방식과 정확하게 일치해야합니다.

관련 문제