XSS 및 SQL 삽입 공격을 방지하면서 양식 입력에 코드 조각을 허용합니다.

StackOverflow https://stackoverflow.com/questions/407771

문제

XSS, SQL 주입 및 관련 공격을 방지하면서 FCKeditor나 다른 편집기와 같은 편집기(Stackoverflow와 마찬가지로)에 코드 조각을 입력할 수 있는 방법은 무엇입니까?

도움이 되었습니까?

해결책

여기서 문제 중 하나는 특정 종류의 HTML을 허용하려는 것입니다. 그렇죠?예를 들어 링크.그러나 스크립트 태그와 같은 XSS 공격을 포함할 수 있는 HTML 태그나 이벤트 핸들러 속성, href 또는 "javascript:"로 시작하는 기타 속성도 삭제해야 합니다.따라서 귀하의 질문에 대한 완전한 답변은 링크를 허용하지 않기 때문에 "특수 문자 교체"보다 더 정교한 것이어야 합니다.

SQL 삽입 방지는 플랫폼 선택에 따라 어느 정도 달라질 수 있습니다.내가 선호하는 웹 플랫폼에는 SQL 주입(cfqueryparam이라고 함)을 대부분 방지하는 쿼리 매개변수화용 구문이 내장되어 있습니다.PHP와 MySQL을 사용하는 경우 유사한 기본 mysql_escape() 함수가 있습니다.(PHP 함수가 기술적으로 매개변수화된 쿼리를 생성하는지 잘 모르겠지만, db에 안전하게 저장된 몇 가지를 본 이후로 지금까지 SQL 주입 시도를 방지하는 데는 효과적이었습니다.)

XSS 보호에서는 이런 이유로 입력을 삭제하기 위해 정규식을 사용했지만 링크와 같은 것을 허용하는 동시에 위험한 코드를 제거하는 데 어려움이 있기 때문에 그 이후로 해당 방법에서 벗어났습니다.대안으로 옮겨온 것은 XSLT입니다.다시 말하지만, XSL 변환을 실행하는 방법은 플랫폼에 따라 달라질 수 있습니다.나는 썼다 ColdFusion 개발자 저널의 기사 얼마 전에 이 작업을 수행하는 방법에 대해 설명했습니다. 상용구 XSL 시트 기본 XmlTransform() 함수를 사용하여 CF에서 작동하도록 만드는 방법을 보여줍니다.

이를 위해 XSLT로 이동하기로 선택한 이유는 두 가지입니다.

먼저 입력이 올바른 형식의 XML인지 검증하면 특정 문자열 연결 트릭을 사용하는 XSS 공격 가능성이 제거됩니다.

둘째, 정규식을 사용하는 것보다 XSL 및 XPath 선택기를 사용하여 XHTML 패킷을 조작하는 것이 더 쉽습니다. 왜냐하면 원시 문자열 조작을 위해 설계된 정규식에 비해 구조화된 XML 문서와 함께 작동하도록 특별히 설계되었기 때문입니다.그래서 훨씬 더 깨끗하고 쉬우며, 실수할 가능성이 적고, 실수를 발견하면 수정하기가 더 쉽습니다.

또한 테스트했을 때 CKEditor(그는 F를 제거함)와 같은 WYSIWYG 편집기가 올바른 형식의 XML을 유지하므로 잠재적인 문제로 걱정할 필요가 없다는 것을 알았습니다.

다른 팁

동일한 규칙이 보호에 적용됩니다. 필터 입력, 탈출 출력.

입력 포함 코드의 경우 필터링은 문자열에 인쇄 가능한 문자가 포함되어야하며 길이 제한이있을 수 있습니다.

텍스트를 데이터베이스에 저장할 때 쿼리 매개 변수를 사용하거나 문자열을 탈출하여 SQL 주입 취약점을 만드는 문자가 없는지 확인하십시오. 코드에는 더 많은 기호와 비 알파 문자가 포함될 수 있지만 SQL 주입과 관련하여 조심 해야하는 것은 일반 텍스트와 동일합니다.

올바른 이스케이프 기능을 복제하려고하지 마십시오. 대부분의 데이터베이스 라이브러리에는 이미 탈출이 필요한 모든 문자에 대해 탈출하는 기능이 포함되어 있습니다 (예 : 데이터베이스 별일 수 있음). 또한 문자 세트와 함께 특별한 문제를 처리해야합니다. 라이브러리에서 제공하는 기능 만 사용하십시오.

사람들이 "저장된 절차를 사용하십시오!"라고 말하는 이유를 이해하지 못합니다. 저장된 Procs는 SQL 주입에 대한 특별한 보호를 제공하지 않습니다. Unescaped 값을 SQL 문자열로 보간하고 결과를 실행하면 SQL 주입에 취약합니다. 응용 프로그램 코드에서 저장된 Proc에서 수행하는 것은 중요하지 않습니다.

웹 프리젠 테이션에 출력 할 때 텍스트와 마찬가지로 HTML- 전문 문자를 탈출하십시오.

SQL 주입 공격을 방지하기 위해 할 수있는 가장 좋은 방법은 데이터베이스 호출을 할 때 매개 변수화 된 쿼리 또는 저장 프로 시저를 사용하는 것입니다. 일반적으로 기본 입력 소독을 수행하는 것이 좋습니다. 그러나 사용자로부터 코드를 수락해야하므로 옵션이 아닐 수도 있습니다.

다른 한편으로 (사용자의 입력을 브라우저로 렌더링 할 때) HTML은 데이터를 인코딩하면 악성 JavaScript 등이 발생하게됩니다. 렌더링 문자 그대로의 텍스트로 실행 클라이언트 브라우저에서. 괜찮은 웹 애플리케이션 서버 프레임 워크에는 기능이 있어야합니다.

나는 <by <등을 대체 할 수 있다고 말한 다음 (예 : PHP에서 htmlentities를 사용하여), 일종의 화이트리스트로 안전한 태그를 선택합니다. 문제는 화이트리스트가 너무 엄격하다는 것입니다.

PHP 예는 다음과 같습니다

$code = getTheCodeSnippet();
$code = htmlentities($code);
$code = str_ireplace("&lt;br&gt;", "<br>", $code); //example to whitelist <br> tags
//One could also use Regular expressions for these tags

SQL 주입을 방지하려면 다음 C 라인이 있도록 '및 와 같은 "Innofensive"등가로 모든'및 chars를 교체 할 수 있습니다.

#include <stdio.h>//'); Some SQL command--

데이터베이스에서 부정적인 결과가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top