시작하는 좋은 장소는 이미 (일반적인 방법) 당신이 원하는 않는 애드온입니다 : 다운로드 페이지에서
https://addons.mozilla.org/en-US/firefox/addon/tamper-data/
그것은 Use tamperdata to view and modify HTTP/HTTPS headers and post parameters
을 말한다. '게시 후 매개 변수'를 변경하는 것이 좋으므로 시작하는 것이 좋습니다.
하지만 그냥 내가 대답했습니다
....이 직접 구현하려면이 밖으로의 순서, 당신은 개발 솔루션을 구축 할 수있는 방법으로 진행하기 위해 .
최종 확장에
, 당신은해야합니다 :
- 차단 요청
- 대상 올바른 요청 (들)
- POST 요청 본문
- 게시물을 구문 분석에 액세스 할 수 있습니다 본문 양식 데이터 요청 (실제 이진 파일 데이터 얻기)
- 암호화 단계 수행
- 이진 파일 데이터를 다시 인코딩하고 t를 다시 어셈블 한 다음 그는 폼 데이터를 만들고 POST 요청 헤더를 수정합니다.
- 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) 자신과 uploadChannel
의 inputStream
의 기존 내용을 대체 :
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";
Cc
및 Ci
은 각각 Components.classes
및 Components.interfaces
에 대한 약어입니다. 이 속기 변수는 이미 설정되어 있거나 직접 정의 할 수 있습니다. 양식 데이터를 구문 분석
는 :
나는 일반적으로 파일 업로드를 들어, Content-type:
이 multipart/form-data
될 것이라고 생각합니다.
은 특정 '첨부 파일'당신이 당신이 필요로하는 것, 관심까지 얻으려면 :
- 은 첨부 파일을 얻을 수있는 마임 봉투를 구문 분석
- 이 첨부 파일을 찾기
- 제거 어떤 텍스트 인코딩이 사용되어왔다 (예 :
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-Encoding
base64
로 설정해야합니다 귀하의 경우
는, 브라우저는, 바이너리 파일을 전송합니다 파일. 당신은 당신이
rawData
에 원하는 암호화 할 수있는 그 시점에서
var rawData = atob(base64data);
: base64data
가 인코딩 된 콘텐츠가 포함되어있는 경우, 다음이 당신에게 원시 이진 데이터를 제공 할 것입니다.
당신은 암호화 후 (btoa
을 사용하여) 이진 데이터를 다시 인코딩해야합니다. 그러면 POST 요청 본문을 재구성하기 전에 멀티 파트 엔벨로프를 다시 어셈블해야합니다. (당신이 요청 헤더의 Content-length
에 대체 할 수 있도록 최종 요청 본문의 .length
을 얻을 것을 잊지 마십시오.).
요청 (들)을 표적으로 : POST 요청을 수정하기위한 기본적인 메커니즘이다
한다. 그러나 당신은 여전히 당신의 특정 POST 요청을 (관찰자 통지의 POST 요청 URL을 검사) 다른 POST 요청이 수정 코드를 호출하지 않고 정상적으로 진행할 수 있도록 골라있어.