分类目录归档:Ubuntu学习笔记

PHP防止下载链接被盗用(以及各种花式授权下载)

说到下载文件,就出现了一个问题,难道非要给别人一个那个文件的链接才可以么?这样一来,别人岂不是可以轻松的知道了那个文件在你服务器的位置?还有,怎样才可以防止别人用迅雷来下载你的文件,让你的服务器不堪重负?

经过我这两天在网上不断的寻觅,加上自己的一些思考。想到了一些解决的方法。

第一:防止盗链

现在觉得这个其实很简单,只是很多人将它弄复杂了。

原理是这样的:当服务器要我们下载文件的时候,我们会拿到一个链接,然后我们通过这个链接找到这个文件,然后将它下载下来。那么也就是说这个链接必须要有的,那么如何防止盗链呢?那就是给你的链接并不是真正的文件链接了。这一点很容易想到。那么不给你真正的链接又怎样让你下载文件呢?这是个问题。

我们再想,我们在用php做网页的时候,总是会把php代码穿插在HTML代码中间,然后用php去生成剩下的代码,然后传给客户端。也就是说客户端会接受到我们php脚本运行的结果。想到这里,问题就简单了很多。

也就是说:如果我的php脚本运行的结果就是你要下载的文件可不可以呢?

答案是肯定的,这样我们就实现了文件防盗链。就是说你能得到的链接就是这个php文件,然后再由这个百变php文件变成你想要的文件来供你下载。

思路理顺了,代码就好写了:

$FileAddress : 文件的相对路径。

$DownloadName : 文件下载到客户端的名字。

if(file_exists($FileAddress) && $file=fopen($FileAddress,”r”)) //首先要判断文件是否存在,如果文件跟本不存在的话,后边的代码也是白费。
{
Header(“content-type:application/octet-stream”); //声明文件类型,这里是为了让客户端下载它,而不是打开它,所以声明为未知二进制文件。否则客户端会根据其文件类型在线打开它。
Header(“content-Length:”.filesize($FileAddress)); //声明文件的大小,告诉客户端这个文件的大小,否则客户端下载的时候看不到进度。
Header(“content-disposition:attachment;filename=”.$DownloadName); //声明文件名,这里就是告诉客户端它要下载的文件的名字,否则名字就会是你php文件的名字。
echo fread($file,filesize($FileAddress)); //这里就是将加载的文件echo出来,因此这个php文件不能出现其他任何的文字,就是说这里若是出现了任何其他的输出的话都会输出到客户端下载的文件里。
fclose($file); //最后关闭句柄。
}

上边这些代码就成功的胜任了防止盗链的任务,只需要定义那两个变量就可以。那两个变量可以通过GET来获取,比如我们将文件实际链接与它的编号在数据库中做一个映射,我们只需要GET到一个文件ID即可对文件进行下载,保证了我们真实文件地址的安全。当然也可以是对文件真实链接进行加密之类的,总之就是不要讲真实链接再放到客户端可以看到的地方就好,不然真的就是呵呵。

第二:防止迅雷下载

其实通过上边的代码,我们只能做到链接的隐藏,并不能防止客户端用迅雷等工具对其进行下载。那么如何做到防止用迅雷等工具下载它呢?

正如我之前所说我们可以通过各种途径来使php文件得到这个文件的路径,那么,我们只要不要将这些信息加在链接里边就好了。比如:可以通过POST来传输文件的ID,可以通过session来传输文件的ID。

这就是我所说的:花式授权下载。

1.我们可以在下载的前导页写入客户端session,来储存其授权码,将文件ID也储存进去,然后再在下载的php里加入验证session的代码,这样就算客户端将连接输入迅雷下载也是没有用的。

2.我们可以在下载的前导页加入一个隐藏的表单,用POST提交给实现下载功能的php,这样也能达到防止第三方下载工具下载的目的。

总之这样的方法很多,我还有很多东西没有学到,目前能想出来的方法就这两种,主要的思路就是将要下载文件的信息和链接分开来,这样就可以达到只凭一个链接无法下载文件的目的。

在Ubuntu环境下的Apache上安装SSL证书

之前一直困扰一个问题,那就是申请到了ssl证书那么应该如何应用到网站上?

因为我用的是Apache服务器,并且通过apt-get安装的,似乎跟那个通用版还不太相同?

闲话少叙。

之前有提到过申请免费SSL证书。我用的就是这个证书,不信点上边的小锁子自己看看。。。↑_↑

首先打开申请的证书压缩文件,可以看到对于Apache版本,有这样三个文件:

crt

然后我们将这三个文件上传到服务器上,你可以上传到任何一个文件夹,我上传在:/etc/ssl

然后就是将它加载到Apache中。

第一步:打开Apache的ssl模块

这个只需要一条命令:

# a2enmod ssl 

第二步:配置虚拟服务器

打开配置文件:/etc/apache2/sites-available/default-ssl.conf

<IfModule mod_ssl.c>

<VirtualHost *:443>

ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ServerName www.tiferking.cn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

SSLEngine on
SSLCertificateFile /etc/ssl/2_tiferking.cn.crt
SSLCertificateKeyFile /etc/ssl/3_tiferking.cn.key
SSLCACertificateFile /etc/ssl/1_root_bundle.crt

<FilesMatch “\.(cgi|shtml|phtml|php)$”>
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
BrowserMatch “MSIE [2-6]” \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
BrowserMatch “MSIE [17-9]” ssl-unclean-shutdown

</VirtualHost>

</IfModule>

只需要将上述文字中所有的tiferking.cn改成你自己的域名,然后再在/etc/apache2/sites-enabled目录下建立一个链接就OK了!你可以通过这条命令来完成:

# ln -s /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-enabled/001-ssl.conf

当然假如你将证书文件放在其它地方就将SSLEngine on后边那几个文件的路径改好就可以啦~

第三步:跳转http到https

这个功能一般是通过.htaccess实现的,将以下代码复制到网站根目录的.htaccess文件当中,如果没有的话可以新建。

RewriteEngine On

RewriteCond %{SERVER_PORT} 80

RewriteRule ^(.*)$ https://www.tiferking.cn/$1 [R,L]

将上述文字中的tiferking.cn改成你自己的域名,然后保存。

再打开 /etc/apache2/apache2.conf

找到里边的

Options FollowSymLinks
AllowOverride None

改为

Options FollowSymLinks
AllowOverride All

保存。

再运行以下代码打开rewrite模块:

# ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/rewrite.load

第四步:重启Apache

输入命令重启Apache:

# apache2ctl -k restart

至此,所有的工作就完成啦,测试以下你的网站有没有绿色小锁了吧~

申请免费SSL证书

在网站的建设过程中,总会遇到关于安全的问题。比如web服务器,在进行http协议通信的时候是通过明文来进行的。如果利用类似WireShark这样的软件我们不难获取到别人的通信内容。那么如果在交换类似密码这样的敏感信息的时候就会显得非常的不安全,所以网站的通信安全是一个极大的问题。

为了安全,我们可以对通信的内容进行加密,openssl是一个不错的选择。但是问题随之而来:如何获得一个ssl证书?

在网上,有无数的关于自签名证书的制作方法,我在这里就不在赘述。但是自签名证书有一个最大的问题,那就是客户端必须安装你的根证书才行,而且当客户端在使用Google chrome这样的浏览器的时候,总会弹出吓人的警告。所以:

整一个证书签发机构(CA)签发的证书还是不错的。

我在网上找了很久,对于像我这样的穷逼,最靠谱的还是免费证书!!!

然而真的会有这样的好事?在网上找了很久,发现还真有!

是一个叫做深圳沃通的公司(首先声明,我没有拿一分钱广告费,纯属良心推荐!)

公司网址:深圳沃通

但是上去之后发现所有的ssl证书都是要收费的啊!哪里有免费证书?

其实我第一也想这么说→_→,但是我也不知道怎么一点它的免费申请入口就出现了,所以你们就别找了,我直接贴出来。。。

免费申请传送门→_→

2015-08-08-1

应该就是一个这样的页面。

然后点击箭头指向的免费申请。

2015-08-08-2

然后再填写自己网站的信息就OK了,过一会它就会给你的邮箱发一封邮件,然后点击邮件里边的链接就可以下载证书了!