2020.04.29

1. 如何实现PHP的安全最大化?怎样避免SQL注入漏洞和XSS跨站脚本攻击漏洞?

基本原则:不对外界展示服务器或程序设计细节(屏蔽错误),不相信任何用户提交的数据(过滤用户提交)

  • 屏蔽错误,将display_errors 设置为off
  • 过滤用户提交参数,这里需要注意的是不能仅仅通过浏览器端的验证,还需要经过服务器端的过滤
    • 这里是需要注意最多的地方,因为所有用户提交的数据入口都在这里,这是过滤数据的第一步。
    • 考虑是否过滤select,insert,update,delete,drop,create等直接操作数据的命令语句
    • 使用 addslashes 将所有特殊字符过滤
    • 打开magic_quotes_gpc,开启该参数数后自动将sql语句转换,将 ‘ 转换成 \’
  • 可以考虑设置统一入口,只允许用户通过指定的入口访问,不能访问未经许可的文件等内容
  • 可以考虑对安全性要求高的文件进行来源验证,比如要想执行b.php必须先执行a.php,可以在b.php中判断来自a.php的referer,避免用户直接执行b.php

2020.06.19

2. 一个用户注册功能的密码有如下要求:由数字和字母组成,并且要同时含有数字和字母,且长度要在8-16位之间。

需求分析:

  1. 不能全部是数字
  2. 不能全部是字母
  3. 必须是数字或字母

答案:^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$ ** ^ 匹配一行的开头位置(?![0-9]+$) 预测该位置后面不全是数字(?![a-zA-Z]+$) 预测该位置后面不全是字母 [0-9A-Za-z] {8,16} 由8-16位数字或这字母组成 $ 匹配行结尾位置 注:(?!xxxx) 是正则表达式的负向零宽断言一种形式,标识预该位置后不是xxxx字符。

2020.07.16

  • PHP避免SQL注入的函数:

    mysql_real_escape_string

  • 变量名不能以数字开头


  • 静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。($实例化对象->静态成员属性名 ×


  • 比较字符串

    strcmp() 用于比较两个字符串(区分大小写)。最终返回结果是:所返回的符号乘上两个字符串相比不相同的字符个数 strcasecmp() 用于比较两个字符串(不区分大小写)

  • floor()为舍去取整发,返回不大于value的下一个整数。


  • __tostring()必须 return 字符串, 否则致命错误。不能抛出异常,否则致命错误。


  • bool empty ( mixed $var )

如果 var 是非空或非零的值,则 empty() 返回 FALSE。换句话说,“”0“0”、NULL、FALSE、array()var $var; 以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE。

  • final 被用于类和方法前,不能被用来标识成员属性。
    • 用于类前:不可被继承。
    • 用于方法前:不可被覆盖。
  • static属性常驻内存,静态属性不会被立刻回收。
  • 没有方法体的方法叫抽象方法,包含抽象方法的类必须是抽象类。
  • -
    • get_class_vars 返回由类的默认属性组成的数组
    • get_class_methods 返回由类的方法名组成的数组
    • get_class 返回对象的类名


  • PDO 提供了三种不同的错误处理模式,以满足不同风格的应用开发:
    • PDO::ERRMODE_SILENT

此为默认模式。 PDO 将只简单地设置错误码,可使用 PDO::errorCode() 和 PDO::errorInfo() 方法来检查语句和数据库对象。如果错误是由于对语句对象的调用而产生的,那么可以调用那个对象的 PDOStatement::errorCode() 或 PDOStatement::errorInfo() 方法。如果错误是由于调用数据库对象而产生的,那么可以在数据库对象上调用上述两个方法。

  • PDO::ERRMODE_WARNING

除设置错误码之外,PDO 还将发出一条传统的 E_WARNING 信息。如果只是想看看发生了什么问题且不中断应用程序的流程,那么此设置在调试/测试期间非常有用。

  • PDO::ERRMODE_EXCEPTION

除设置错误码之外,PDO 还将抛出一个 PDOException 异常类并设置它的属性来反射错误码和错误信息。此设置在调试期间也非常有用,因为它会有效地放大脚本中产生错误的点,从而可以非常快速地指出代码中有问题的潜在区域(记住:如果异常导致脚本终止,则事务被自动回滚)。
异常模式另一个非常有用的是,相比传统 PHP 风格的警告,可以更清晰地构建自己的错误处理,而且比起静默模式和显式地检查每种数据库调用的返回值,异常模式需要的代码/嵌套更少。

2020.09.09
mysql

  • 执行SQL语句: select count(*) from articles 时,MyISAM和InnoDB哪个快
    • MyISAM快,因为MyISAM本身就记录了数量,而InnoDB要扫描数据

PHP

  • Session可不可以设置失效时间,比如30分钟之后过期
    • 设置 session.cookie_lifetime 有30分钟,并设置 session.gc_maxlifetime 为30分钟
    • 自己为每一个session值增加timestamp
    • 每次访问之前,判断时间戳
  • PHP进程间通信的几种方式
    • 消息队列
    • 信号量+共享内存
    • 信号
    • 管道
    • socket
  • 获取一个文本文件最后n行内容

    1. <?php
    2. function tail($file, $num) {
    3. $fp = fopen($file,"r");
    4. $pos = -2;
    5. $eof = "";
    6. $head = false; // 当总行数小于num时,判断是否到第一行了
    7. $lines = array();
    8. while ($num > 0){
    9. while ($eof != PHP_EOL) {
    10. if (fseek($fp,$pos,SEEK_END) == 0) { // fseek成功返回0,失败返回-1
    11. $eof = fgetc($fp);
    12. $pos--;
    13. } else { // 当到达第一行行首时,设置pos失败
    14. fseek($fp,0,SEEK_SET);
    15. $head = true;
    16. break;
    17. }
    18. }
    19. array_unshift($lines,str_replace(PHP_EOL,'',fgets($fp)));
    20. if ($head) {
    21. break;
    22. }
    23. $eof = "";
    24. $num--;
    25. }
    26. fclose($fp);
    27. return $lines;
    28. }
  • $SERVER[‘SERVER_NAME’] 和 $SERVER[‘HTTP_HOST’] 的区别

    • 相同点:当满足以下三个条件时,两者会输出相同信息
      • 服务器为80端口
      • Apache 的 conf 中 ServerName 设置正确
      • HTTP/1.1 协议规范
    • 不同点

      • 通常情况: $SERVER[“HTTP_HOST”] 在HTTP/1.1协议规范下,会根据客户端的HTTP请求输出信息。 $SERVER[“SERVER_NAME”] 默认情况下直接输出apache的配置文件httpd.conf中的ServerName值。
      • 当服务器为非80端口时: $SERVER[“HTTP_HOST”] 会输出端口号,例如:coffeephp.com:8080 $SERVER[“SERVER_NAME”] 会直接输出ServerName值 因此在这种情况下,可以理解为:$SERVER[‘HTTP_HOST’] = $SERVER[‘SERVER_NAME’] : $_SERVER[‘SERVER_PORT’]
      • 当配置文件httpd.conf中的ServerName与HTTP/1.0请求的域名不一致时: httpd.conf配置如下:

        1. <virtualhost *>
        2. ServerName jsyzchen.com
        3. ServerAlias blog.jsyzchen.com
        4. </virtualhost>
      • 客户端访问域名 blog.jsyzchen.com $SERVER[“HTTP_HOST”] 输出 blog.jsyzchen.com $SERVER[“SERVER_NAME”] 输出jsyzchen.com

  • 验证ip是否正确

    1. <?
    2. function check_ip($ip){
    3. return filter_var($ip,FILTER_VALIDATE_IP);
    4. }
  • 验证日期是否合理

    1. <?php
    2. function check_datetime($datetime) {
    3. return date('Y-m-d H:i:s', strtotime($datetime)) === $datetime;
    4. }