php如何预防sql注入

简介: php如何预防sql注入

一.什么是sql注入

0.jpg

打印下sql发现:


tp代码:


$plat_accountinfo = Db::table("plat_account")->where("accountname='$accountname' and accountpassword='$accountpassword' and isdel=0")->find();


最终转化成原生sql:


SELECT * FROM `plat_account` WHERE  (  accountname='admin' or '1'='1' and accountpassword='abe8bbd24e9ccb7595623a512741bc85' and isdel=0 ) LIMIT 1


admin' or '1'='1 这一部分代码里面是个变量,拼接进去正好变成了上面的写法。


二.解决方法1


给用户名密码变量转义下,把里面的',字符前面增加一个\


$accountname = isset($param['accountname']) ? trim($param['accountname']) : '';

$accountpassword = isset($param['accountpassword']) ? trim($param['accountpassword']) : '';

$accountname=addslashes($accountname);

$accountpassword=addslashes($accountpassword);


然后再看下sql:


SELECT * FROM `plat_account` WHERE  (  accountname='admin\' or \'1\'=\'1' and accountpassword='abe8bbd24e9ccb7595623a512741bc85' and isdel=0 ) LIMIT 1


$accountname变量内容里面的'被增加了转义字符,’admin\' or \'1\'=\'1  ,这样就被限制住了。


三.解决方法2


tp框架可以把where条件改成数组模式


$where['accountname']=$accountname;

$where['accountpassword']=$accountpassword;

$plat_accountinfo = Db::table("plat_account")->where($where)->find();


最终的sql


SELECT * FROM `plat_account` WHERE  `accountname` = 'admin\' or \'1\'=\'1'  AND `accountpassword` = 'abe8bbd24e9ccb7595623a512741bc85' LIMIT 1


也能实现类似的效果。


四.解决方法3


       //先根据用户名获取密码,然后把传过来的明文密码加密后和数据库取出来的做对比验证

       $plat_accountinfo = Db::table("plat_account")->where("accountname='$accountname'  and isdel=0")->find();

       if($plat_accountinfo['accountpassword']!=$accountpassword){

           $rt['sta'] = 0;

           $rt['msg'] = "对不起密码不匹配!";

           echo json_encode($rt);

           die;

       }


通过用户名等于admin\' or \'1\'=\'1的方式注入,虽然能取出来一条记录,但是输入密码必须和这条记录的匹配才能验证成功,也能起到预防的效果。


相关文章
|
7天前
|
SQL 关系型数据库 MySQL
怎么通过第三方库实现标准库`database/sql`的驱动注入?
在Go语言中,数据库驱动通过注入`database/sql`标准库实现,允许统一接口操作不同数据库。本文聚焦于`github.com/go-sql-driver/mysql`如何实现MySQL驱动。`database/sql`提供通用接口和驱动注册机制,全局变量管理驱动注册,`Register`函数负责添加驱动,而MySQL驱动在`init`函数中注册自身。通过这个机制,开发者能以一致的方式处理多种数据库。
|
13天前
|
SQL 安全 关系型数据库
SQL 注入神器:SQLMap 简单使用
SQL 注入神器:SQLMap 简单使用
|
21天前
|
SQL 存储 Java
如何避免SQL注入攻击?
如何避免SQL注入攻击?
|
8天前
|
SQL 监控 安全
sql注入取数据库
SQL注入是一种攻击技术,用于在SQL查询中注入恶意代码,从而绕过安全措施,获取、修改或删除数据库中的数据。这种行为是非法的,并且严重违反了网络安全和隐私原则。我不能提供关于如何进行SQL注入的指导或
|
10天前
|
SQL 数据库 关系型数据库
【SQL注入】 注入神器sqlmap的使用
数据库 SQL注入漏洞 sqlmap
48 2
|
13天前
|
SQL XML 安全
Pikachu SQL 注入通关解析
Pikachu SQL 注入通关解析
|
13天前
|
SQL 安全 关系型数据库
SQL注入常用姿势
该内容介绍了SQL注入攻击和防御的一些基本概念,以及MySQL中的几个函数:`MID()`用于提取文本字段的字符,`LIMIT()`用于限制查询结果的数量,`COUNT()`计算元组数量。它还详细讲解了两种SQL注入方法:基于布尔盲注和基于时间盲注,包括如何猜解数据库、表和字段信息。此外,还提到了SQL注入工具Sqlmap的使用方法和一些绕过过滤策略。
23 0
SQL注入常用姿势
|
13天前
|
SQL 机器学习/深度学习 人工智能
Web LLM 实验:利用 LLM API 实现 SQL 注入
Web LLM 实验:利用 LLM API 实现 SQL 注入
|
28天前
|
SQL 关系型数据库 MySQL
0基础学习SQL注入之万能账号密码(BUUctf例题-[极客大挑战 2019]EasySQL1)
0基础学习SQL注入之万能账号密码(BUUctf例题-[极客大挑战 2019]EasySQL1)
|
28天前
|
SQL NoSQL 关系型数据库
一个基于 BigQuery 的 SQL 注入挖掘案例
一个基于 BigQuery 的 SQL 注入挖掘案例
27 0