热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP防sql注入

产生原因一方面自己没这方面的意识,有些数据没有经过严格的验证,然后直接拼接SQL去查询。导致漏洞产生,比如:$id$_GET

产生原因

一方面自己没这方面的意识,有些数据没有经过严格的验证,然后直接拼接 SQL 去查询。导致漏洞产生,比如:

$id = $_GET['id'];
$sql
= "SELECT name FROM users WHERE id = $id";

因为没有对 $_GET['id'] 做数据类型验证,注入者可提交任何类型的数据,比如 " and 1= 1 or " 等不安全的数据。如果按照下面方式写,就安全一些。

$id = intval($_GET['id']);
$sql = "SELECT name FROM users WHERE id = $id";

把 id 转换成 int 类型,就可以去掉不安全的东西。

验证数据

防止注入的第一步就是验证数据,可以根据相应类型进行严格的验证。比如 int 类型直接同过 intval 进行转换就行:

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

字符处理起来比较复杂些,首先通过 sprintf 函数格式话输出,确保它是一个字符串。然后通过一些安全函数去掉一些不合法的字符,比如:

$str = addslashes(sprintf("%s",$str)); 
//也可以用 mysqli_real_escape_string 函数替代addslashes

这样处理以后会比较安全。当然还可以进一步去判断字符串长度,去防止「缓冲区溢出攻击」比如:

$str = addslashes(sprintf("%s",$str)); 
$str = substr($str,0,40); //最大长度为40


参数化绑定

参数化绑定,防止 SQL 注入的又一道屏障。php MySQLi 和 PDO 均提供这样的功能。比如 MySQLi 可以这样去查询:

$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'world');
$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;
$stmt->bind_param('sssd', $code, $language, $official, $percent);


PDO 的更是方便,比如:

/* Execute a prepared statement by passing an array of values */
$sql &#61; &#39;SELECT name, colour, caloriesFROM fruitWHERE calories <:calories AND colour &#61; :colour&#39;; $sth &#61; $dbh->prepare($sql, array(PDO::ATTR_CURSOR &#61;> PDO::CURSOR_FWDONLY));
$sth->execute(array(&#39;:calories&#39; &#61;> 150, &#39;:colour&#39; &#61;> &#39;red&#39;));
$red &#61; $sth->fetchAll();
$sth->execute(array(&#39;:calories&#39; &#61;> 175, &#39;:colour&#39; &#61;> &#39;yellow&#39;));
$yellow &#61; $sth->fetchAll();


我们多数使用 php 的框架进行编程&#xff0c;所以最好不要自己拼写 SQL&#xff0c;按照框架给定参数绑定进行查询。遇到较为复杂的 SQL 语句&#xff0c;一定要自己拼写的时候&#xff0c;一定要注意严格的判断。没有用 PDO 或者 MySQLi 也可以自己写个 prepared&#xff0c;比如 wordprss db 查询语句&#xff0c;可以看出也是经过严格的类型验证。

function prepare( $query, $args ) {if ( is_null( $query ) )return;// This is not meant to be foolproof -- but it will catch obviously incorrect usage.if ( strpos( $query, &#39;%&#39; ) &#61;&#61;&#61; false ) {_doing_it_wrong( &#39;wpdb::prepare&#39; , sprintf ( __( &#39;The query argument of %smust have a placeholder.&#39; ), &#39;wpdb::prepare()&#39; ), &#39;3.9&#39; );}$args &#61; func_get_args();array_shift( $args );// If args were passed as an array (as in vsprintf), move them upif ( isset( $args[ 0] ) && is_array( $args[0]) )$args &#61; $args [0];$query &#61; str_replace( "&#39;%s&#39;", &#39;%s&#39; , $query ); // in case someone mistakenly already singlequoted it$query &#61; str_replace( &#39;"%s"&#39;, &#39;%s&#39; , $query ); // doublequote unquoting$query &#61; preg_replace( &#39;|(?$query ); // Force floats to be locale unaware$query &#61; preg_replace( &#39;|(?$query ); // quote the strings, avoiding escaped strings like %%sarray_walk( $args, array( $this, &#39;escape_by_ref&#39; ) );return &#64; vsprintf( $query, $args );
}



总结

安全性很重要&#xff0c;也可以看出一个人基本功&#xff0c;项目漏洞百出&#xff0c;扩展性和可维护性再好也没有用。平时多留意&#xff0c;树立安全意识&#xff0c;养成一种习惯&#xff0c;一些基本的安全当然也不会占用用 coding 的时间。养成这个习惯&#xff0c;即便在项目急&#xff0c;时间短的情况一下&#xff0c;依然可以做的质量很高。不要等到自己以后负责的东西&#xff0c;数据库都被拿走了&#xff0c;造成损失才重视。共勉&#xff01;


推荐阅读
  • MySQL笔记_MySQL笔记1|数据库17问17答
    本文由编程笔记#小编为大家整理,主要介绍了MySQL笔记1|数据库17问17答相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 大家好,我们是慢雾安全团队。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 微信小程序官方组件展示之表单组件input源码
    以下将展示微信小程序之表单组件input源码官方组件能力,组件样式仅供参考,开发者可根据自身需求定义组件样式,具体属性参数详见小程序开发文档。功能描述:输入框。该组件是原生组件, ... [详细]
  • 踩了一上午坑,记录一下成功过程mysql服务端版本8.0.23首先下载mysql-connector-net6.10.9版本,这个很重要,版本千万不要下错了 ... [详细]
  • 两种方式实现Flink异步IO查询Mysql
    如官网所描述的Flink支持两种方式实现异步IO查询外部系统http ... [详细]
  • 导读:很多朋友问到关于入门学什么php框架简单的相关问题,本文编程笔记就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧!本文目录一览: ... [详细]
  • javascript演变史_Web方向思考,第1部分:JavaScript的演变和澳大利亚的入侵
    javascript演变史上个月,我很幸运地在略微阴沉的伦敦参加了WebDirectionsmedia。这次活动吸引了网络世界中所有的推动者和推动者,这 ... [详细]
  • MySQL重大Bug!自增主键竟然不是连续递增?
    MySQL重大Bug!自增主键竟然不是连续递增? ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 腾讯安全平台部招聘安全工程师和数据分析工程师
    腾讯安全平台部正在招聘安全工程师和数据分析工程师。安全工程师负责安全问题和安全事件的跟踪和分析,提供安全测试技术支持;数据分析工程师负责安全产品相关系统数据统计和分析挖掘,通过用户行为数据建模为业务决策提供参考。招聘要求包括熟悉渗透测试和常见安全工具原理,精通Web漏洞,熟练使用多门编程语言等。有相关工作经验和在安全站点发表作品的候选人优先考虑。 ... [详细]
  • Windows7企业版怎样存储安全新功能详解
    本文介绍了电脑公司发布的GHOST WIN7 SP1 X64 通用特别版 V2019.12,软件大小为5.71 GB,支持简体中文,属于国产软件,免费使用。文章还提到了用户评分和软件分类为Win7系统,运行环境为Windows。同时,文章还介绍了平台检测结果,无插件,通过了360、腾讯、金山和瑞星的检测。此外,文章还提到了本地下载文件大小为5.71 GB,需要先下载高速下载器才能进行高速下载。最后,文章详细解释了Windows7企业版的存储安全新功能。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • 这篇文章主要介绍“大文本数据怎么导入导出到数据库”,在日常操作中,相信很多人在大文本数据怎么导入导出到数据库问题上存在疑惑,小编查阅了各 ... [详细]
author-avatar
MR付的世界
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有