Deprecated
: htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in
/www/wwwroot/testblog.58heshihu.com/var/Widget/Archive.php
on line
1057
首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
182 阅读
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
篇文章
累计收到
28
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
9
篇与
的结果
2023-08-08
php如何发起POST DELETE GET POST 请求
php如何发起POST DELETE GET POST 请求关于POST,DELETE,GET,POST请求get:是用来取得数据。其要传递过的信息是拼在url后面,因为其功能使然,有长度的限制post:是用来上传数据。要上传的数据放在request的head里。没有长度限制。主要是用于增加操作put:也是用来上传数据。但是一般是用在具体的资源上。主要用于修改操作delete:用来删除某一具体的资源上。发起POST DELETE GET POST 请求通用类<?php class commonFunction{ function callInterfaceCommon($URL,$type,$params,$headers){ $ch = curl_init(); $timeout = 5; curl_setopt ($ch, CURLOPT_URL, $URL); //发贴地址 if($headers!=""){ curl_setopt ($ch, CURLOPT_HTTPHEADER, $headers); }else { curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type: text/json')); } curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); switch ($type){ case "GET" : curl_setopt($ch, CURLOPT_HTTPGET, true);break; case "POST": curl_setopt($ch, CURLOPT_POST,true); curl_setopt($ch, CURLOPT_POSTFIELDS,$params);break; case "PUT" : curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "PUT"); curl_setopt($ch, CURLOPT_POSTFIELDS,$params);break; case "DELETE":curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "DELETE"); curl_setopt($ch, CURLOPT_POSTFIELDS,$params);break; } $file_contents = curl_exec($ch);//获得返回值 return $file_contents; curl_close($ch); } } ?>调用:$params="{user:\"admin\",pwd:\"admin\"}"; $headers=array('Content-type: text/json',"id: $ID","key:$Key"); $url=$GLOBALS["serviceUrl"]."/user"; $strResult= spClass("commonFunction")->callInterfaceCommon($url,"PUT",$params,$headers);$headers:如果参数值需要header传,可以以数组格式传递
2023年08月08日
17 阅读
0 评论
0 点赞
2023-08-08
PHP curl 实现RESTful PUT DELETE 实例
客户端client.php<?php//PUT$curl_handle = curl_init ();// Set default options.curl_setopt ( $curl_handle, CURLOPT_URL, 'http://my.focus.cn/test/socket.php');curl_setopt ( $curl_handle, CURLOPT_FILETIME, true );curl_setopt ( $curl_handle, CURLOPT_FRESH_CONNECT, false );curl_setopt ( $curl_handle, CURLOPT_HEADER, true );curl_setopt ( $curl_handle, CURLOPT_RETURNTRANSFER, true );curl_setopt ( $curl_handle, CURLOPT_TIMEOUT, 5184000 );curl_setopt ( $curl_handle, CURLOPT_CONNECTTIMEOUT, 120 );curl_setopt ( $curl_handle, CURLOPT_NOSIGNAL, true );curl_setopt ( $curl_handle, CURLOPT_HEADER, true );curl_setopt ( $curl_handle, CURLOPT_CUSTOMREQUEST, 'PUT' );$aHeader[] = "Content-Type:text/xml;charset=UTF-8";$aHeader[] = "x-bs-ad:private";curl_setopt($curl_handle, CURLOPT_HTTPHEADER, $aHeader);$file = 'client.php';$file_size = filesize($file);$h = fopen($file,'r');curl_setopt ( $curl_handle, CURLOPT_INFILESIZE, $file_size);curl_setopt ( $curl_handle, CURLOPT_INFILE, $h);curl_setopt ( $curl_handle, CURLOPT_UPLOAD, true );$ret = curl_exec ( $curl_handle );print_r($ret);?>DELETE 只要将$curl_handle = curl_init ();// Set default options.curl_setopt ( $curl_handle, CURLOPT_URL, 'http://my.focus.cn/test/socket.php?file=socket.txt');curl_setopt ( $curl_handle, CURLOPT_FILETIME, true );curl_setopt ( $curl_handle, CURLOPT_FRESH_CONNECT, false );curl_setopt ( $curl_handle, CURLOPT_HEADER, true );curl_setopt ( $curl_handle, CURLOPT_RETURNTRANSFER, true );curl_setopt ( $curl_handle, CURLOPT_TIMEOUT, 5184000 );curl_setopt ( $curl_handle, CURLOPT_CONNECTTIMEOUT, 120 );curl_setopt ( $curl_handle, CURLOPT_NOSIGNAL, true );curl_setopt ( $curl_handle, CURLOPT_CUSTOMREQUEST, 'DELETE' );$ret = curl_exec ( $curl_handle );服务端server.php<?php$raw_post_data = file_get_contents('php://input', 'r');$method = $_SERVER['REQUEST_METHOD'];if('PUT' == $method){$headers = apache_request_headers();file_put_contents('socket.txt',$raw_post_data.print_r($headers,true));}else if('DELETE'==$method){unlink($_GET['file']);}echo '<?xml version="1.0" encoding="UTF-8"?>OK';
2023年08月08日
17 阅读
0 评论
0 点赞
2023-08-08
设计不使用oauth身份验证的安全restful api
设计不使用oauth身份验证的安全restful api调用api的客户端程序,需要在header处发送 API_ID: 1API_TIME: 时间戳API_HASH: $clienthash$user="username";$publicKey='hello';$privateKey= hash_hmac('sha256', $user, $publicKey); 需要先把客户端程序的privateKey存入数据库.$data=json字符串.$clienthash = hash_hmac('sha256', API_TIME.API_ID.$data, $privateKey);API端验证:$serverHash = hash_hmac('sha256', API_TIME.API_ID.$data, $privateKey);//到数据库查找此客户端的privateKey;如果$clientHash === $serverHash 进入第二层验证如果服务器时间和API_TIME在设定的时间段内,则验证通过.第2种方式:设定一个密钥比如key = ‘2323dsfadfewrasa3434'。 2. 这个key 只有发送方和接收方知道。3. 调用时,发送方,组合各个参数用密钥 key按照一定的规则(各种排序,MD5,ip等)生成一个access_key。一起post提交到API接口。4. 接收方拿到post过来的参数以及这个access_key。也和发送一样,用密钥key 对各个参数进行一样的规则(各种排序,MD5,ip等)也生成一个access_key2。5. 对比access_key 和access_key2 。一样。则允许操作,不一样,报错返回或者加入黑名单。
2023年08月08日
12 阅读
0 评论
0 点赞
2023-08-08
如何实现RESTful Web API的身份验证
如何实现RESTful Web API的身份验证最近想拿一个小项目来试水RESTful Web API,项目只有几个调用,比较简单,但同样需要身份验证,如果是传统的网站的话,那不用说,肯定是用户名+密码在登录页获得登录Token,并把登录Token记在Cookie和Session中作为身份标识的这种方式,但现在不同了,关键是RESTful,这意味着我们设计出来的这些API是无状态的(Stateless),下一次的调用请求和这一次的调用请求应该是完全无关的,也就是说,正宗的RESTful Web API应该是每次调用都应该包含了完整的信息,没错,包括身份信息!那如何确保安全?传输时给密码做MD5加密?得了吧!这样做只能让你自己感觉“安全”点,其实没什么任何用处,利用现在的技术(有种叫什么Rainbow Table啥的来着?本人外行,不是很懂)很快就能算出明文密码了,而且如何防止挟持和重发攻击?也许你想到了,SSL,如果你打算采用SSL,请忘记一切自行设计的加密方案,因为SSL已经帮你做好了一切,包括防止监听,防止挟持,防止重发……一切都帮你考虑好了,你大胆地把明文密码写在你的包中就OK了,我向你保证没问题。但SSL的缺点是服务器端配置相对有点复杂,更关键的就是客户端对此支持可能不好,那你考虑一种自己的加密方法,有木有?我这里提供一种方法,思路来自于:http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/,我只是把上面的内容中整理了一下变成了我的方法。(传说中的剽窃?呵呵)方法描述如下:假设有一个用户,用户名是guogangj,密码是123456(呃……这也能叫密码?)他要GET http://test.com/api/orders/于是把 http://test.com/api/orders/这个URL和一个新生成的GUID拼在一起,再用123456这个密码执行对称加密,生成的密文为XXXXOOOOXXXXOOOO(假设而已)数据包中带上用户名guogangj和XXXXOOOOXXXXOOOO这个密文,发送给服务器服务器收到包后,根据guogangj这个用户名到数据库中查找到123456这个密码服务器使用123456这个密码来解密XXXXOOOOXXXXOOOO这个密文,得到了明文,即http://test.com/api/orders/这个URL和前面由客户端生成的那个GUID服务器到一个全局的集合中查找这个GUID,看看是否已经存在,如果存在,则验证不通过,如果不存在,就将其放入这个集合中。这是为了避免重发攻击。这个全局的集合会越来越大,所以还要定期清理。服务器再比对解密出来的URL和用户真实请求的URL是否一致,如果一致,那么认为这是合法用户,验证通过!这是大致过程,如果数据库里找不到该用户,或者解密错误,都被认为验证不通过。以下是一些改进:数据库中的密码最好做一下摘要(MD5之类的),客户端对应地也要做一下。在生成密文的时候可以考虑加入另外一些不希望被明文传输的敏感内容,甚至可以加入IP地址,并在服务器端验证。并非每次都要真正去数据库里拿一次用户信息,也许你有更好的办法,比如一个简单的缓存(不过需要处理缓存更新的问题),或者当你的系统大到一定程度的时候,你考虑使用统一的服务来获取用户信息,这就不是缓存那么简单了,里面的文章很多,我相信现在大规模的门户网站都有自己的一套复杂的机制,所以表明上看RESTful Web API很“低效”,但这种RESTFul的思路和模式却在实际中有很大的可塑性和威力。这种方法应该足够安全了!密码根本没有在网络上传输,密文采用的是非验证的对称加密,没有密钥就无法逆转,URL验证避免了传统的身份挟持攻击(即拦截一个用户的包并冒充此用户来访问其它的资源,即便无法破解用户密码), 再用GUID来避免了重发攻击,唯一需要担心的是用户泄露了自己的密码。元芳,你怎么看?通过参考网上大神的资料,大致想了下面这种访问控制的办法。1、为每个应用颁发一个账号(user)和密码(password),相当于(公钥和私钥)。2、服务器后台存储该账号和密码(密文存储 MD5加密)3、应用端在通过HTTP请求该接口的时候,需要在HTTP HEADER 附带下面几个字段时间date=unix时间戳签名sign=sign该sign的生成算法是这样的String sign = HTTPMETHOD(GET/POST)+ api_uri(API的访问URI)+date(即上面的UNIX时间戳)+length(发送body的数据长度)+password(后台颁发的密码)sign = MD5(sign)sign = user+":"+sign4、后台服务器在接收到请求后1、比对HTTP头中的时间戳,比对服务器时间,如果超过某个阈值,则拒绝访问,同时返回请校准你的应用时间。2、如果没有超过时间阈值,则从sign中取出user然后在数据库中查找对应的password,然后同样根据上面的sign生成算法,来生成sign进行身份认证,认证成功则执行API,失败则返回认证失败。==============================Lenix 注usernamepassword()urlGUID(随机数)客户端 加密:url+guid 用password执行对称加密=XXXOOOXXXOOO客户端 发送 token=username-XXXOOOXXXOOO 到 服务器服务器解密:服务器收到包后,根据username这个用户名到数据库中查找到password这个密码服务器使用password这个密码来解密XXXXOOOOXXXXOOOO这个密文,得到了明文,即url+guid.服务器到一个全局的集合中查找这个GUID,看看是否已经存在,如果存在,则验证不通过,如果不存在,就将其放入这个集合中服务器再比对解密出来的URL和用户真实请求的URL是否一致,如果一致,那么认为这是合法用户,验证通过!如果数据库里找不到该用户,或者解密错误,都被认为验证不通过。ps 数据库中的密码最好做一下摘要(MD5之类的),客户端对应地也要做一下。
2023年08月08日
14 阅读
0 评论
0 点赞
1
2