当前位置: 首页 > news >正文

服务端字符过滤 与 SQL PDO防注入

注入示例

 

# step 1 SQL
SELECT * FROM users WHERE username = 'admin' AND password = 'e10adc3949ba59abbe56e057f20f883e'
# step 2 SQL
SELECT * FROM users WHERE username = 'admin'#' AND password = '96e79218965eb72c92a549dd5a330112'

关键点是这2个SQL的区别.其中第二步由于前台传入特殊字符单引号(')及#,在数据库中#为语句注释部分,则后续SQL语句不会被执行,可直接跳过我们的密码验证逻辑。

username还可以是 'admin' OR 1='1  跳过验证

1. PHP端防注入

1.1 字符型过滤
/*discuz过滤函数*/
function inject_check($sql_str)  
{  return preg_match('/^select|insert|and|or|create|update|delete|alter|count|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile/i', $sql_str); // 进行过滤  
} $data[] = $_GET['username'];
$data[] = $_GET['passwd'];
function inject_checks($data) {foreach($data as $key => $val){if(preg_match('/^select|insert|and|or|create|update|delete|alter|count|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile/i', $val)){return true;}}return false;
}

上面是discuz过滤字符型注入的函数  ,返回检测结果,1 or 0

1就是存在特殊字符

示例:

if(inject_check($str)){exit('非法字符!');
}foreach($_POST as $key => $value){if(inject_check($value)){echo '非法字符';exit();}
}

这种要求比较严格的过滤,一般应用在注册和登陆环节

1.2 数字型的过滤

$id = intval($_GET['id']);

数字型的就比较简单了。只需要转换一下

1.3 富文本的过滤

$html = "<a href='test'>Test</a>";
$html = addslashes($html);

输出:

<a href=\'test\'>Test</a>

需要显示的时候再用 stripslashes 处理

 
1.4 统一转义
if (!get_magic_quotes_gpc())
{if (!empty($_GET)){$_GET  = addslashes_deep($_GET);}if (!empty($_POST)){$_POST = addslashes_deep($_POST);}$_COOKIE   = addslashes_deep($_COOKIE);$_REQUEST  = addslashes_deep($_REQUEST);
}function addslashes_deep($value)
{if (empty($value)){return $value;}else{return is_array($value) ? array_map('addslashes_deep', $value) : addslashes($value);}
}
 

array_map() 函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。

这样数组中的每个值都得到转义处理

2.  PDO方式防止注入

pdo中的预处理语句

$servername = "localhost";
$username = "root";
$password = "";
$dbname = "haha";try {$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);// 设置 PDO 错误模式为异常$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);// 预处理 SQL 并绑定参数$stmt = $conn->prepare("select * from dw_user where `username`=:username and `password`=:password");$stmt->bindParam(':username', $firstname);$stmt->bindParam(':password', $pass);// 插入行$firstname = $_POST['username'];$pass = $_POST['password'];//$lastname = "Doe";//$email = "john@example.com";$stmt->execute();$rs = $stmt->Fetch();if($rs['user_id'] > 0 ){echo '登陆成功!';exit();}else{echo '登陆失败!';exit();}// 插入其他行//$firstname = "Mary";//$lastname = "Moe";//$email = "mary@example.com";//$stmt->execute();// 插入其他行//$firstname = "Julie";//$lastname = "Dooley";//$email = "julie@example.com";//$stmt->execute();//echo "新记录插入成功";
}
catch(PDOException $e)
{echo "Error: " . $e->getMessage();
}
$conn = null;
预处理绑定 会变成字符串包起来 不是 简单的 SQL 拼接
 
http://www.xdnf.cn/news/223021.html

相关文章:

  • [C语言]猜数字游戏
  • 软件系统容量管理:反模式剖析与模式应用
  • 什么是环境变量,main函数的命令行参数的概念和作用,以及进程地址空间详解
  • antd中的表格穿梭框(Transfer)如何使用
  • 类和对象 (拷贝构造函数和运算符重载)上
  • MySQL学习总结
  • 华锐视点历经十八年沉淀所形成的产品特性
  • 【AI平台】n8n入门4:n8n云创建工作流(无须搭建,快速试用14天)
  • TypeScript 全局类型声明文件规范性分析与归纳
  • 赛事季突围!备战2025全国信息素养大赛 python挑战赛~
  • JavaScript 相关知识点整理
  • 【LLM】Qwen3模型训练和推理
  • Proser:重新介绍
  • Linux(权限管理)
  • FastAPI的发展历史
  • 在VMware上创建Ubuntu虚拟机,与Xshell和Xftp的连接和使用
  • 文心一言开发指南08——千帆大模型平台推理服务API
  • 9.idea中创建springboot项目_jdk1.8
  • 无需下载,免费在线AI音乐生成器:爱狐AI详解与使用
  • C# 继承详解
  • LangChain4j +DeepSeek大模型应用开发——5 持久化聊天记忆 Persistence
  • 问题整理篇---(1)keil
  • Linux查看程序端口占用情况
  • Kubernetes in action-Kubernetes的pod
  • 使用Python将YOLO数据集拆分成固定文件数量的小数据集
  • Mixture-of-Experts(MoE)原理与在DeepSeek中的应用
  • HOOPS 2025全面适配Linux ARM64:性能突破、能耗优化与工业3D可视化部署场景全解析!
  • Samba-系统集成
  • 混淆矩阵(Confusion Matrix);归一化混淆矩阵(Confusion Matrix Normalized)
  • Mac配置Maven环境变量避坑