第32章 MySQL 及 SQL 注入教程

如果帅哥通过网页获取用户输入的数据并将其插入一个MySQLdatabase,那么就有可能发生SQL注入安全的问题。

本章节将为大家介绍如何防止SQL注入,并通过脚本来过滤SQL中注入的字符。

所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗server 执行恶意的SQL命令。

咱们永远不要信任用户的输入,咱们必须认定用户输入的数据都是不安全的,咱们都需要对用户输入的数据进行过滤处理。

以下实例中,输入的用户名必须为字母、数字及下划线的组合,且用户名长度为 8 到 20 个字符之间:


    if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
    {
       $result = mysqli_query($conn, "SELECT * FROM users 
                              WHERE username=$matches[0]");
    }
     else 
    {
       echo "username 输入异常";
    }

让咱们看下在没有过滤特殊字符时,出现的SQL情况:


    // 设定$name 中插入了咱们不需要的SQL语句
    $name = "Qadir'; DELETE FROM users;";
     mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

以上的注入语句中,咱们没有对 n a m e 的变量进行过滤, name 的变量进行过滤, name的变量进行过滤,name 中插入了咱们不需要的SQL语句,将删除 users 表中的所有数据。

在PHP中的 mysqli_query() 是不允许执行多个 SQL 语句的,但是在 SQLite 和 PostgreSQL 是可以同时执行多条SQL语句的,所以咱们对这些用户的数据需要进行严格的验证。

防止SQL注入,咱们需要注意以下几个要点:

  • 1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双"-"进行转换等。
  • 2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
  • 3.永远不要使用管理员权限的database连接,为每个应用使用单独的权限有限的database连接。
  • 4.不要把机密信息直接存放,加密或者hash掉password 和敏感的信息。
  • 5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
  • 6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测tool jsky,网站平台就有亿思网站安全平台检测tool 。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。

防止SQL注入

在脚本语言,如Perl和PHP帅哥可以对用户输入的数据进行转义从而来防止SQL注入。

PHP的MySQL扩展提供了mysqli_real_escape_string()函数来转义特殊的输入字符。


    if (get_magic_quotes_gpc()) 
    {
      $name = stripslashes($name);
    }
    $name = mysqli_real_escape_string($conn, $name);
     mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");


Like语句中的注入

like查询时,如果用户输入的值有"_“和”%“,则会出现这种情况:用户本来只是想查询"abcd_”,查询结果中却有"abcd_"、“abcde”、“abcdf"等等;用户要查询"30%”(注:百分之三十)时也会出现问题。

在PHP脚本中咱们可以使用addcslashes()函数来处理以上情况,如下实例:


    $sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_");
    // $sub == \%something\_
     mysqli_query($conn, "SELECT * FROM messages WHERE subject LIKE '{$sub}%'");

addcslashes() 函数在指定的字符前添加反斜杠。

语法格式:


    addcslashes(string,characters)

参数描述
string必需。规定要检查的字符串。
characters非必输。规定受 addcslashes() 影响的字符或字符范围。

具体应用可以查看:PHP addcslashes() 函数

本专栏所有文章

第1章 MySQL 教程第2章 MySQL 安装教程
第3章 MySQL 管理教程第4章 MySQL PHP 语法教程
第5章 MySQL 连接教程第6章 MySQL 创建数据库教程
第7章 MySQL 删除数据库教程第8章 MySQL 选择数据库教程
第9章 MySQL 数据类型教程第10章 MySQL 创建数据表教程
第11章 MySQL 删除数据表教程第12章 MySQL 插入数据教程
第13章 MySQL 查询数据教程第14章 MySQL WHERE 子句教程
第15章 MySQL UPDATE 更新教程第16章 MySQL DELETE 语句教程
第17章 MySQL LIKE 子句教程第18章 MySQL UNION教程
第19章 MySQL 排序教程第20章 MySQL 分组教程
第21章 MySQL 连接的使用教程第22章 MySQL NULL 值处理教程
第23章 MySQL 正则表达式教程第24章 MySQL 事务教程
第25章 MySQL ALTER命令教程第26章 MySQL 索引教程
第27章 MySQL 临时表教程第28章 MySQL 复制表教程
第29章 MySQL 元数据教程第30章 MySQL 序列使用教程
第31章 MySQL 处理重复数据教程第32章 MySQL 及 SQL 注入教程
第33章 MySQL 导出数据教程第34章 MySQL 导入数据教程
第35章 MySQL 函数教程第36章 MySQL 运算符教程

寄语

本文有榴莲酱CSDN原创,欢迎点赞、转载,博客地址:https://blog.csdn.net/qq441540598

  • 诚信就是从我做起,将心比心、以心换心、心心相印。
  • 悟出成功是开悟:心领神会有智慧,预见未来有成效;人生悟语是感悟:总结经验少失误,提示成败少犯错;人不开窍是迷误:心路太窄岔路多,自以为是误自己。
  • 金钱损失了还能挽回,一旦失去信誉就很难挽回。再长的路,一步步也能走完,再短的路,不迈开双脚也无法到达。
  • 处身当记于薄,待人不妨于厚;责己不妨于厚,责人不妨于薄。
  • 分享是最好的学习,是一件快乐之事,分享此刻的心情,加油。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

榴莲酱csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值