0

我开发了一个 PHP 脚本来在身份验证后传递一个文件。

<?php #SERVER.PHP

if (isset($_REQUEST['uname']) && isset($_REQUEST['passwd'])) {

    if ($_REQUEST['uname']=='a' && $_REQUEST['passwd']=='a')   {

        session_start();
        session_regenerate_id();        
        header('Content-Disposition: attachment; filename=fake_name.pdf');
        readfile('original_name.pdf');        
    }
}
?>

<form name="login" action="test.php" method="get">
    Username: <input type="text" name="uname"> <br />
    Password: <input type="text" name="passwd"> <br />
    <input type="submit" name="submit" />
</form>

因此,我想自动化登录和下载过程,最初我尝试使用 wget 下载文件(fake_name.pdf):

$ wget "http://1.1.1.1/server.php?uname=a&passwd=a"

但它下载了一个包含内容的文件

<form name="login" action="test.php" method="get">
    Username: <input type="text" name="uname"> <br />
    Password: <input type="text" name="passwd"> <br />
    <input type="submit" name="submit" />
</form>

从网络浏览器访问时,我可以下载文件“mask_fname.pdf”工作得很好。

然后我尝试编写 python 脚本来获取文件,我只得到 HTML 内容。

#py1.py
import httplib, urllib
params = urllib.urlencode({
    'uname' : 'a',
    'passwd' : 'a'
    })
headers = {"Content-type": "application/x-www-form-urlencoded",
           "Accept": "text/plain"}
conn = httplib.HTTPConnection("10.1.1.2:80")
conn.request("GET", "/mdh/test.php?uname=a&passwd=a",
             params, headers)
response = conn.getresponse()
print response.status, response.reason
data = response.read()
print data
conn.close()

#py2.py
import urllib
import urllib2
url = 'http://10.1.1.2/mdh/index.php'
form_data = {'uname': 'a', 'passwd': 'a'}
params = urllib.urlencode(form_data)
response = urllib2.urlopen(url, params)
data = response.read()
print data

但是我所有尝试的输出都是相同的。有没有其他方法可以做到这一点。除了网络浏览器自动化(链接python :: splinter,selenium)之外,还有其他方法可以使用给定的用户名和密码自动下载文件(fake_name.pdf)吗?

最终,我需要使用带有身份验证的 HTTP 从服务器自动下载文件。

4

1 回答 1

1

首先,我没有看到任何 HTTP 重定向的迹象,如您的问题标题中所建议的那样 - 当然不是在您发布的 PHP 代码中启动的。为什么你认为重定向正在发生?

我认为问题出在server.php. original_name.pdf确实存在并且它是否可读server.php

请注意,即使提供了正确的凭据, HTML 表单也将始终包含在响应中。这是因为 PHP 脚本不会在之后终止readfile()- 它会继续发出 HTML 表单。

出于这个原因,我怀疑它readfile('original_name.pdf')没有产生任何输出,可能是因为 PDF 文件不存在,或者脚本无法访问。

这是您的修改版本,server.php可以纠正问题:

<?php #SERVER.PHP
if (isset($_REQUEST['uname']) && $_REQUEST['uname']=='a' &&
    isset($_REQUEST['passwd']) && $_REQUEST['passwd']=='a') {

    session_start();
    session_regenerate_id();
    header('Content-Disposition: attachment; filename=fake_name.pdf');
    header('Content-type: application/pdf');
    readfile('original_name.pdf');
}
else {
?>
<form name="login" action="" method="get">
    Username: <input type="text" name="uname"> <br />
    Password: <input type="text" name="passwd"> <br />
    <input type="submit" name="submit" />
</form>
<?php
}
?>

请注意,我添加了一个标题Content-type: application/pdf- 这将有助于浏览器正确呈现 PDF 内容。此外,表单action正在提交给test.php,所以我已将其删除,现在表单将提交回server.php

你的两个 python 脚本看起来都不错。

于 2014-09-15T13:37:31.093 回答