【问题标题】:Automate HTTP POST/GET PHP on file download using header & readfile使用 header 和 readfile 自动下载文件的 HTTP POST/GET PHP
【发布时间】:2014-09-15 10:55:10
【问题描述】:

我开发了一个 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

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

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

【问题讨论】:

  • 一般建议是在 urllib 上使用 requests。您可能会遇到更少的问题

标签: php python authentication download webautomation


【解决方案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 脚本看起来都不错。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多