無標題文檔

备份 Yupoo 照片 PHP 脚本

<!--
http://www.yupoo.com/images/logo.gif
-->

如果你想备份你的 Yupoo 上的照片 ,那这个脚本你肯定会感兴趣。这个脚本首先获得线上所有的相册列表,然后根据相册中的照片逐个下载到本地。

运行步骤

  1. 首先自行申请个 API Key,可以 到这里看看
  2. 修改 run.php 中相应的字段
  3. 如果你是 Windows 用户,则运行 run.bat 文件
  4. 然后就等待脚本慢慢的抓图片

PS,如果没有现成的 PHP 环境, 可考虑我提供的版本 。出错了没有关系,可能是 Yupoo 返回数据不及时造成的,重新运行下脚本即可,提供了简单的续传功能。

已有问题

  1. 无法抓取设置为私有的照片,我不确定是否是 API 的问题(应该是权限的问题),了解的兄弟欢迎指出
  2. 虽然使用照片上下文抓取精度会更高,而本人自己的照片都是整理到了相册中,所以就偷了个懒
  3. 官方 PHP Toolkit 用的是 PEAR 的老版本的 XML 解析器, 它无法解析超过 100 条的记录 ,我重写了下 使用 SimpleXML 接口 ,因此你需要 PHP5 运行此脚本

最后,脚本文件在 这里下载 ,有任何建议和意见欢迎兄弟们提出。

Magic quotes 的问题

对于 Magic quotes,对于 PHPer 而言是个老生常谈的问题。今天无意间 看到篇文章 ,结合 PHP Manual 以及其回复,在这里做个简单的汇总。

简而言之,Magic quotes 开启后会自动转义输入的数据。其中,所有的单引号(')、双引号(\")、反斜线、和 NULL 字符都会被转义(增加个反斜线), 其实这操作本质上调用的是 addslashes 函数

为什么使用 Magic quotes

方便快捷

PHP 的设计者在设计之初的构想就是能够快速方便的编程。例如插入数据库时,Magic quotes 会自动将数据转义,这很方便。

对初学者有利

Magic quotes 可以从一定程度上,让初学者带离脚本的安全风险。例如在没有任何保护措施的代码下,开启了 Magic quotes 后会少很多的风险,例如 注入问题 。当然,单一使用此方法,并不能完全阻止此类安全问题。

「我没有权限去关闭」

很显然你已经可能意识到了这个问题,但是主机空间并非完全由自己控制。

为什么不使用 Magic quotes

可移植性

无论此功能是否开启,它都会影响脚本的可移植性,因为它影响我们后续过滤数据的操作。

性能问题

在获取所有的外部数据之前都会被转义,这无疑会增加运行时的花销(而且并不是所有的数据都需要转义)。

造成困惑

正如上述所言,并非所有的数据都需要被转义。有可能出现的一种情况,就是当你为了获取未被转义的数据,而「疯狂的」使用 stripslashes 函数。

PHP6 已经不支持

PHP 的设计者显然已经意识到了自己的「错误」,所以在 PHP6 中已经将其废弃。

如何禁用 Magic quotes

按照本人观点,使用 php.ini 配置文件全局禁用 Magic quotes 是最靠谱的。参考下面的代码

; Magic quotes
;
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off
; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off
; Use Sybase-style magic quotes (escape ' with '' instead of ').
magic_quotes_sybase = Off

然而线上的主机可能无法让你修改 php.ini 文件,那么可以使用 .htaccess 文件禁用,加入下面的代码

php_flag magic_quotes_gpc Off

上述可移植的代码而言,无论是否禁用 magic_quotes,数据必须保持一致。那么下面的代码可以帮助您

		

不要轻信 PHP_SELF

开门见山,考虑下面的代码( 原文连接 有详细的解释)

<html>
    <body>
        <?php
            if (isset($_REQUEST['submitted']) && $_REQUEST['submitted'] == '1') {
                echo "Form submitted!";
            }
        ?>
        <form action="<?php echo $_SERVER['PHP_SELF']; ?>">
            <input type="hidden" name="submitted" value="1" />
            <input type="submit" value="Submit!" />
        </form>
    </body>
</html>

看似准确无误的代码,但是暗藏着危险。让我们将其保存为 foo.php ,然后放到 PHP 环境中使用

foo.php/%22%3E%3Cscript%3Ealert('xss')%3C/script%3E%3Cfoo

访问,会发现弹出个 Javascript 的 alert -- 这很明显又是个 XSS 的注入漏洞 。究其原因,发现是在

echo $_SERVER['PHP_SELF'];

这条语句上直接输出了未过滤的值。追根数源,我们看下 PHP 手册的描述

'PHP_SELF'

The filename of the currently executing script, relative to the document root. 
For instance, $_SERVER['PHP_SELF'] in a script at the address 
http://example.com/test.php/foo.bar would be /test.php/foo.bar. The __FILE__ 
constant contains the full path and filename of the current (i.e. included) file.
If PHP is running as a command-line processor this variable contains the script 
name since PHP 4.3.0. Previously it was not available. 

原因很明确了,原来是 $_SERVER['PHP_SELF'] 虽然「看起来」是服务器提供的环境
变量,但这的确和 $_POST$_GET 一样,是可以被用户更改的。

其它类似的变量有很多,比如 $_COOKIE 等(如果用户想「把玩」他们的 cookie,那我们也是没有办法)。解决方案很简单,使用 strip_tagshtmlentities 等此类函数过滤或者转义。

echo htmlentities($_SERVER['PHP_SELF']); 

-- Split --

上述的例子让我们需要时刻保持谨慎 coding 的心态。Chris Shiflett 在他的 Blog 总结的相当直白 ,防止 XSS 的两个基本的安全思想就是

Filter input
Escape output

我将上面翻译成 「_过滤输入,转义输出_」。详细的内容,可以参考他 Blog 的 这篇文章 ,此处略。

我的照片

嗨!我叫「明城」,八零后、码农、宁波佬,现居杭州。除了这里,同时也欢迎您关注我的 GitHubTwitterInstagram 等。

这个 Blog 原先的名字叫 Gracecode.com 、现在叫 「無標題文檔」 。 要知道作为码农取名是件很难的事情,所以不想在取名这事情上太费心思。

作为八零后,自认为还仅存点点可能不怎么被理解的幽默感,以及对平淡生活的追求和向往。 为了避免不必要的麻烦,声明本站所输出的内容以及观点仅代表个人,不代表自己所服务公司或组织的任何立场。

如果您想联系我,可以发我邮件 `echo bWluZ2NoZW5nQG91dGxvb2suY29tCg== | base64 -d`

分类

搜索

文章