mirror of
https://github.com/FlareSolverr/FlareSolverr.git
synced 2025-06-08 12:35:30 +00:00
Fix Cloudflare detection in POST requests
This commit is contained in:
parent
d79782bec9
commit
a2345affb3
@ -90,7 +90,7 @@ async function resolveChallenge(params: V1Request, session: SessionsCacheItem):
|
|||||||
// reload the page to be sure we get the real page
|
// reload the page to be sure we get the real page
|
||||||
log.debug("Reloading the page")
|
log.debug("Reloading the page")
|
||||||
try {
|
try {
|
||||||
response = await gotoPage(params, page);
|
response = await gotoPage(params, page, params.method);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log.warn("Page not reloaded (do not report!): Cause: " + e.toString())
|
log.warn("Page not reloaded (do not report!): Cause: " + e.toString())
|
||||||
}
|
}
|
||||||
@ -132,9 +132,10 @@ async function resolveChallenge(params: V1Request, session: SessionsCacheItem):
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function gotoPage(params: V1Request, page: Page): Promise<HTTPResponse> {
|
async function gotoPage(params: V1Request, page: Page, method: string = 'GET'): Promise<HTTPResponse> {
|
||||||
let pageTimeout = params.maxTimeout / 3;
|
let pageTimeout = params.maxTimeout / 3;
|
||||||
let response: HTTPResponse
|
let response: HTTPResponse
|
||||||
|
|
||||||
try {
|
try {
|
||||||
response = await page.goto(params.url, {waitUntil: 'domcontentloaded', timeout: pageTimeout});
|
response = await page.goto(params.url, {waitUntil: 'domcontentloaded', timeout: pageTimeout});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@ -142,47 +143,29 @@ async function gotoPage(params: V1Request, page: Page): Promise<HTTPResponse> {
|
|||||||
response = await page.goto(params.url, {waitUntil: 'domcontentloaded', timeout: pageTimeout});
|
response = await page.goto(params.url, {waitUntil: 'domcontentloaded', timeout: pageTimeout});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (params.method == 'POST') {
|
if (method == 'POST') {
|
||||||
// post hack
|
// post hack, it only works with utf-8 encoding
|
||||||
await page.setContent(
|
|
||||||
`
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<body>
|
|
||||||
<script>
|
|
||||||
|
|
||||||
function parseQuery(queryString) {
|
let postForm = `<form id="hackForm" action="${params.url}" method="POST">`;
|
||||||
var query = {};
|
let queryString = params.postData;
|
||||||
var pairs = (queryString[0] === '?' ? queryString.substr(1) : queryString).split('&');
|
let pairs = (queryString[0] === '?' ? queryString.substr(1) : queryString).split('&');
|
||||||
for (var i = 0; i < pairs.length; i++) {
|
for (let i = 0; i < pairs.length; i++) {
|
||||||
var pair = pairs[i].split('=');
|
let pair = pairs[i].split('=');
|
||||||
query[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || '');
|
let name; try { name = decodeURIComponent(pair[0]) } catch { name = pair[0] }
|
||||||
}
|
if (name == 'submit') continue;
|
||||||
return query;
|
let value; try { value = decodeURIComponent(pair[1] || '') } catch { value = pair[1] || '' }
|
||||||
|
postForm += `<input type="text" name="${name}" value="${value}"><br>`;
|
||||||
}
|
}
|
||||||
|
postForm += `</form>`;
|
||||||
|
|
||||||
const form = document.createElement('form');
|
await page.setContent(`
|
||||||
form.method = 'POST';
|
<!DOCTYPE html>
|
||||||
form.action = '${params.url}';
|
<html>
|
||||||
|
<body>
|
||||||
const params = parseQuery('${params.postData}');
|
${postForm}
|
||||||
for (const key in params) {
|
<script>document.getElementById('hackForm').submit();</script>
|
||||||
if (params.hasOwnProperty(key)) {
|
</body>
|
||||||
const hiddenField = document.createElement('input');
|
</html>`
|
||||||
hiddenField.type = 'hidden';
|
|
||||||
hiddenField.name = key;
|
|
||||||
hiddenField.value = params[key];
|
|
||||||
form.appendChild(hiddenField);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
document.body.appendChild(form);
|
|
||||||
form.submit();
|
|
||||||
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
`
|
|
||||||
);
|
);
|
||||||
await page.waitForTimeout(2000)
|
await page.waitForTimeout(2000)
|
||||||
try {
|
try {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user