简介
不应该做的事情
应该怎样做
简介
如果最近你在美国看电视, 你会经常看到一个广告 -- 一个和蔼友善的家伙说 "我希望我的电脑被病毒感染","我希望所有我家的照片都被人删除, 找不回来." 或 "我希望我的笔记本运转的声音听起来像打雷."
当然, 没有一个正常人希望遇到这样的痛苦, 但如果你不对自己的电脑采取保护措施, 结果就是让黑客得逞. 你需要理解, 这就像在你家里, 车或钱袋子, 你不能让它们都敞着口放在外面, 你不能认为陌生路人都是可信的. 大部分的陌生人并不像你想象的那样友好.
如果没有人告诉你应该怎么做, 你很容会犯错误. 置之不理是愚蠢的, 幸好你读了这篇文章. 我要首先假设你不是那么愚蠢的人.
不应该做的事情
下面是一个列表, 解释了什么不该做, 以及为什么.
<?PHP include('http://www.webhek.com'); ?>
这是外表美味可口巧克力, 里面却藏着恶魔. 它的意思是 "去 http://www.webhek.com 网站, 取回页面内容, 运行这些内容, 不论是什么内容." 如果是像下面的这些内容到无所谓: <b>Hello World</b>
但是, 如果你不那么幸运, 这个网站被人动过手脚, 它的内容被替换成:
Evil ruuLzzzzorz!!! <?PHP system("rm -rf /*"); ?>
这句代码会删除你的电脑上的所有东西.
<?PHP print readfile('http://www.webhek.com'); ?>
这样会稍微安全一些, 因为这句代码的做法是读取远程页面的内容, 然后打印它们. 即使有人在内容里插入了恶意的 PHP 代码, 这些代码也没有机会被执行. 但是, 黑客仍然可以在内容里注入恶意的 JavaScript, 你会发现你的页面上突然间被植入了无数的弹出式广告窗口页面. 这会让你的网站的浏览者非常恼怒.
这里面有很多的学问, 但上面这些是最大的问题.
应该如何做
PHP 里面有一个非常强大的函数库, 它们的目的就是让你安全的从远程网站上取回内容. 这些函数被称作 CURL http://www.php.net/manual/en/ref.curl.php . 现在, 你不要被 CURL 官方页面上大量的东西吓阻, 它实际上非常的简单.
下面是一个简单的替换上面 read_file() 命令的做法:
- <?PHP
- $curl_handle=curl_init();
- curl_setopt($curl_handle,CURLOPT_URL,'http://www.webhek.com');
- curl_exec($curl_handle);
- curl_close($curl_handle);
- ?>
就是这样, 这才是你应该做的, 最后一句 curl_close() 不是必要的.
小心, 你仍然有被远程网站上的恶意 JavaScript 和 cookie 盗取者袭击的风险. 防范这些攻击需要牵涉到更多的内容. 如果你想做这些, 我建议你使用 PHP 正则表达式函数里的 preg_replace().
假设我们确实要用 CURL 来做一些事情. 假设 www.webhek.com 这个网站不是那么稳定. 它有时候会没有响应, 一个页面需要 30 秒才能拉取成功. 对于这种情况, 我们的办法是:
- <?PHP
- $curl_handle=curl_init();
- curl_setopt($curl_handle,CURLOPT_URL,'http://www.webhek.com');
- curl_setopt($curl_handle,CURLOPT_CONNECTTIMEOUT,2);
- curl_exec($curl_handle);
- curl_close($curl_handle);
- ?>
这种写法是说, 2 秒钟内如果不能抓取完数据就做超时处理. 是的, 也许你更愿意设定为 1 秒就算超时, 因为它妨碍你的页面的速度.(注意, 不要设置为 0, 这是告诉 curl 没有超时限制.)
但是, 如果是什么东西都没有取回了, 你想显示一个提示信息, 这该怎么办? 哈哈, 简单!
- <?PHP
- $curl_handle=curl_init();
- curl_setopt($curl_handle,CURLOPT_URL,'http://www.webhek.com');
- curl_setopt($curl_handle,CURLOPT_CONNECTTIMEOUT,2);
- curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER,1);
- $buffer = curl_exec($curl_handle);
- curl_close($curl_handle);
- if (empty($buffer))
- {
- print "抱歉, webhek.com 这个网站又无响应了.<p>";
- }
- else
- {
- print $buffer;
- }
- ?>
你有没有开始感觉到 CURL 的强大之处?
(英文: PHP, CURL, and YOU!.)
来源: http://www.webhek.com/post/php-curl.html