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

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

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

前置知识

什么是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' )
    );

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

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

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

    分享给朋友:

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

    约茶app约茶APP

    最新约茶app都是哪些?整理了30本这篇文章主要介绍了约茶app,包括约茶app ios下载,下面小编整理了约茶app的图文教程,看看约茶app苹果版详细步骤吧! 觉得网上的一些答 据新快网2021年10月20日03:31:27的新闻报道,微博网友@R卜傲晴 爆料。 平安夜来临之际,事件,在网上...

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

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

    身份证信息被黑客盗取(黑客能把手机内身份证信息盗取吗)

    一、身份证信息被黑客盗取(黑客能把手机内身份证信息盗取吗)方法总结 1、黑客通过手身份姓名能否窃取别人银行卡里。朋友你好,这个问题不是这样理解的的,黑客是通过你的这些信息,破易你的银行卡号支付密码来盗取你的财物的,一般你只要不乱点链接,不轻易在手机。黑客控制了手机,窃取了身份证号码手机号姓名等所有...

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

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

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

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

    西安电脑黑客接单_怎么能找入侵蚊香社的黑客

    sudo apt install g++-4.4SplashData剖析的这500万被走漏的暗码主要是北美和西欧的用户,成人网站走漏的暗码不包含在剖析陈述中。 支撑(V4增强)所谓0day缝隙的在野运用,一般是进犯活动被捕获时,发现其运用了某些0day缝隙(进犯活动与进犯样本剖析自身也是0day缝隙...

    评论列表

    怎忘羁客
    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

    发表评论

    访客

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