zoukankan      html  css  js  c++  java
  • php 相关知识点


    1. Get与post两种方式?
    ans:
    GET->一般用于查询,参数可见不安全,且传值支持的大小不能超过2kb,效率高。
    post-> 一般用于修改保存数据,参数不可见比较安全。

    2. AJAX的优势是什么?
    ans:ajax是异步传输技术,可以通过javascript实现,也可以通过JQuery框架实现,实现局部刷新,减轻了服务器的压力,也提高了用户体验。

    3.path相关:

    pathinfo:解析文件(文件名及扩展)

    path_url:解析URL(文件名及路由及参数)

    4.left join 与 right join

    left join: 先找出左表所有匹配的数据,右边不匹配的为null

    5.如何无限分类

    id,parentid,path(相对路径)

    6. 安全对一套程序来说至关重要,请说说在开发中应该注意哪些安全机制?
    ans:①防远程提交;②防SQL注入,对特殊代码进行过滤;③防止注册机灌水,使用验证码;

    7. 如何防sql注入?

    ans:
    SQL注入攻击是黑客对数据库进行攻击的常用手段之一。一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,注入者可以在表单中输入一段数据库查询代码并提交,程序将提交的信息拼凑生成一个完整sql语句,服务器被欺骗而执行该条恶意的SQL命令。注入者根据程序返回的结果,成功获取一些敏感数据,甚至控制整个服务器,这就是SQL注入。

    主要两阶段防止:1.用户输入时候的数据校验 2.查询数据库时候的转义。3.尽量不要用mysql_error来抛出错误(错误信息进行封装)

    (1)查询条件尽量使用数组方式,这是更为安全的方式(post提交);

    (2)如果不得已必须使用字符串查询条件,使用预处理机制?

    (3)开启数据字段类型验证,可以对数值数据类型做强制转换;(3.1版本开始已经强制进行字段类型验证了)(safe_mode = on 在php ini 中设置)

    (4)使用自动验证和自动完成机制进行针对应用的自定义过滤;(magic_quotes_gpc = on) 对sql 查询进行转换

    (5)使用字段类型检查、自动验证和自动完成机制等避免恶意数据的输入。

     (6)addslashes(特使字符转义) 防止sql注入。

    用户输入校验:
    /*
    过滤用户代码
    */
    function security($str){
    $str = trim($str); //清理空格
    $str = strip_tags($str); //过滤html标签
    $str = htmlspecialchars($str); //将字符内容转化为html实体
    $str = addslashes($str);
    return $str;
    }


    8. XSS 与 CSRF?
    XSS:跨站脚本(cross—site script)发生在客户端,修复方式和防止sql注入类似
    ans:注入脚本的一种,例如提交评论中参杂javascript脚本,如果服务器没有进行过滤或转移这些脚本


    CSRF:跨站请求伪造(Cross_site_request_forgery) 发生在服务端(伪造成合法用户请求)(缓存中的session_id)
    CSFR攻击就是类似复制用户的session_id来冒充合法用户

    9.php正则函数

    php正则匹配掉js代码';
    $preg = "/<script[sS]*?</script>/i";
    $newstr = preg_replace($preg,"",$str,3); //第四个参数中的3表示替换3次,默认是-1,替换全部
    $newstr = preg_match($resg,$str,$newstr);
    echo $newstr;

    10. SESSION与COOKIE的区别?

    ans:
    ①存储位置:session存储于服务器,cookie存储于浏览器
    ②安全性:session安全性比cookie高
    ③session为‘会话服务’,在使用时需要开启服务,cookie不需要开启,可以直接用

    11. PHP处理数组的常用函数

    ans:
    ①array()创建数组;

    ②count()返回数组中元素的数目;

    ③array_push()将一个或多个元素插入数组的末尾(入栈);

    ④array_column()返回输入数组中某个单一列的值;

    ⑤array_combine()通过合并两个数组来创建一个新数组;

    ⑥array_reverse()以相反的顺序返回数组;

    ⑦array_unique()删除数组中的重复值;

    ⑧in_array()检查数组中是否存在指定的值

    12. PHP处理字符串的常用函数?
    ans:
    ①trim()移除字符串两侧的空白字符和其他字符;

    ②substr_replace()把字符串的一部分替换为另一个字符串;

    ③substr_count()计算子串在字符串中出现的次数;④substr()返回字符串的一部分;

    ⑤strtolower()把字符串转换为小写字母;

    ⑥strtoupper()把字符串转换为大写字母;

    ⑦strtr()转换字符串中特定的字符;

    ⑧strrchr()查找字符串在另一个字符串中最后一次出现;

    ⑨strstr()查找字符串在另一字符串中的第一次出现(对大小写敏感);

    strrev()反转字符串;

    strlen()返回字符串的长度;

    str_replace()替换字符串中的一些字符(对大小写敏感);

    print()输出一个或多个字符串;

    explode()把字符串打散为数组;

    is_string()检测变量是否是字符串;

    strip_tags()从一个字符串中去除HTML标签;

    mb_substr()用来截中文与英文的函数

    strpos 查找字符串所在位置

    13. 常用的魔术方法有哪些?
    __construct() 实例化类时自动调用。

    __destruct() 类对象使用结束时自动调用。

    __set() 在给未定义的属性赋值的时候调用。

    __get() 调用未定义的属性时候调用。

    __isset() 使用isset()或empty()函数时候会调用。

    __unset() 使用unset()时候会调用。

    __sleep() 使用serialize序列化时候调用。

    __wakeup() 使用unserialize反序列化的时候调用。

    __call() 调用一个不存在的方法的时候调用。

    __callStatic()调用一个不存在的静态方法是调用。

    __toString() 把对象转换成字符串的时候会调用。比如 echo。

    __invoke() 当尝试把对象当方法调用时调用。

    __set_state() 当使用var_export()函数时候调用。接受一个数组参数。

    __clone() 当使用clone复制一个对象时候调用。

    14. serialize与unserialize的认识?
    ans:
    serialize:将内存数据转化为字符串,写入硬盘 __sleep
    unserialize:将字符串转为内存数据如php变量 __wakeup

    15. include 与 require 的区别?
    include:根据流程引入,且不存在流程也能正常进行。 有返回值

    requeire:不管放在哪都是最先引入该文件,如果不存在则会报错。 无返回值

    include_once :只引入一次,如果引入过则不在引入。

    requeire_once :只引入一次,如果引入过则不在引入。

    16. 什么是composer可以解决自动加载类?
    ans:
    Composer 是 PHP 的一个依赖管理工具,"快速安装类库"。工作原理就是将已开发好的扩展包从 packagist.org composer仓库下载到我们的应用程序中,并声明依赖关系和版本控制。
    composer命令:

    composer list 列出所有可用的命令
    composer init 初始化composer.json文件(就不劳我们自己费力创建啦),会要求输入一些信息来描述我们当前的项目,还会要求输入依赖包
    composer install 读取composer.json内容,解析依赖关系,安装依赖包到vendor目录下
    composer update 更新最新的依赖关系到compsoer.lock文件,解析最新的依赖关系并且写入composer.lock文件
    composer search packagename 搜索包,packagename替换为你想查找的包名称
    composer require packagename 添加对packagename的依赖,packagename可修改为你想要的包名称
    composer show packagename
    composer self-update 更新 composer.phar文件自身
    composer dump-autoload --optimize 优化一下自动加载

    17. PHP7 和 PHP5 的区别,具体多了哪些新特性?
    ans:
    性能提升了两倍(
    因为:变量存储字节减小,减少内存占用,提升变量操作速度

    改善数组结构,数组元素和 hash 映射表被分配在同一块内存里,降低了内存占用、提升了 cpu 缓存命中率

    改进了函数的调用机制,通过优化参数传递的环节,减少了一些指令,提高执行效率)

    结合比较运算符 (<=>)

    标量类型声明

    返回类型声明

    try...catch 增加多条件判断,更多 Error 错误可以进行异常处理

    匿名类,现在支持通过new class 来实例化一个匿名类,这可以用来替代一些“用后即焚”的完整类定义

    18. PHP 的设计模式?
    1. 单例模式(重点):
    ans:实例化出来的对象是唯一的。
    why: 当存在大量数据库操作时,可以避免大量new对象,减少数据库连接
    implement: 私有化实例,私有化构造方法,私有化克隆方法,公有化静态获取实例的方法(getinstant)
    2. 工厂模式(重点)
    ans:建立一个工厂来根据所需创建对象(解决紧耦合:改一个类就要改很多其他调用的地方)。
    工厂模式分为:简单工厂模式,工厂方法模式,抽象工厂模式
    3. 观察者模式(重点)
    4. 依赖注入(重点)

    19. 依赖注入实现原理?
    ans:实现低耦合高扩展。
    依赖注入DI:应用程序依赖容器创建并注入到所需的外部资源
    控制反转IOC:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源

    依赖注入就是组件通过构造器,方法或者属性字段来获取相应的依赖对象。
    为什么用依赖注入:解决高耦合。

    注入的途径:construct注入,set注入

    20. 请用正则表达式(Regular Expression)写一个函数验证电子邮件的格式是否正确。
    if(isset($_POST['action']) && $_POST['action']==’submitted’){
    $email=$_POST['email'];
    if(!preg_match(“/^[0-9a-zA-Z-]+@[0-9a-zA-Z-]+(.[0-9a-zA-Z-]+){1,3}$/”,$email)){
    echo“电子邮件检测失败”;
    }else{
    echo“电子邮件检测成功”;
    }
    }

    21. sql注入之预处理(pdo)?

    22. 防止盗链?

    1.服务器防止: apach 或 nginx 做rewrite(重定向) 基于源来做判断防止盗链(防止别的网站请求我们网站的资源)

    2.代码防止: $_SERVER[‘HTTP_REFERER’] 判断是否来自我们网站的请求(通过判断域名和ip)

    所以一般来说,只有通过 <a></a> 超链接以及 POST 或 GET 表单访问的页面,$_SERVER['HTTP_REFERER'] 才有效。

    23 echo true =>1

       echo false => 空

    echo 默认打印十进制 echo012 => 18

    print 非函数

    eval():将字符串表达式执行

    $str = '$a = 1+1;'     注意要加上封号

    echo eval($str);

    24. 跨域问题?

    常见跨域方式:

    1.JSONP(只支持get)

    2.空iframe加form

    3.CORS:CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)跨域资源共享 CORS 详解。看名字就知道这是处理跨域问题的标准做法。CORS有两种请求,简单请求和非简单请求。

    例子:

    header('Access-Control-Allow-Origin: http://*.baidu.com'); //设置http://*.baidu.com允许跨域访问

    4.Nginx代理设置




  • 相关阅读:
    PHP之简单实现MVC框架
    socket泄露的问题
    gdb 调试多线程
    MMAP和DIRECT IO区别
    三年回首:C基础
    定时器管理:nginx的红黑树和libevent的堆
    strsep和strtok_r替代strtok
    缓存穿透和缓存失效
    mmap为什么比read/write快(兼论buffercache和pagecache)
    B+Tree和MySQL索引分析
  • 原文地址:https://www.cnblogs.com/-cyh/p/10140683.html
Copyright © 2011-2022 走看看