php curl的CURLOPT_FOLLOWLOCATION选项报错
2015-11-24 17:59
531 查看
问题
程序报错:CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set
http头的location字段
location字段出现在服务响应包里面,意思是当前请求的数据挪地方了,请再次请求location对应的地址获取数据。curl的CURLOPT_FOLLOWLOCATION选项
curl的这个选项,意思是跟随location字段(如果有的话),递归直到真实数据返回回来。问题解决
safe_mode:PHP安全模式,当开启时一些PHP函数将被禁用open_basedir: 将用户访问文件的活动范围限制在指定的区域 如 open_basedir=.:/tmp 或是具体 /var/tmp
以上两个配置都在php.ini中设定。关于问题,可以修改配置,或者在curl代码那里这样写:
if (ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off')) { curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); }
php安全模式
php安全模式:safe_mode=on|off启用safe_mode指令将对在共享环境中使用PHP时可能有危险的语言特性有所限制。可以将safe_mode是指为布尔值on来启用,或者设置为 off禁用。它会比较执行脚本UID(用户ID)和脚本尝试访问的文件的UID,以此作为限制机制的基础。如果UID相同,则执行脚本;否则,脚本失败。
具体地,当启用安全模式时,一些限制将生效。
1、所有输入输出函数(例如fopen()、file()和require())的适用会受到限制,只能用于与调用这些函数的脚本有相同拥有者的文件。例如,假定启用了安全模式,如果Mary拥有的脚本调用fopen(),尝试打开由Jonhn拥有的一个文件,则将失败。但是,如果Mary不仅拥有调用 fopen()的脚本,还拥有fopen()所调用的文件,就会成功。
2、如果试图通过函数popen()、system()或exec()等执行脚本,只有当脚本位于safe_mode_exec_dir配置指令指定的目录才可能。
3、HTTP验证得到进一步加强,因为验证脚本用于者的UID划入验证领域范围内。此外,当启用安全模式时,不会设置PHP_AUTH。
4、如果适用MySQL数据库服务器,链接MySQL服务器所用的用户名必须与调用mysql_connect()的文件拥有者用户名相同。
安全模式和禁用的函数
下面是启用safe_mode指令时受影响的函数、变量及配置指令的完整列表:
apache_request_headers() backticks()和反引号操作符 chdir()
chgrp() chmode() chown()
copy() dbase_open() dbmopen()
dl() exec() filepro()
filepro_retrieve() filepro_rowcount() fopen()
header() highlight_file() ifx_*
ingres_* link() mail()
max_execution_time() mkdir() move_uploaded_file()
mysql_* parse_ini_file() passthru()
pg_lo_import() popen() posix_mkfifo()
putenv() rename() zmdir()
set_time_limit() shell_exec() show_source()
symlink() system() touch()
以下是一些和安全模式相关的配置选项
safe_mode_gid=on|off
次指令会修改安全模式的行为,即从执行前验证UID改为验证组ID。例如,如果Mary和John处于相同的用户组,则Mary的脚本可以对John的文件调用fopen()。
safe_mode_include_dir=string
可以使用指令safe_mode_include_dir指示多个路径,启用安全模式时在这些路径中将忽略安全模式。例如,你可以使用此函数指定一个包含不同模板的目录,致谢模板可能会继成到一些用户网站。可以指定多个目录,在基于UNIX的系统各目录用冒号分隔,在Windows中用分号分隔。
注意,如果指定某个路径但未包含最后的斜线,则该路径下的所有目录都会忽略安全模式设置。例如,如果设置次指令为/home /configuration,表示/home/configuration/templates/和/home/configureation /passwords都排除在安全模式限制之外。因此,如果只是要排除一个目录或一组目录不受安全模式设置的限制,要确保每个目录都包括最后的斜线。
safe_mode_env_vars=string
当启用安全模式时,可以只用次指令允许执行用户的脚本修改某些环境变量。可以允许修改多个变量,每个变量之间用逗号分隔。
safe_mode_exec_dir=string
次指令指定一些目录,其中的系统程序可以通过诸如system()、exec()或passthru()等函数执行。为此必须启用安全模式。此指令有一个奇怪的地方,在所有操作系统中(包括Windows),都必须使用斜线(/)作为目录的分隔符。
safe_mode_protected_env_vars=string
此指令保护某些环境变量不能被putenv()函数修改。默认情况下,变量LD_LIBRARY_PATH是受保护的,因为如果在运行时修改这个变量可能导致不可预知的结果。关于此环境变量的更多信息,请参考搜索引擎或Linux手册。注意,本届中声明的所有便来弄个都覆盖 safe_mode_allowed_env_vars指令中声明的变量。
另外,由于启用了安全模式后,由于会对比文件的拥有者和文件的执行者是否是一个人,所以会减慢执行效率。
相关文章推荐
- win10下PHP的安装
- 如何用原生PHP GET到一个数组
- yii2 的 restful 接口书写自定义方法
- 多媒体开发之h264的三种字节流格式---annexb 哥伦布/mp4 以及还有一种rtp传输流格式
- PHP中使用sleep函数实现定时任务实例
- php生成短网址的思路以及实现方法
- [Mysql数据库] php连mysql的工具类
- PHP页面跳转的三种方法
- Vsftp 虚拟用户配置
- 50个提高PHP程序运行效率的方法
- PHP数据库连接之PDO
- PHP魔术函数、魔术常量、预定义常量
- PHP 和HHVM 性能之争
- PHP PHP-CGI 进程 CPU 100% 与 file_get_contents 函数的关系
- PHP扩展开发-简单类扩展
- phpcms 缓存文件
- php与java联调的aes加解密
- PHP $_SERVER['SCRIPT_FILENAME'] 与 __FILE__ 的区别
- zend笔记
- 解决phpmyadmin中缺少mysqli扩展问题的方法