如何为API接口文件选择合适的命名及安全措施指南
如果你的环境中有很多主页设置,比如index.php、index.html、default.html、default.php等,那么你的API接口文件一定不要使用这些。例如,可以使用iLaoZhao_XX_api.php,这谁能猜到?

1.不要使用SESSION和COOKIE。
COOKIE以明文形式存在于用户端,易于查看和修改。每个人都知道这一点。 PHP的SESSION也依赖COOKIE来存储SESSION_ID。而我们的API每次访问都需要返回一次数据。很多访问方式不存储COOKIE,这会导致SESSION失效。
2. 每次访问时验证用户名和密码。
现在比较流行的是Token方式。我也懒得去研究了。最好每次都验证用户名和密码。这样,密码泄露后,只要我改一个密码,在对方就无法再使用了。无需等待他的信息过期。当然,我们不能以明文形式传输这些东西,需要做一些加密。
3、不允许单个文件正常运行。
资源文件夹不能包含任何可执行文件。并尝试将其分成尽可能多的文件。所有文件都相互依赖,组织它们的文件是另一个单独的文件。这样,即使别人知道我们的文件路径和文件名,也无法正常访问该文件。跑步。
4. 不允许单个文件单独实现任何功能。
要实现某个文件中的函数,必须依赖于其他文件中的函数或类,而当前文件无法知道这些函数和类是在哪个文件中实现的。这样,即使这个文件的源代码被泄露,对方也不会知道里面的依赖关系,也不会影响到其他文件。
5. 身份验证不成功时,不会输出错误信息。
当用户名和密码不正确时,系统不应该输出任何有用的信息,或者输出假的404消息,这样当别人测试我们的系统时,他们不会知道哪一步出了问题,而我们的客户端可以通过码字来确定状态。
让我举一个小例子来说明。这个小例子只是一个起点,并不是我的最终代码的样子。
文件树结构:
老赵API文件树形结构
根目录只有一个文件夹,整个API系统是通过一个接口文件“DaYeLaiWanA.php”来调用的。
怎么样?不了解文件结构的人无法猜测你有哪些文件,也无法访问任何文件。
下面的代码没有使用太高级的语法,比如类、对象、命名空间等。新版本的PHP添加了很多功能,但我宁愿不使用它们。我想尽力做出没有环境要求的代码。可以在尽可能多的版本环境中运行。
毕竟我们要的是安全,不是每个人都能读懂我们的代码。
我们应该尽量不使用课本上常见的写作方法,而尝试发展自己的写作方法。
以下是DaYeLaiWanA.php的代码:
为了方便大家,我在文件上写了注释。这些注释不应包含在实际使用中。这些注释只能方便别人破解我们的系统,而这个接口文件应该尽可能的进行代码混淆和加密。
然后有一个小例子API来获取当前用户信息。该API文件存储在/iLaoZhao_api/public/login/usrMsg.php中。调用时的URL大概是这样的:
https://你的域名/iLaoZhao_api/DaYeLaiWanA.php
POST数据为:{
key:"用户名密码时间加密字符串运算后的结果",
class:"login",
fun:"usrMsg",
userName:"该用户的用户名"
}
usrMsg.php的API代码内容为:
0){
output2Die("成功。",1,$rec);
}else{
output2Die("找不到该用户。",-1); //要求高的,不要输出错误信息。
}
}
output2Die("失败",-2); //要求高的,不要输出错误信息。
这里的 checkUserNamePassWord() 函数(在 iLaoZhao_funs 文件夹中的 login.php 文件中)也很关键:
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{
//否则
die(); //结束程序运行,
}
}
}
代码中有注释,大家应该能看得清楚。还有其他自定义函数,我不会包含其代码。
这样,我们在扩展API的时候,只需要在对应的路径下编写PHP代码文件,很多功能就可以直接使用,不需要包含任何文件。
而且这个系统中的所有文件单独访问时都会出错(PHP可以设置不显示错误信息),并且如果参数不正确的话接口文件不会有任何具体的操作结果。