周报06

周报06

ynsdgyy

2025-09-24 发布14 浏览 · 0 点赞 · 0 收藏

php

静态变量:static(由于一般形参调用一次后就会重置,而静态变量可以实现跨同一函数不同调用次数共享数据,用来统计当前函数被调用次数)

可变函数:(类似函数指针用法)
例如:

function display(){};
$arge__1='display';
$arge__1();

匿名函数:
$变量=function(){}//匿名函数定义:变量保存匿名函数本质是一个对象
$变量()//匿名函数调用

查看变量内容:var_dump(函数名或者定义匿名函数的变量名)

闭包函数:

function display(){
$name=__FUNCTION__;//定义局部变量,下面函数定义如果加use($name)将外部(局部)变量保留给内部使用
}
//定义匿名函数
$innerfunction=function(){
//函数体
}
}

错误处理:1.语法错误2.运行时间错误3.逻辑错误
错误代号:可直接使用的系统常量
系统错误:
E_PARSE:编译错误,代码不会执行
E_ERROR:fatal error,致命错误,会导致代码不能正确继续执行(出错的位置断掉)+
E_WARNING: warning,警告错误,不会影响代码执行,但是可能得到意想不到的结果
E_NOTICE: notice,通知错误,不会影响代码执行。
2) 用户错误:E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE+
用户在使用自定义错误触发的时候,会使用到的错误代号(系統不会用到)
3)其他:E_ALL,代表着所有从错误(通常在进行错误控制的时候使用比较多),建议在开
发过程中(开发环境)使用
所有以E 开头的错误常量(代号)其实都是由一个字节存储,然后每一种错误占据一个对应
的位,如果想进行一些错误的控制,可以使用位运算进行操作

错误触发:
程序运行时触发:系统自动根据错误发生后,对比对应的错误信息,输出给用户:主要针对
代码的语法错误和运行时错误。
人为触发:知道某些逻辑可能会出错,从而使用对应的判断代码来触发响应的错误提示
人为触发错误举例:

$b = 0;
if ($b == 0) {
    //人为触发错误,user_notice形式触发
    trigger_error('除数不能为0!'); //默认notice,会继续执行
    trigger_error('除数不能为0!', E_USER_ERROR); //默认error,通过第二个参数进行严格性控制,代码不会执行。
}
echo $a / $b;

错误显示设置:哪些错误该最示,以及该如何最示
在 PHP 中,其实有两种方式来设置当前脚本的错误处理”
1、PHP 的配置文件:全局配置:php.ini 文件
display.errors: 是否显示错误on/off
error.reporting:最示什么级别的错误
2、可以在运行的PHP脚本中去设置,在脚本中定义的配置项级别比配置文件高
error_reporting():设置对应的错误显示级别+
ini_set('配置文件中的配置项',配置值),
ini_set('error reporting',E_ALL);
ini_set( display_errors,1);
错误日志设置
在实际生产环境中,不会直接让错误赤裸裸的展示给用户:
1、不友好
2、不安全:错误会暴露网站很多信息(路径、文件名)
所以在生产环境中,一般不显示错误(错误也比较少),但是不可能避免会出现错误(测试
的时候不会发现所有的问题),这个时候不希望看到,但是又希望捕捉到可以让后合程序员
去修改:需要保存到日志文件中,需要在 PHP 配置文件中或者代码中(ini_set)设置对应log_error

字符串定义语法
1) 单引号字符串:使用单引号包裹
2) 双引号字符串:使用双引号包裹
3) nowdoc予符串
4) heredoc字符串

//结构化定义
//heredoc结构
$str3 = <<<EOD
    hello
EOD;
//nowdoc结构
$str3 = <<<'EOD'
    hello
EOD;

字符串转义:
在PHP 中系统常用的转义符号:
':在单引号字符串中显示单引号
":在双引号字符串中最示双引号
\r:代表回车(理论上是回到当前行的首位置)
\n:代表新一行
\t:类似tab键,输出4个空格
$:在PHP中使用$符号作为变量符号,因此需要特定识别

sql注入

SQL注入是一种常见的网络攻击技术,攻击者通过在用户输入的参数中插入恶意SQL代码,欺骗数据库执行非预期的操作,从而获取、篡改或删除数据库中的敏感信息(如用户账号、密码、交易记录等),甚至控制整个数据库服务器。

其核心原理是:应用程序未对用户输入进行严格过滤或转义,直接将输入拼接进SQL语句中执行,导致攻击者可以通过构造特殊输入改变SQL语句的逻辑。
假设一个网站的登录功能,后端代码通过以下方式验证用户(以PHP为例,简化逻辑):

// 用户输入的账号和密码(未过滤)
$username = $_POST['username'];
$password = $_POST['password'];
 
// 直接拼接SQL语句
$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$result = mysqli_query($conn, $sql);

攻击场景1:绕过登录验证

攻击者在用户名输入框中输入:' OR '1'='1,密码任意输入。
此时拼接后的SQL语句变为:
SELECT * FROM users WHERE username='' OR '1'='1' AND password='任意值'
由于'1'='1'恒为真,整个条件永远成立,数据库会返回所有用户信息,攻击者无需正确账号密码即可登录。

攻击场景2:删除数据库表

若应用程序存在删除操作的接口,且未过滤输入,攻击者可能输入:'; DROP TABLE users; --
拼接后的SQL语句可能变为:
DELETE FROM orders WHERE id=''; DROP TABLE users; --'
其中;用于结束前一个语句,--注释掉后续内容,导致DROP TABLE users被执行,直接删除用户表,造成数据丢失。

防御措施

  1. 输入验证与过滤:严格校验用户输入的格式(如只允许字母、数字),过滤特殊字符(如'、;、--等)。

  2. 使用参数化查询(预编译语句):将SQL语句与参数分离,参数不参与SQL语法解析(如PHP的prepare、Python的?占位符)。
    示例(参数化查询):

$stmt = $conn->prepare("SELECT * FROM users WHERE username=? AND password=?");
$stmt->bind_param("ss", $username, $password); // 绑定参数,自动转义
$stmt->execute();
  1. 最小权限原则:数据库账号仅授予必要权限(如查询、插入),禁止DROP、DELETE等高危操作。

  2. 错误信息隐藏:生产环境中不向用户暴露详细的SQL错误信息(避免攻击者利用错误信息分析数据库结构)

请前往 登录/注册 即可发表您的看法…