PHP面试题
1、不用系统函数反转字符串
function descstr($str){ $len=strlen($str); //函数返回字符串的长度: $newstr=""; for($i=$len-1;$i>=0;$i--){ $newstr.=$str[$i]; //注意此处的花括号 } return $newstr; }
2、验证邮箱的正则表达式
^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$
//Print、echo、print_r有什么区别?
//(1) echo和print都可以做输出,不同的是,echo不是函数,没有返回值,而print是一个函数有返回值,所以相对而言如果只是输出echo会更快,而print_r通常用于打印变量的相关信息,通常在调试中使用。
//(2) print 是打印字符串
//(3)print_r 则是打印复合类型 如数组 对象
3、SESSION与COOKIE的区别?
(1)存储位置:session存储于服务器,cookie存储于浏览器
(2)安全性:session安全性比cookie高
(3)session为‘会话服务’,在使用时需要开启服务,cookie不需要开启,可以直接用
4、常见状态码
1xx (临时响应)表示临时响应并需要请求者继续执行操作的状态代码。
2xx (成功)表示成功处理了请求的状态代码。
3xx (重定向) 表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。
4xx (请求错误) 这些状态代码表示请求可能出错,妨碍了服务器的处理。
5xx (服务器错误)这些状态代码表示服务器在尝试处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。
600 源站没有返回响应头部,只返回实体内容
5、reqiure的include的作用及区别?
两者都用于包含文件,require如果包含文件出错会报致命错误并且停止运行,而include会报Notice错误,程序继续运行。require_once会检查是否重复包含,如果已经包含则不再执行,include同理。
6、客户端IP地址和服务器端IP地址。
$_SERVER['REMOTE_ADDR'] $_SERVER['SERVER_ADDR']
7、print()、echo、print_r()、var_dump()等区别。
print()、echo 都是语言结构,不同的是前者打印只能接受一个变量,后者可以输出多个。
print_r()和var_dump()都是函数。
前者格式化打印变量。但print_r()输出布尔值和NULL的结果没有意义,打印true返回1,null则不显示。
后者也是格式化打印变量。但会详细的打印出变量的类型,长度,数值,如果包含多层将递归打印。更适合调试。
1 fopen() 打开一个文件或 URL。 2 fread() 读取打开的文件。 3 fwrite() 写入文件。 4 fclose() 关闭打开的文件。 5 file_get_contents() 将文件读入字符串。 6 file_put_contents() 将字符串写入文件。file_put_contents("test.txt","test!",FILE_APPEND); 7 filesize() 返回文件大小。 8 filetype() 返回文件类型。 9 file_exists() 检查文件或目录是否存在。
真题:打开文件,将文件内容读取出来,在开头加入Hello World,将拼接好的字符串写回到文件当中
1 $file = './hello.txt'; 2 $handle = fopen($file,'r'); 3 $content = fread($handle,filesize($file)); 4 $content = 'Hello World'.$content; 5 fclose($handle); 6 $handle = fopen($file,'w'); 7 fwrite($handle,$content); 8 fclose($handle);
真题:PHP遍历文件夹
$dir = './test'; function loopDir($dir) { $handle = opendir($dir); //目录/文件/子目录/子文件名称为0或者空这种情况不全等于false不跳出循环,目录里指针全读取完则为false,跳出循环 while(false!==($file = readdir($handle))) { //$file只显示名称,并不显示完整路径 if($file != '.' && $file != '..') { echo $file."\n"; if(filetype($dir.'/'.$file) == 'dir') { loopDir($dir.'/'.$file); } } } } loopDir($dir);
9、PHP垃圾回收机制
php中的变量存储在变量容器zval中,zval中除了存储变量类型和值外,还有is_ref和refcount字段。refcount表示指向变量的元素个数,is_ref表示变量表示是否是引用变量。如果refcount为0时,就回收该变量容器。
10、PHP常见的设计模式
工厂模式、单例模式、注册模式、适配器模式、观察者模式、策略模式、原型模式、装饰器模式
工厂模式:用工厂方法代替new操作的一种模式,如果需要更改所实例化的类名,只需在工厂方法内修改,不需逐一寻找代码中具体实例化的地方。
单例模式:防止重复实例化,避免大量的new操作,减少消耗系统和内存的资源,使得有且仅有一个实例对象。
参考链接:
https://www.cnblogs.com/legendheng/p/9082266.html
https://blog.csdn.net/Merlin_feng/article/details/42390737
https://blog.csdn.net/flitrue/article/details/52614599
11、栈和堆、栈和队列的区别?
栈是编译期间就分配好的内存空间, 存取数据较快,代码中必须就栈的大小有明确的定义,缺乏灵活性。
堆是程序运行期间动态分配的内存空间,可以根据程序的运行情况确定要分配的堆内存的大小。
队列先进先出,栈先进后出。
栈是只能在表的一端进行插入和删除操作的线性表。 队列是只能在表的一端进行插入和在另一端进行删除操作的线性表。
12、数据库事物及其特性?
事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。
事务特性:
(1)原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。
(2)一致性。事务的执行使得数据库从一种正确状态转换成另一种正确状态
(3)隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,
(4) 持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。
13、索引的作用?和它的优点缺点是什么?
答:索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。
14、RESTful
RESTful架构应该遵循统一接口原则,统一接口包含了一组受限的预定义的操作,不论什么样的资源,都是通过使用相同的接口进行资源的访问,采用HTTP协议规定的GET、POST、PUT、DELETE动作处理资源的增删该查操作。(简单来说就是通过同一个接口根据不同的提交方式进行增删改查)
15、oop设计原则
1)单一职责原则:一个类的功能尽量单一,降低耦合
2)接口隔离原则:将大的接口打散成多个小接口
3)开放-封闭原则:软件实体应该对扩展开放,对修改(对已有软件模块、特别是最重要抽象层模块的的更改)关闭。
4)里氏代换原则:如果对于每一个类型为A的对象a,都有类型为B的对象b,使得A定义的所有程序P在所有对象a都替换成b时,程序P没有变化,那么B是A的子类型。
5)依赖倒换原则:抽象不应依赖于细节,细节应依赖于抽象;针对接口而非实现编程。
6)迪米特法则(对于封装)(Law of Demeter LoD)又叫做最少知识原则(Least Knowledge Principle,LKP):对象间尽量最少了解,彻底将API接口和具体实现相分离,模块间仅仅通过API进行通信。
在select语句前加上explain就可以了:
如:explain select surname,first_name form a,b where a.id=b.id
17、isset和empty的区别
isset()函数 一般用来检测变量是否设置
若变量不存在则返回 FALSE
若变量存在且其值为NULL,也返回 FALSE
若变量存在且值不为NULL,则返回 TURE
同时检查多个变量时,每个单项都符合上一条要求时才返回 TRUE,否则结果为 FALSE
PHP的empty()函数 判断值为否为空
若变量不存在则返回 TRUE
若变量存在且其值为""、0、"0"、NULL、、FALSE、array()、var $var; 以及没有任何属性的对象,则返回 TURE
若变量存在且值不为""、0、"0"、NULL、、FALSE、array()、var $var; 以及没有任何属性的对象,则返回 FALSE
1)file_get_contents //可以细分为post方式和get方式
2)fopen
3)fsockopen //也可以分为get方式和post方式
4)curl
20、$this、self、parent分别代表什么?
$this:当前对象
self: 当前类
parent: 当前类的父类
21、memcached、redis mongodb之间的区别?
22、sql语句应考虑哪些安全性?
(1)少使用root账户,应该为不同的动作分配不同的账户;
(2)sql执行出错后,不能把数据库中显示的出错信息,直接展示给用户。防止泄露服务器和数据库相关信息;
(3)防止sql注入,对特殊字符进行转义、过滤或者使用预编译的sql语句绑定变量。
23、mysql_fetch_row 和 mysql_fetch_array 的区别
mysql_fetch_array 从结果集取出一行数组作为关联数组、数字数组
mysql_fetch_row 从结果集取出一行数组作为索引数组
mysql_fetch_assoc 从结果集取出一行数组作为关联数组
24、获取文件扩展名
通过pathinfopathinfo() 函数可以返回一个关联数组包含有 path的信息,那么如下代码,我们用pathinfo获取1.txt这个文件的路径信息。 <?php var_dump(pathinfo('1.txt')); 返回信息如下图:
<?php $data = (pathinfo('1.txt')); echo $data['extension']; //或直接使用emplode()分解文件名
25、PHP实现上传图片
26、查找‘aAvsad’中‘A’首次出现的位置
strpos(‘aAvsad’,'A');
27、表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列
select (case when a>b then a else b end),(case when b>c then b else c end) from table1
28、使用header提示404?
Header("HTTP/1.1 404 Not Found");
29、PHP 不使用第三个变量实现交换两个变量的值
list(
$b
,
$a
)=
array
(
$a
,
$b
);
19、什么是CSRF,怎么防范?
跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。
CSRF如何防御
方法一、Token 验证:(用的最多)
1)服务器发送给客户端一个token;
2)客户端提交的表单中带着这个token。
3)如果这个 token 不合法,那么服务器拒绝这个请求。
方法二:隐藏令牌:
把 token 隐藏在 http 的 head头中。
方法二和方法一有点像,本质上没有太大区别,只是使用方式上有区别。
方法三、Referer 验证:
Referer 指的是页面请求来源。意思是,只接受本站的请求,服务器才做响应;如果不是,就拦截。
20、什么是XSS,怎么防范?
XSS(Cross Site Scripting):跨域脚本攻击。
XSS的攻击原理
XSS攻击的核心原理是:不需要你做任何的登录认证,它会通过合法的操作(比如在url中输入、在评论框中输入),向你的页面注入脚本(可能是js、hmtl代码块等)。
最后导致的结果可能是:
盗用Cookie破坏页面的正常结构,插入广告等恶意内容D-doss攻击
XSS的攻击方式
1)、反射型
发出请求时,XSS代码出现在url中,作为输入提交到服务器端,服务器端解析后响应,XSS代码随响应内容一起传回给浏览器,最后浏览器解析执行XSS代码。这个过程像一次反射,所以叫反射型XSS。
2)、存储型存
储型XSS和反射型XSS的差别在于,提交的代码会存储在服务器端(数据库、内存、文件系统等),下次请求时目标页面时不用再提交XSS代码。
XSS的防范措施(encode + 过滤)
XSS的防范措施主要有三个:
1)、编码:
对用户输入的数据进行
HTML Entity 编码。
如上图所示,把字符转换成 转义字符。
Encode的作用是将
$var
等一些字符进行转化,使得浏览器在最终输出结果上是一样的。
比如说这段代码:
<script>alert(1)</script>
若不进行任何处理,则浏览器会执行alert的js操作,实现XSS注入。
进行编码处理之后,L在浏览器中的显示结果就是
<script>alert(1)</script>
,实现了将$var作为纯文本进行输出,且不引起JavaScript的执行。
2)、过滤:
移除用户输入的和事件相关的属性。如onerror可以自动触发攻击,还有onclick等。(总而言是,过滤掉一些不安全的内容)移除用户输入的Style节点、Script节点、Iframe节点。(尤其是Script节点,它可是支持跨域的呀,一定要移除)。
3)、校正
避免直接对HTML Entity进行解码。使用DOM Parse转换,校正不配对的DOM标签。备注:我们应该去了解一下
DOM Parse
这个概念,它的作用是把文本解析成DOM结构。
比较常用的做法是,通过第一步的编码转成文本,然后第三步转成DOM对象,然后经过第二步的过滤。
还有一种简洁的答案:
首先是encode,如果是富文本,就白名单。
CSRF 和 XSS 的区别
区别一:
CSRF:需要用户先登录网站A,获取 cookie。XSS:不需要登录。
区别二:(原理的区别)
CSRF:是利用网站A本身的漏洞,去请求网站A的api。XSS:是向网站 A 注入 JS代码,然后执行 JS 里的代码,篡改网站A的内容。