什么是sql注入?
服务端没有对用户提交的参数进行严格的过滤,导致可以将SQL语句插入到可控参数中,改变原有的SQL语义结构,从而执行攻击者所预期的结果。
sql注入的探测
判断数据库类型
端口
报错信息
一些中间件常用的数据库
寻找SQL注入点
寻找与数据库交互的可控参数
GET
POST
COOKIE
HTTP头
确定注入点
确定注入点的核心思想就是判断插入的数据是否被当做SQL语句执行。可以使用简单的算术运算来测试。
SQL语句预编译和绑定变量
使用足够严格的过滤和安全防御
Web应用向数据库传递语句模板
数据库对模板进行编译,编译以后语义将不会改变
变量绑定,Web应用向数据库传递变量,变量只会被当做数据识别,不会被作为语义结构识别
执行SQL语句
SQL注入的核心:数据和代码的混淆。
什么是PDO?
PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。
PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数( *** )来查询和获取数据。
PDO是php中最典型的预编译查询方式。
PDO场景下的SQL注入
PDO与安全相关的问题主要的设置有下面三项:
PDO::ATTR_EMULATE_PREPARES # 模拟预编译
PDO::ATTR_ERRMODE # 报错
PDO::MYSQL_ATTR_MULTI_STATEMENTS # 多语句执行
之一项为模拟预编译,如果为False,则不存在SQL注入;如果为True,则PDO并非真正的预编译,而是将输入统一转化为字符型,并转义特殊字符。这样如果是gbk编码则存在宽字节注入。
第二项而报错,如果设置为True,可能会泄露一些信息。
第三项为多语句执行,如果设置为True,且之一项也为True,则会存在宽字节+堆叠注入的双重漏洞。
对于此类问题的防范,主要有以下三个方面:
合理、安全的使用gbk编码。即使采用PDO预编译的方式,如果开启模拟预编译,依然可以造成宽字节注入。
使用PDO时,一定要将模拟预编译设置为false。
可采用Prepare Statement手动预编译,防御SQL注入。
代码示例
$dbh=new PDO('mysql:dbname=testdb;host=127.0.0.1', $user, $password);
$stmt=$dbh->prepare('INSERT INTO REGISTRY (name, value) VALUES (:name, :value)');
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);
// insert one row
$name='one';
$value=1;
$stmt->execute();
或者
$dbh=new PDO('mysql:dbname=testdb;host=127.0.0.1', $user, $password);
$stmt=$dbh->prepare('UPDATE people SET name=:new_name WHERE id=:id');
$stmt->execute( array('new_name'=> $name, 'id'=> $id) );
详细请参考:
从宽字节注入认识PDO的原理和正确使用
SQL注入基础整理及Tricks总结
技术分享 | MySQL 注入攻击与防御
ODBC 是一种应用程序编程接口(Application Programming Interface,API),使我们有能力连接到某个数据源(比如一个 MS Access 数据库)。
代码示例
$stmt=odbc_prepare( $conn, 'SELECT * FROM users WHERE email=?' );
$success=odbc_execute( $stmt, array($email) );
或者
$dbh=odbc_exec($conn, 'SELECT * FROM users WHERE email=?', array($email));
$sth=$dbh->prepare('SELECT * FROM users WHERE email=:email');
$sth->execute(array(':email'=> $email));
MySQLi函数允许你访问MySQL数据库服务器。
$stmt=$db->prepare('update name set name=? where id=?');
$stmt->bind_param('si',$name,$id);
$stmt->execute();
对于框架的话只要遵循框架的API就好,例如wp查询
global $wpdb;
$wpdb->query(
$wpdb->prepare( 'SELECT name FROM people WHERE id=%d OR email=%s',
$person_id, $person_email
)
);
global $wpdb;
$wpdb->insert( 'people',
array(
'person_id'=> '123',
'person_email'=> 'bobby@tables.com'
),
array( '%d', '%s' )
);
保证老鼠再也不会来了,不仅方法超级简单,而且还非常有效,希望能给大家带来帮助,也希望大家认认真真看一遍,把它记下来。 下面我们分享一下具体的操作方法,首先准备一个容器,一个馒头即可,先将馒头撕成...
随着美国总统大选即将进入尾声,大家对于现任总统特朗普输给拜登一事议论纷纷,而网上关于“特朗普怒砸办公室”“特朗普打砸白宫”“特朗普被推出办公室”的新闻更是层出不穷,那么特朗普被推出办公室视频是真的吗?...
英语演讲范文(演讲类英语作文范文) 其实英文演讲比中文演讲更简单,只要你做好了事前准备,比如,写好演讲稿。下面是为大家整理的几篇英语演讲稿6分钟范文,希望能帮到正在学习中或正在参加比赛的大家哦哟。...
只要已知50顿锅炉的总造价,不就清楚了锅炉每顿的价格了。 这个不好回答。你这台工业锅炉太大了,这么大的我20年来没见过,这是要100吨的热水锅炉。大概估计一下吧:1、锅炉本体价400万,配套的控制柜...
结合自身需要挑选合适的孕妇装款式 在家待产的全职妈妈建议选择宽松舒适型的孕妇装,对于上班族的孕妈对孕妇装的选择要求会高一些,应该选择商务型孕妇装,孕妇职业装讲究的是简洁大方,商务孕妇装大多全身属于同...
流失用户运营=流失用户召回?必定不是!假如你没有颠末系统化地去阐明流失用户放弃你家当物的原因,去针对这些原因做出运营行为,只执着于用一些促销手段去召回用户,那必定是无效的。就算真的有召回到一些用户,基...