在文件上传中,我们经常会要求显示用户上传文件大小,超过上传限制的文件就会不允许用户上传。虽然我们可以用程序去判断上传文件是否超过限制,但是其实我们的PHP程序是无法判断用户本地文件大小的。所以等到我们的PHP来判断文件大小的时候,那个文件其实已经上传到服务器了。这时候再判断超过限制了,不允许上传。可就有点马后炮了。
  那么有没有办法在文件上传之前就判断将要上传的文件是否超过限制,不允许用户上传呢?答案是肯定的,只是经常被人们遗忘而已。这个办法不是在程序上解决的。而是使用html的标签解决的。

<input type="hidden" name="MAX_FILE_SIZE" value="30000" />

将这段代码一定要放到文件提交框之前,就可以了。给个完整的例子如下:
<form enctype="multipart/form-data" action="__URL__" method="POST">
   <!-- MAX_FILE_SIZE must precede the file input field -->
   <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
   <!-- Name of input element determines name in $_FILES array -->
   Send this file: <input name="userfile" type="file" />
   <input type="submit" value="Send File" />
</form>


使用了这个隐藏域之后,可以在用户提交之后,文件上传之前就进行限制判断,超过限制,马上做出$_FILES['error'] =2的错误。这样就可以避免等一个大文件传上服务器以后才发现超过限制了。这样既浪费了用户的表情,也浪费了我们的贷款。所以在这里,我ArthurXF强烈建议大家在做文件上传的时候加上上面的限制,以提高用户的体验!
Tags: , ,
  最近在做SNS的好友邀请功能,这个功能可以支持登录MSN或者QQ,各个邮局抓取地址簿中好友的email地址,PHP做这个功能就需要cURL啦,cURL可谓神通广大,可以模拟POST动作进行远程登陆,我们在windows下做测试,就需要在windows下安装cURL了。

  首先我们到php.ini中将extension=php_curl.dll前面的;去掉了。重启apache之后,发现cURL并未安装上来。原来还需要两个文件才能正常调用。
  在php的安装目录下找到libeay32.dll 和 ssleay32.dll,把他们复制到C:\WINNT\SYSTEM32 中。再重启,就看到cURL正常安装了。下面就可以继续做好友邀请功能了。呵呵。

  以上文章是由ArthurXF倾情奉献,转载时请保留作者信息。谢谢。
Tags: , ,
  1、防止跳出web目录

  首先修改httpd.conf,如果你只允许你的php脚本程序在web目录里操作,还可以修改httpd.conf文件限制php的操作路径。比如你的web目录是/usr/local/apache/htdocs,那么在httpd.conf里加上这么几行:

  php_admin_value open_basedir /usr/local/apache
/htdocs

  这样,如果脚本要读取/usr/local/apache/htdocs以外的文件将不会被允许,如果错误显示打开的话会提示这样的错误:

  Warning: open_basedir restriction in effect. File is in wrong directory in

  /usr/local/apache/htdocs/open.php on line 4

  等等。

  2、防止php木马执行webshell

  打开safe_mode,

  在,php.ini中设置

  disable_functions= passthru,exec,shell_exec,system

  二者选一即可,也可都选

  3、防止php木马读写文件目录

  在php.ini中的

  disable_functions= passthru,exec,shell_exec,system

  后面加上php处理文件的函数

  主要有

  fopen,mkdir,rmdir,chmod,unlink,dir

  fopen,fread,fclose,fwrite,file_exists

  closedir,is_dir,readdir.opendir

  fileperms.copy,unlink,delfile

  即成为

  disable_functions= passthru,exec,shell_exec,system,fopen,mkdir,rmdir,chmod,unlink,dir

  ,fopen,fread,fclose,fwrite,file_exists

  ,closedir,is_dir,readdir.opendir

  ,fileperms.copy,unlink,delfile

  ok,大功告成,php木马拿我们没辙了,遗憾的是这样的话,利用文本数据库的那些东西就都不能用了。

  如果是在windos平台下搭建的apache我们还需要注意一点,apache默认运行是system权限,这很恐怖,这让人感觉很不爽.那我们就给apache降降权限吧。

  net user apache fuckmicrosoft /add

  net localgroup users apache /del

  ok.我们建立了一个不属于任何组的用户apche。

  我们打开计算机管理器,选服务,点apache服务的属性,我们选择log on,选择this account,我们填入上面所建立的账户和密码,重启apache服务,ok,apache运行在低权限下了。

  实际上我们还可以通过设置各个文件夹的权限,来让apache用户只能执行我们想让它能干的事情,给每一个目录建立一个单独能读写的用户。这也是当前很多虚拟主机提供商的流行配置方法哦,不过这种方法用于防止这里就显的有点大材小用了。
Tags: ,
很多时候我们在检测一个数组里是否包含了某个键值时会使用arrar_key_exists这个函数,这个函数最大的有点就是不管这个数组的值是什么,只要这个键值存在就返回true。那么如果在一个大数据量的数组中找到一个键值是否存在用这个函数呢效率就很低了。
  我们从工作原理上来说,要想知道一个数组里是否包含一个键值,那肯定是遍历这个数组一个键值一个键值的检查是否相等,如果全部遍历结束,没找到就返回false,但是这里面就有问题了,如果在大数据量中经常查找一个键值,这么不断的遍历势必造成效率低下。
  其实只要我们知道需要查找的那个数组值不为NULL,那么我们直接使用检查值函数isset(),或者直接使用$arr['key'],效率就会高很多。下面我们做一个例子测试一下:

<?php
include("common.php");
$time1 = getTime();
$arr = array('a'=>1,'b'=>3);
for($i=0;$i<10000000;$i++){
//if ($arr['a']) 1==1;
if (array_key_exists('a',$arr)) 1==1;
}
$time2 = getTime();
echo $time2-$time1;
?>
结果为:11.054秒

<?php
include("common.php");
$time1 = getTime();
$arr = array('a'=>1,'b'=>3);
for($i=0;$i<10000000;$i++){
if ($arr['a']) 1==1;
//if (array_key_exists('a',$arr)) 1==1;
}
$time2 = getTime();
echo $time2-$time1;
?>
结果为:4.079秒
由些可知:用array_key_exists程序效率慢了很多,但是在直接使用的时候,千万一定要注意,对于值为NUll或者0的数组检查,还是需要使用array_key_exists函数的。
//用这个header指令来解决URL重写产生的404 header
header('HTTP/1.1 200 OK');

// 页面没找到
header('HTTP/1.1 404 Not Found');

// 访问受限
header('HTTP/1.1 403 Forbidden');

// The page moved permanently should be used for
// all redrictions, because search engines know
// what's going on and can easily update their urls.
//页面被永久删除,可以告诉搜索引擎更新它们的urls
//PS:第一次碰到这个指令,不知道能不能用来把自己的站点从搜索引擎中删除呢?
header('HTTP/1.1 301 Moved Permanently');

// 服务器错误
header('HTTP/1.1 500 Internal Server Error');

// 重定向到一个新的位置
header('Location: http://www.example.org/');

// 延迟一段时间后重定向
header('Refresh: 10; url=http://www.example.org/');
print 'You will be redirected in 10 seconds';

// 也可以使用HTML语法来实现延迟
// zip"');
header('Content-Transfer-Encoding: binary');
// 加载要下载的文件:
readfile('example.zip');

// 禁止缓存当前文档:
header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header('Pragma: no-cache');

// 设置内容类型:
header('Content-Type: text/html; charset=iso-8859-1');
header('Content-Type: text/html; charset=utf-8');
header('Content-Type: text/plain'); // plain text file
header('Content-Type: image/jpeg'); // JPG picture
header('Content-Type: application/zip'); // ZIP file
header('Content-Type: application/pdf'); // PDF file
header('Content-Type: audio/mpeg'); // Audio MPEG (MP3,...) file
header('Content-Type: application/x-shockwave-flash'); // Flash animation

// 显示登录对话框,可以用来进行HTTP认证
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Top Secret"');
print 'Text that will be displayed if the user hits cancel or ';
print 'enters wrong login data';
Tags: ,
分页: 8/15 第一页 上页 3 4 5 6 7 8 9 10 11 12 下页 最后页 [ 显示模式: 摘要 | 列表 ]