2013-10-29 1 views
1

네이티브 Windows DLL과 js-ctypes를 사용하여 로컬 파일 시스템 내의 파일을 암호화하는 XUL 확장이 있습니다. 나는 이미 그것의 메뉴 구동 버전을 테스트하고 잘 작동하는 것 같다.outlook.com 웹 메일에서 Firefox XUL 확장을 사용하여 전자 메일 첨부 파일을 업로드하는 방법을 차단하는 방법

이제 다음을 수행하고 싶습니다. 첨부 파일이있는 새 이메일을 만들 때 첨부 파일을 "잡아"처리 (의미 : 암호화)하여 작성한 이메일 메시지에 업로드하십시오. 사용자가 암호화를 위해 암호를 제공하는 것을 제외하고는 메뉴 기반 프로세스를 거칠 필요가 없도록 투명하게 수행하고 싶습니다.

outlook.com 웹 기반 이메일 (Office 버전 아님)에서이 작업을 수행하고 싶습니다.

나는 그것이 길다는 것을 알고 있지만 누구도 찾고 시작하는 것에 대한 아이디어가 있습니까? 누구도 과거에 이런 짓을 한거야?

미리 감사드립니다.

답변

1

시작하는 좋은 장소는 이미 (일반적인 방법) 당신이 원하는 않는 애드온입니다 : 다운로드 페이지에서

https://addons.mozilla.org/en-US/firefox/addon/tamper-data/

그것은 Use tamperdata to view and modify HTTP/HTTPS headers and post parameters을 말한다. '게시 후 매개 변수'를 변경하는 것이 좋으므로 시작하는 것이 좋습니다.


하지만 그냥 내가 대답했습니다

....이 직접 구현하려면이 밖으로의 순서, 당신은 개발 솔루션을 구축 할 수있는 방법으로 진행하기 위해 .

최종 확장에

, 당신은해야합니다 :

  1. 차단 요청
  2. 대상 올바른 요청 (들)
  3. POST 요청 본문
  4. 게시물을 구문 분석에 액세스 할 수 있습니다 본문 양식 데이터 요청 (실제 이진 파일 데이터 얻기)
  5. 암호화 단계 수행
  6. 이진 파일 데이터를 다시 인코딩하고 t를 다시 어셈블 한 다음 그는 폼 데이터를 만들고 POST 요청 헤더를 수정합니다.
  7. POST 요청의 기존 내용을 바꿉니다. 기본 원리는 관측에 대해 "제목이"같은 nsIHTTPChannel을 통과하는 nsIObserver를 구현할 필요가있는 기존의 POST 내용

    를 교체 요청 & 가로 채기


. 관찰하고자하는 "통지"는 http-on-modify-request입니다.

은 더 복잡하지만 POST 요청을 차단, http-on-modify-request의 설명서에 GET 요청을 차단하기위한 간단한 예제 (1, 2)이 있습니다.

POST 요청의 몸을 얻기 :

이 정확한 주제를 다루는 mozillazine forum thread있다. Kamelot9(1)이 게시물 본문에 얼마나 해당 스레드 세부 2 게시물 : aSubject가 여기 http-on-modify-request 통지에 매개 변수로 제공

var httpChannel = aSubject.QueryInterface(Ci.nsIHttpChannel); 
var uploadChannel = httpChannel.QueryInterface(Ci.nsIUploadChannel); 
var uploadChannelStream = uploadChannel.uploadStream; 
uploadChannelStream 
    .QueryInterface(Ci.nsISeekableStream) 
    .seek(Ci.nsISeekableStream.NS_SEEK_SET, 0); 
var stream = Cc["@mozilla.org/binaryinputstream;1"] 
    .createInstance(Ci.nsIBinaryInputStream); 
stream.setInputStream(uploadChannelStream); 
var postBytes = stream.readByteArray(stream.available()); 
var poststr = String.fromCharCode.apply(null, postBytes); 

. 그런 다음 poststr을 수정할 수 있습니다. 서버에 따라 Content-length 헤더를 수정해야 할 수도 있습니다 (또는 게시물이 잘릴 수 있음).

교체 POST 요청 내용 : 당신이 수정 된 POST 본문을 가지고하면, 당신은 필요

(2) 자신과 uploadChannelinputStream의 기존 내용을 대체 :

var inputStream = Cc["@mozilla.org/io/string-input-stream;1"] 
    .createInstance(Ci.nsIStringInputStream); 
inputStream.setData(poststr, poststr.length); 
uploadChannel.setUploadStream(
    inputStream, 
    "application/x-www-form-urlencoded", 
    -1); 
// do this last - setUploadStream resets requestMethod to PUT 
httpChannel.requestMethod = "POST"; 

CcCi은 각각 Components.classesComponents.interfaces에 대한 약어입니다. 이 속기 변수는 이미 설정되어 있거나 직접 정의 할 수 있습니다. 양식 데이터를 구문 분석

는 :

나는 일반적으로 파일 업로드를 들어, Content-type:multipart/form-data 될 것이라고 생각합니다.

은 특정 '첨부 파일'당신이 당신이 필요로하는 것, 관심까지 얻으려면 :

  1. 은 첨부 파일을 얻을 수있는 마임 봉투를 구문 분석
  2. 이 첨부 파일을 찾기
  3. 제거 어떤 텍스트 인코딩이 사용되어왔다 (예 : BASE64)를 POST 헤더에서

, 당신은 같은 것을 얻을 것이다 :

,536를 'JGUOAeGT3Fjgjcdk6s35F2mPVVyTdzgR'는 MIME 경계입니다
Content-Type: multipart/form-data; boundary=JGUOAeGT3Fjgjcdk6s35F2mPVVyTdzgR 

. 게시물의 몸에서 시작하는 컨텐츠는 다음과 같이 포맷됩니다 :

--[boundary] 
CONTENT-PART #1 
--[boundary] 
CONTENT-PART #2 
--[boundary] 

CONTENT-PART 위, 빈 줄, 특정 CONTENT-PART의 다음 몸을 일부 HTTP 헤더를해야합니다.

다른 stackoverflow question로부터의 예 : JSON을 읽을 수 있도록 당신이 어떤 더 많은 작업을 수행 할 필요가 없습니다 것입니다, 그래서

이 경우
Content-Disposition: form-data; name="updates"; filename="update1353963418000.json" 
Content-Type: application/json; charset=UTF-8 
Content-Transfer-Encoding: binary 

{"collectionType":"activities","date":"2012-11-26","ownerId":"qw12er23","ownerType":"user","subscriptionId":"112233-activities"}] 

Content-Transfer-Encoding 바이너리 (원시, 인코딩) UTF8이며, CONTENT-PART의 본문에그것은 가능성이 당신이 당신의 진짜 진에 도착하는 Base64로 디코딩에 CONTENT-PART의 몸이 필요합니다 의미는 Content-Transfer-Encodingbase64로 설정해야합니다 귀하의 경우

는, 브라우저는, 바이너리 파일을 전송합니다 파일. 당신은 당신이 rawData에 원하는 암호화 할 수있는 그 시점에서

var rawData = atob(base64data); 

: base64data가 인코딩 된 콘텐츠가 포함되어있는 경우, 다음이 당신에게 원시 이진 데이터를 제공 할 것입니다.

당신은 암호화 후 (btoa을 사용하여) 이진 데이터를 다시 인코딩해야합니다. 그러면 POST 요청 본문을 재구성하기 전에 멀티 파트 엔벨로프를 다시 어셈블해야합니다. (당신이 요청 헤더의 Content-length에 대체 할 수 있도록 최종 요청 본문의 .length을 얻을 것을 잊지 마십시오.).

요청 (들)을 표적으로 : POST 요청을 수정하기위한 기본적인 메커니즘이다

한다. 그러나 당신은 여전히 ​​당신의 특정 POST 요청을 (관찰자 통지의 POST 요청 URL을 검사) 다른 POST 요청이 수정 코드를 호출하지 않고 정상적으로 진행할 수 있도록 골라있어.