当前位置:首页 > 黑客服务 > 正文内容

mysql注入在PHP代码层面的防御手段

访客4年前 (2021-04-15)黑客服务861

前置知识

什么是sql注入?

服务端没有对用户提交的参数进行严格的过滤,导致可以将SQL语句插入到可控参数中,改变原有的SQL语义结构,从而执行攻击者所预期的结果。

sql注入的探测

判断数据库类型

  • 端口

  • 报错信息

一些中间件常用的数据库

寻找SQL注入点

寻找与数据库交互的可控参数

  • GET

  • POST

  • COOKIE

  • HTTP头

确定注入点

确定注入点的核心思想就是判断插入的数据是否被当做SQL语句执行。可以使用简单的算术运算来测试。

SQL注入的防御的原理

  • SQL语句预编译绑定变量

  • 使用足够严格的过滤和安全防御

  • Web应用向数据库传递语句模板

  • 数据库对模板进行编译,编译以后语义将不会改变

  • 变量绑定,Web应用向数据库传递变量,变量只会被当做数据识别,不会被作为语义结构识别

  • 执行SQL语句

  • SQL注入的核心:数据和代码的混淆。

    PDO

    什么是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

    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

    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' )
    );

    扫描二维码推送至手机访问。

    版权声明:本文由黑客接单发布,如需转载请注明出处。

    本文链接:https://therlest.com/106250.html

    分享给朋友:

    “mysql注入在PHP代码层面的防御手段” 的相关文章

    贾秀东个人资料简介(简历及图片)

    贾秀东人物概况 本页面提供了贾秀东个人资料简介(简历及图片),贾秀东是谁?贾秀东个人简介资料完整设计了网页求职找工作编辑个人简历作品所需要的贾秀东网站常用模板元素,不保证贾秀东人物数据真实,任何问题请联系管理员调整。 贾秀东图片 贾秀东个人资料简介 贾秀东,中国国际问题研究所特聘研究员。1...

    吃鸡鸭的屁股会有病吗?我非常爱吃鸡鸭的屁股,但经常吃会有病吗?另

    吃鸡鸭的屁股会有病吗?我非常爱吃鸡鸭的屁股,但经常吃会有病吗?另 鸡鸭的肛门附近组织,布满大大小小的腺体,各类秽物与毒素都在这些腺体囤积;鸡鸭的肛门也有非常高密度的大肠杆菌,所以鸡鸭的屁股不是少吃的问题,而是不能吃.吃得少可能没觉出怎样,多了问题就显出来了.而且鸡鸭屁股的大肠杆菌会随着蛋生出来的时...

    聚乙烯市场价格走势图 「今日聚乙烯价格行情」

    任何商谈价格无法刺激购买兴趣,疆内,谁知道黑龙江省近期聚乙烯的回收.整体库存不多。管材2480无税10700元/吨,00TN00无税9750元/吨。疆外。 最新走势?拜托了,齐鲁化工城PE市场早间多数!中油挂牌政策,问题问的很好产品名称价格HD60706000,这个网站不错。为您提供,6098无税7...

    古文化常识(中国古代文化常识大全)

    1.中国古代文化常识 文学常识? 四本书:《论语》、《中庸》、《孟子大学》 五经:《诗经》《礼记》《周易》《春秋》 乐府双壁:木兰诗孔雀东南飞 三个字:警告世界,说真话,说真话,唤醒世界,说同样的话 第二枪:第一枪很厉害,第二枪也很厉害 三官:石渠官、潼关官、新安官 三次告别:新婚、老...

    青岛新闻网房产 - 青岛个人房源出售

    估计那个时候,0以上的住房为普通住宅。来说几句. 3500左右,我建议你来沧口找房子吧,青岛房产网51青岛信息港-房产,市北区的现在也到了新闻网7000了。提供覆盖青岛的别墅、一小时车程的房子大约在虎山以外,台南路。 还有的别墅个人150一般的房子都要,我就在黄岛住,早下手吧!沿海一带,2手放一般都...

    铁盖子可以放入高压锅蒸吗?装酱料的铁盖子,外面的涂层有些剥落,好

    铁盖子可以放入高压锅蒸吗?装酱料的铁盖子,外面的涂层有些剥落,好 铁盖子可以放入高压锅蒸吗? 装酱料的铁盖子,外面的涂层有些剥落,好象也没锈,可以拿它盖严瓶子入高压锅蒸吗? 绝对不行!既危险又不卫生。盖住的瓶子在高压锅中加热,很容易形成压力差而爆炸;铁在高压锅中的水蒸汽作用下极易变成四氧化三...

    评论列表

    怎忘羁客
    2年前 (2022-07-05)

    e FROM people WHERE id=%d OR email=%s',$person_id, $person_email));global $wpdb;$wpdb->insert( 'people',arr

    世味笑惜
    2年前 (2022-07-04)

    全防御Web应用向数据库传递语句模板数据库对模板进行编译,编译以后语义将不会改变变量绑定,Web应用向数据库传递变量,变量只会被当做数据识别,不会被作为语义结构识别执行SQL语句SQL注入的核心:数据和代码的混淆。PDO什么是PDO?PH

    莣萳愚季
    2年前 (2022-07-05)

    id);$stmt->execute();框架对于框架的话只要遵循框架的API就好,例如wp查询global $wpdb;$wpdb->query($wpdb->prepare( 'SELECT name FROM people WHERE id

    发表评论

    访客

    ◎欢迎参与讨论,请在这里发表您的看法和观点。