programing

웹사이트 요청 시 보낸 사용자 에이전트와 다른 Javascript 사용자 에이전트(jax)

instargram 2023. 8. 30. 21:12
반응형

웹사이트 요청 시 보낸 사용자 에이전트와 다른 Javascript 사용자 에이전트(jax)

제 핸드폰(원플러스 3, Android 8.0.0)의 Chrome(64.0.3282.137)은 웹 페이지를 요청할 때 Ajax를 통해 요청하는 것과 대조적으로 약간 다른 사용자 에이전트를 보내는 것을 발견했습니다.

이 사용자 에이전트는 웹 페이지를 요청할 때 전송됩니다.

Mozilla/5.0 (Linux; Android 8.0.0; ONEPLUS A3003 Build/OPR6.170623.013) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Mobile Safari/537.36

▁this▁calling니-▁when▁user▁returned▁is▁also▁is▁making▁sent▁an▁ajax이를 호출할 때 반환됩니다.navigator.userAgent:

Mozilla/5.0 (Linux; Android 8.0.0; Build/OPR6.170623.013) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Mobile Safari/537.36

차이:ONEPLUS A3003

왜 모델이 네이티브 콜에는 포함되지만 아약스 콜에는 포함되지 않는지 알 수 있을까요?

: " site" 에이전트는 다음과 같습니다.Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Safari/537.36두 경우 모두

저는 통찰력을 얻기 위해 크롬 소스 코드를 분석했습니다.저는 c++에서 초보적인 능력으로 어느 정도의 수준에 도달할 수 있었습니다.

클라이언트 또는 플랫폼의 사용자 에이전트가 이 코드 블록(파일: useragent.cc )에서 탐지되었습니다.

std::string BuildUserAgentFromProduct(const std::string& product) {
  std::string os_info;
  base::StringAppendF(
      &os_info,
      "%s%s",
      getUserAgentPlatform().c_str(),
      BuildOSCpuInfo().c_str());
  return BuildUserAgentFromOSAndProduct(os_info, product);
}

빌드를 볼 수 있습니다.여기에서 찾을 수 있는 플랫폼을 기반으로 실제 정보를 추가하는 작업을 처리하는 코드 블록의 OSCPUInfo()

std::string android_build_codename = base::SysInfo::GetAndroidBuildCodename();
std::string android_device_name = base::SysInfo::HardwareModelName(); // this line in particular adds the ONEPLUS A3003

그러나 이 함수(BuildUserAgentFromProduct())는 http 요청 전송을 처리하는 넷 모듈에서 직접 사용되지 않습니다.

제가 넷(http) 모듈의 코드를 조사했을 때, 저는 그들이 일련의 문자열 조작과 화이트 스페이스 트리밍 기능을 통해 사용자 에이전트*를 얻고 그것을 처리하고 있다는 것을 알았습니다.http_request_headers.cc의 AddHeadersFromString()은 사용자 에이전트 문자열이 요청 헤더에 추가되는 인터페이스입니다.

참고*: 그러나 헤더 데이터는 useragent.cc 에서 온 것이 아닌 것 같습니다. 이 기능에 대한 호출을 어디에서도 찾을 수 없기 때문입니다.하지만 제가 틀릴 수도 있습니다.

**여기서 OSInfo의 가치가 수정되고 있다고 생각합니다.인식되지 않거나 잘못된 형식의 공백 문자는 이 결과를 제공할 수 있습니다.

참고**: 크롬에서 사용되는 문자열에는 StringPiece라는 이름으로 포장지가 둘러져 있기 때문에 위 문장을 테스트하고 증명할 수 없었습니다(*포장지는 제가 사용하는 용어일 뿐, 엄밀히 말하면 제가 모르는 다른 방식으로 부를 수 있습니다).그리고 StringPiece의 코드를 c++로 작성하는 방법을 모르겠습니다.

하지만 어떻게 잘못될 수 있는지에 대한 아주 간단한 예가 아래에 나와 있습니다.

int main()
{
   std::string s = " ONEPLUS\rA3003\rBuild/OPR6.170623.013";
   std::string delimiter = "\r\n"; //this is the delimeter used in chromium source code.
   std::string token = s.substr(0, s.find(delimiter,0));
   std::cout << token << std::endl;
   return 0;
}

https://www.onlinegdb.com/SkTrbFJDz

초기 사용자 에이전트 문자열에 값이 있고 후속 http 요청에 값이 없는 이유는 안드로이드의 크롬 앱 아키텍처에 있습니다.페이지가 처음 로드될 때 값은 실제로 크롬 앱(매우 큰 자바 코드 기반)에 의해 설정됩니다. 하지만 우리가 봐야 할 핵심 파일은 LoadUrlParams.java라고 생각합니다. 이 파일은 http 요청을 보내는 다른 구현을 가지고 있습니다(여기서 사용자 에이전트는 Java Implement에 의해 관리되는 대신 동일한 net(http) 모듈에 의해 트리밍되지 않습니다).tation), 이는 첫 번째 로드 중에만 발생합니다.그러나 이후의 다른 모든 호출은 브라우저의 넷(http) 모듈을 사용합니다.

파일 참조 링크: https://cs.chromium.org/chromium/src/content/common/user_agent.cc?sq=package:chromium&dr=CSs&l=80

https://cs.chromium.org/chromium/src/net/http/http_request_headers.cc?type=cs&q=AddHeadersFromString&l=155

https://cs.chromium.org/chromium/src/content/public/android/java/src/org/chromium/content_public/browser/LoadUrlParams.java?q=createLoadDataParamsWithBaseUrl&dr=CSs

문제가 발생했을 수 있는 이유 중 하나를 제공하기 위해 이 답변을 포함하고 있습니다.시간이 좀 더 있다면 어떻게든 테스트를 실행할 수 있는지 알아보고 이것을 증명할 것입니다.한 가지 최종 참고: 이 답변은 문제를 해결할 수 있는 어떤 해결책도 제공하지 않습니다.그것은 단지 원인에 대한 이유를 제공할 뿐입니다.

[업데이트]

한 가지 매우 저렴한 트릭은 navigator.useragent가 onplus 값을 가지고 있는지 확인하고 요청에 Ajax 헤더를 설정하여 전송하는 것입니다.이렇게 하면 사용자 에이전트 헤더를 추가하는 브라우저의 메커니즘이 무시됩니다.

XMLHttpRequest.setRequestHeader(header, value)

번째합니다. "userAgent"는 userAgent와 userAgent를 구분합니다.ONEPLUS A3003그러나 두 번째 w3 사양(여기서 찾기)에서는 userAgent를 수정할 수 없으므로,ONEPLUS A3003.

데스크톱 사이트 요청 기능을 사용할 때 브라우저에서 userAgent를 수정할 필요가 없으므로 동일한 userAgent가 표시됩니다.

참고: 해당 Chrome 브라우저의 기본 userAgent는 다음과 같습니다.Mozilla/5.0 (Linux; Android 8.0.0; Build/OPR6.170623.013) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Mobile Safari/537.36

언급URL : https://stackoverflow.com/questions/47904396/javascript-user-agent-ajax-different-to-sent-user-agent-when-requesting-websit

반응형