关于防止sql注入的几个知识点
1.PDO预处理是首选。
你可以把他看成是要运行的sql的已经编译过的模板,它可以用变量参数进行定制
它有两个显著优点:
1.1:查询仅需解析一次,但可以用相同或者不同参数执行多次。换句话说如果要以不同的参数执行同样的语句执行多次,利用PDO可以大大降低应用程序的速度。
1.2:提供给预处理的语句不需要携带引号,所以可以有效防止sql的注入。但是如果查询的其他部分是由未转义的输入来构建的,则仍存在sql注入的风险。
1.3:另外pdo预处理无效的地方:
1.3.1:limit语句
1.3.2 : like %?%. 不能这么使用,占位符必须代表整个字符。所以可以这样 like ?,然后传入参数为这样的格式:%iloveyou%;
2.在处理参数之前先decode两次。防止url编码注入。
为什么这么做呢?我暂时也不太理解,这个博客上有相关说明。特此向博主致敬!牛人,总结的真好。
http://drops.wooyun.org/tips/968
3.然后过滤引号,括号,和一些sql关键词(最好是urldecode两次后),比如union,select,concat等,最好能匹配单词边界,有些sql注入可能使用替换关键词的办法如:seSelectlect,这样即使select被过滤了,然后又来个select。
下面是我自己写的一个sql过滤正则替换函数,在多次漏洞盒子报告错误后,我利用它做了成功的sql注入防御:
public function removeSql($keyword){
$temKeywords = urldecode(urldecode(trim($keyword)));
$sqlKeywords = array("/\badd\b/i","/\(/","/\)/","/\balter\b/i","/\bupdate\b/i","/\bdelete\b/i","/\bselect\b/i","/\band\b/i","/\bor\b/i","/\bbetween\b/i","/\bgroup\b/i","/\bdrop\b/i","/\bfrom\b/i","/\bhaving\b/i","/\border\b/i","/\blike\b/i","/\bchange\b/i","/\blimit\b/i","/\bdistinct\b/i","/\'/","/\"/","/%27/i","/0x27/i","/\bmid/i","/\bdatabase\(\)/i","/\bin\b/i","/\bconcat/i","/char\(.*?\)/i","/%/","/\bunion\b/i","/\=/","/\s+/");
$sqlReplacement = "";
$resKeyword = preg_replace($sqlKeywords,$sqlReplacement,$temKeywords);
return $resKeyword;
}
做了这些处理就能抵御大部分的sql注入了。具体更多的看这篇博文:http://drops.wooyun.org/tips/968
关于防止sql注入的几个知识点的更多相关文章
- sql注入原理+mysql相关知识点
什么是SQL注入 sql就是经常说的数据库,而sql注入就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.SQL注入是比较常见的网络攻击 ...
- 有关SQL注入的一些小知识点
1.判断注入点: 本质原理是找一个需要后台处理后,提交给数据库的点,我理解为用户可以控制并输入后台数据库的变量,比如我们DVWA SQL injection 的ID ,我们可以通过闭合单引号,#注释 ...
- SQL注入之MySQL报错注入整理
看大佬们的文章看得我虎躯一震,精神抖擞,于是心血来潮,整理一下MySQL报错注入常见的手段和方法,再举几个例子 <代码审计:企业级Web代码安全架构>一书中介绍过报错注入十大方法,依次是: ...
- sql注入知识点整理(基础版)
sql注入知识点整理(基础版) 基本步骤 判断是否报错 判断闭合符号 判断注入类型 构建payload 手工注入或者编写脚本 基本注入类型 报错型注入 floor公式(结果多出一个1):and (se ...
- SQL注入基本知识点总结
SQL注入基本知识 information_schema MySQL 中存储所有数据库名.所有表名.所有字段名的系统数据库叫 information_schema ,这是在 MySQL 数据库初 ...
- sql注入知识点
需找sql注入点1\无特定目标inurl:.php?id= 2\有特定目标:inurl:.php?id= site:target.com 3\工具爬取spider,对搜索引擎和目标网站的链接进行爬取 ...
- C# sql语句拼接时 like情况的防sql注入的用法
今天下午同事问我一个比较基础的问题,在拼接sql语句的时候,如果遇到Like的情况该怎么办. 我原来的写法就是简单的拼接字符串,后来同事问我如果遇到sql注入怎么办.我想了下,这确实是个问题. 刚在网 ...
- SQL注入原理及绕过安全狗
1.什么是SQL注入攻击 SQL注入攻击指的是通过构造特殊的输入作为参数插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令 http://www.xxx.com/list. ...
- SQL注入关联分析
在Web攻防中,SQL注入绝对是一个技能的频繁项,为了技术的成熟化.自动化.智能化,我们有必要建立SQL注入与之相关典型技术之间的关联规则.在分析过程中,整个规则均围绕核心词进行直线展开,我们简单称之 ...
随机推荐
- 技巧收集-M1709
2017.09 在macOS中直接复制文件路径,在Finder中选中文件,按下快捷键:Command + Option + C *** 以KB,MB,GB方式显示文件大小 ls -lh 删除超大文本文 ...
- [python学习笔记] String格式化
格式化 S % (args...) 方式 特点 str里的占位符同java里的占位符. 优势 这种方式可以限定格式化的时候接受的数据类型. 常见占位符 %d 接收数字,格式化为 十进制 %x 接收数字 ...
- 循环语句for,while,until,select
循环 *循环执行 将某代码段重复运行多次 重复运行多少次: 循环次数事先已知 循环次数事先未知 有进入条件和退出条件 *常见的循环语句有for,while,until for循环 for 变量名 n ...
- Django查询数据库性能优化
现在有一张记录用户信息的UserInfo数据表,表中记录了10个用户的姓名,呢称,年龄,工作等信息. models文件 from django.db import models class Job(m ...
- Go语言下载、安装、配置、使用
Go语言 Go语言(Golang,The Go Programming Language),是谷歌2009发布的第二款开源编程语言.2009年7月份,谷歌曾发布了Simple语言,它是用来开发Andr ...
- 化繁为简 经典的汉诺塔递归问题 in Java
问题描述 在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑 ...
- Scala 中的隐式转换和隐式参数
隐式定义是指编译器为了修正类型错误而允许插入到程序中的定义. 举例: 正常情况下"120"/12显然会报错,因为 String 类并没有实现 / 这个方法,我们无法去决定 Stri ...
- JS获取随机的16位十六进制的数
直接上代码: function getRamNumber(){ var result=''; for(var i=0;i<16;i++){ result+=Math.floor(Math.ran ...
- MySQL or MariaDB 错误解决方法之报错代码1045
phpMyAdmin登录报错:mysqli_real_connect(): (28000/1045): Access denied for user 'root'@'localhost' (using ...
- 苹果iPhone X上搭载的那颗A11仿生芯片,到底牛在哪?
苹果iPhone X上搭载的那颗A11仿生芯片,到底牛在哪? 上周,苹果公司在刚刚落成投入使用的“飞船”新总部(Apple Park)举行2017年秋季新品发布会,整场发布会基本被iPhone X抢尽 ...