api管理系统php源码 Api 国内PHP开源接口框架

最后一章开始了。在这一章,让我们来做这个API的基本结构。我们称之为“老赵API系统”。首先,我们要做的API系统是私有的,不是开源的,不会分发给其他人使用(当然你要大力推广,随便你)。其次,我故意漏了一个小点子,是我自己用的,也怕我的方法泄露后会有安全问题。姑且称...

最后一章开始了。在这一章,让我们来做这个API的基本结构。

我们称之为“老赵API系统”。

首先,我们要做的API系统是私有的,不是开源的,不会分发给其他人使用(当然你要大力推广,随便你)。

其次,我故意漏了一个小点子,是我自己用的,也怕我的方法泄露后会有安全问题。

姑且称之为邀请吧。

先说以下几点:

0.不要使用默认主页。

1.不使用会话和COOKIE。

2.每次访问时,您都需要验证您的用户名和密码。

3.不允许单个文件正常运行。

4.没有一个文件可以独立实现任何功能。

5.当身份验证不成功时,不输出任何错误提示。

相信很多位高权重的人看到这些文章就知道我想干什么了。有人会嗤之以鼻,说太初级了。

谁在乎呢。反正这是我自己发现的。就算黑客黑了,我也只能从操作系统入手。在我的系统里,他不可能有成功的访问请求。

下面详细说一下:

0.不要使用默认主页。

如果在你的环境中首页有很多设置,比如index.php、index.html、default.html、default.php等。,那么你的API的接口文件一定不能使用这些。比如可以用ilaozhao _ xx _ api.php。谁能猜到?

1.不使用会话和COOKIE。

COOKIE以明文形式存在于客户端,便于查看和修改。这个大家都知道。而PHP的SESSION也依赖于COOKIE来存储一个SESSION_ID。并且我们的API必须在每次被访问时返回数据。很多访问方法不存储COOKIE,会导致会话失效。

2.每次访问时验证用户名和密码。

现在流行的叫Token的方式就是我懒得研究了。最好每次都验证用户名和密码,这样如果我在密码泄露后改了一个密码,就不能马上在那里使用了。甚至不用等他的信息过期。当然,我们不能用明文传递这些东西,所以我们需要做一些加密。

3.不允许单个文件正常运行。

该文件夹不能有任何可执行文件。并且尽量分割出尽可能多的文件,所有的文件都是相互依赖的,把它们组织在一起的文件是另外一个单独的文件,这样别人即使知道我们的文件路径和文件名,在访问这个文件的时候也无***常运行。

4.没有一个文件可以单独实现任何功能。

一个文件必须依赖其他文件中的函数或类来实现其功能,当前文件无法知道这些函数和类是在哪个文件中实现的。即使这个文件的源代码泄露了,对方也不知道里面的依赖关系,所以不会涉及到其他文件。

5.当身份验证不成功时,不输出任何错误提示。

当用户名和密码错误时,系统不应该输出任何有用的信息或者一个假的404信息,这样别人测试我们的系统时,根本不知道哪一步出了问题,我们的客户端可以根据里面的码字判断状态。

我举个小例子说明一下,这个小例子只是一种引玉的方式,不是我的最终代码。

文件树结构:

树形结构:

老赵API文件树结构

根目录下只有一个文件夹,整个API系统通过一个接口文件”DaYeLaiWanA.php & # 8221打电话。

反正不知道文件结构的人根本猜不到你有哪些文件,所以也无法访问任何文件。

下面的代码没有使用太高级的语法,比如类和对象命名空等。PHP的新版本增加了许多功能,但我宁愿不使用它们。我会尽量让代码对环境没有要求,尽可能多的版本运行。

毕竟我们要的是安全,不是每个人都能看懂我们的代码。

我们应该尽量不要用课本上通用的写作方法,而是要发展自己的写作方法。

以下是DaYeLaiWanA.php的代码:

<?php//接口文件,单独调用这个文件没任何作用,参数必须得对,差一个字母这个文件都运行不出个毛线来。//而参数是你自己定的,可随意加密修改。//当然你还可以把这个路径也放到变量里,然后藏起来。include "./iLaoZhao_funs/postget.php"; //没有依赖,但也不实现任何具体功能include "./iLaoZhao_funs/login.php"; //依赖pdo,dbfuns,postget和接口文件include "./iLaoZhao_funs/curl.php"; //没有依赖,但也不实现任何具体功能include "./iLaoZhao_funs/dbfuns.php"; //依赖pdo和接口文件//上面这些文件里涉及到安全的功能都有依赖,并且他们不知道要用的函数在哪//全靠这个接口文件把它们组合到一起//并且上面的函数里也会用到接口文件的函数(就是下面那个)//这些因素缺一不可,只能由接口文件来整合他们//上面这些文件和其它的API文件,都无法单独运行。不是缺这就是缺那。//下面这俩函数是故意没单独放文件里的,为的就是其它文件缺少这个接口文件时在调用这个函数时会出错。function output2Die($msg, $code = -1, $data = ''){ $***Msg['code'] = $code; $***Msg['msg'] = $msg;$***Msg['data'] = $data; echo json_encode($***Msg); ***();}function isPhone($phonenumber){ return preg_***tch("/^1[3-9]d{9}$/", $phonenumber);}$area = POST("area");//要使用的API种类$class = POST("class");//要使用的API小分类$fun = POST("fun");//要使用的API功能//清理POSTunset($_POST['area']);unset($_POST['class']);unset($_POST['fun']);if ($class !== FALSE && $fun !== FALSE){ if ($area == false){$area = "public";} //生成API文件全名,这里没加密,你可以自己变动这里。 $incFile = dirname(__FILE__)."/{$area}/{$class}/{$fun}.php"; if (file_exists($incFile)){ //检查API文件是否存在,其实不检查也行。include "./config/pdodb.php"; //创建数据库连接,依赖接口文件 include $incFile;//将单独的API文件导入进来 }else{//我因为调试的原因,显示了错误信息,要求高的可以去掉。output2Die("无效的请求", -1); }}else{output2Die("无效的请求", -2);}

为了您的方便,我已经在文件上写了注释。其实用的时候是不能有这些评论的。这些评论只能方便别人破解我们的系统,这个接口文件尽量用代码混淆加密。

然后是一个获取当前用户信息的小示例API。这个API文件存在于
/ilaozhao _ API/public/log in/usr msg . PHP中,调用时,URL大致是这样的:

https://你的域名/iLaoZhao_api/DaYeLaiWanA.phpPOST数据为:{key:"用户名密码时间加密字符串运算后的结果",class:"login",fun:"usrMsg",userName:"该用户的用户名"}

API内容usrMsg.php是:

<?php//示例文件,得到当前用户的所有信息//文件依赖:接口文件、数据库连接文件、dbfuns文件、login文件//单独访问这个文件根本不能运行//依赖关系完全靠接口文件处理//这个API读取post参数中的userNamecheckUserNamePassWord(); //检查用户名密码,不对真接就终止运行了,对了的话就可以运行下面的代码$dbArr['userName'] = POST("userName");if($dbArr['userName'] !== false){ //这一步没必要,能验证过上面那个函数,这个参数肯定存在,但我就是写了,就是玩儿//一定要用PDO的绑定功能访问数据库,这种方式能避免SQL注入。$sql = "select * from tb_users where users_userName = :userName";$rec = db_query($sql,$dbArr);if($rec['count'] > 0){output2Die("成功。",1,$rec);}else{output2Die("找不到该用户。",-1); //要求高的,不要输出错误信息。}}output2Die("失败",-2); //要求高的,不要输出错误信息。

这里的checkUserNamePassWord()函数(在iLaoZhao_funs文件夹的login.php文件中)也很关键:

<?php/** * 判断用户名密码的函数 此函数不允许返回东西 调用的时候直接调用 用户正常自然没反应 用户不正常,这个函数直接结束程序运行。 */function checkUserNamePassWord(){$keyStr = "这里是加密字符串,这个串只有你自己知道是什么。";$key = POST("key"); //这个key是客户端把用户名密码时间加密字符串运算后的结果//用当前日期当第二密钥,这个作用是每天的密钥都不一样。//即便被拦截了,也算不出规律来,当然源码泄露了就不行了。//不能太精确,因为客户端与服务器端的时间不可能完全一样。$keyStr_Today = date('Ymd',time());//访问数据库,一定要用PDO的这个参数方式。//这个方式在代入数据与直接写在SQL语句里不一样。//sql注入在这种使用方式下完全不会生效。$sqlPar['username'] = POST("userName"); //这个没加密的必要,这个在输入框里就能看到,而且也会在很多地方显示。if($sqlPar['username'] === false || $key === false){//非法调用}//不要在sql里直接比对用户名密码//而且传过来的数据也没有密码//要取出该用户的记录,然后计算后与传过来的加密身份信息对比$sql = "select * from tb_users where userName=:username"; //你可以在这limit 1$rec = db_query($sql, $sqlPar);if($rec['count'] > 0){$keyInDB = md5(md5($keyStr).md5($rec['rows'][0]['userName']).md5($keyStr_Today).md5($rec['rows'][0]['passWord']));//上面这句是加密方式,把加密字符串、用户名、当前日期、密码的MD5连接起来并再计算一次MD5//当然你还可以再加点别的东西,比如字符串反转,以及其它变量之类的。//上面这句计算出来的和$key中的一样时,说明密码是对的。if($key == $keyInDB){//用户名密码对//此时我们啥也不做//或者你想设置某些变量也行}else{//否则***(); //结束程序运行,}}}

代码里有注释,应该能看清楚。而且还有其他自定义函数,我就不放代码了。

这样,我们在扩展API的时候,只需要在相应的路径中编写PHP代码文件,很多函数不需要包含任何文件就可以直接使用。

而且这个系统的所有文件单独访问都会出错(PHP可以设置为不显示错误信息),参数不正确接口文件也不会有任何具体的运行结果。

也没有可访问的默认主页文档。

路径和文件名不规范,网上找不到参考。

那么破解这个API只有两种方法:

0.黑掉服务器操作系统,然后从文件系统入手。

1.破解客户端代码或者截取访问数据,找到访问规则。

这两个问题我们都无能为力。

* *一边写文档一边写代码,头有点乱,可能缺了点什么。不知道你能不能看懂。

* *这个API系统还有很多地方可以进一步加密,但我个人觉得没必要。够了。

* *这段代码没有使用太高级的语法,比如类命名空等等。PHP的新版本增加了许多功能,但我宁愿不使用它们。我会尽量让代码对环境没有要求,尽可能多的版本运行。

毕竟我们要的是安全,不是每个人都能看懂我们的代码。

如果你忘了什么,请稍后补充。

本文来自Total.不想长大投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/630305.html

打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
() 0
上一篇 07-12
下一篇 07-12

相关推荐

  • 韩顺平php从入门到精通 php从入门到精通教程

    数组基础含义:数组是一系列数据的***,这些数据按照设定的顺序排列成“链状”。注意:php中数组单元的顺序与下标无关!数组定义(赋值):$arr1 = array(3,11,5,18,2);//这是最常见的数组,下标是“默认下标”,是从0开始的整数;$ arr 2 = array(" a " = >3、“bb”= &g

    2023-07-29 01:18:01
    299 0
  • php时间代码 php变量和字符串拼接

    对于一门编程语言来说,对文件和目录的操作是其最基本的功能。我们日常生活中最常见的图片上传、文件上传等功能,都需要文件和目录操作的支持。今天我们先简单学习一下PHP中关于目录操作的一些类和函数。目录分隔符和路径分隔符我们先来看两个常量,分别是目录和路径的分隔符

    2023-07-27 01:02:01
    753 0
  • php登录页面实现 php简单的登录页面代码

    使用PHP实现登录和注册功能并使用PHP读取mysql数据库-以表格形式显示数据。登录界面& ltbody & gt& lt表单操作= ”log in 1 . PHP ”方法= ”邮政”& gt& ltdiv & gt用户名:;& ltdiv & gt密码:;& ltdiv & gt& lt输入类型= ”提交”value = &

    2023-07-23 07:32:01
    436 0
  • php导入excel文件 php实现excel表共享

    PhpExcel早就停止维护了,现在用的是phpSpreadSheet。网上那些phpSpreadSheet教程都在唠叨这个那个,一个都打不出来~我还是要看看这个。如果代码被***走,修改后可以使用。简直太没礼貌了!固定作曲家需要phpoffice/phpspreadsheet密码& lt?服务器端编程语言(Professional

    2023-07-22 04:20:01
    948 0

评论列表

联系我们

在线咨询: QQ交谈

邮件:admin@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信