如果通过网页需要用户输入一些数据信息,并将其插入到MySQL数据库,这是一个引入SQL注入安全问题的机会。这一节将学习如何防止这种情况的发生,并帮助保护脚本和MySQL语句。

通常注入是在当要求用户输入时,类似他们的姓名,只是一个名字,他们给出,会在不知不觉中包含MySQL的语句会在数据库运行。

永远不要信任用户提供的数据,这个过程只有在数据验证后,作为一项规则,这是通过模式匹配进行。在下面的例子中,用户名被限制在字母+数字+字符加下划线,并在8-20个字符之间的长度 - 可以根据需要修改这些规则。

if (preg_match("/^w{8,20}$/", $_GET['username'], $matches))

{

$result = mysql_query("SELECT * FROM users

WHERE username=$matches[0]");

}

else

{

echo "username not accepted";

}

为了说明问题,考虑这个片段:

// supposed input

$name = "Qadir'; DELETE FROM users;";

mysql_query("SELECT * FROM users WHERE name='{$name}'");

该函数调用从表中检索用户记录,其中名称列匹配由用户指定的名称。 在正常情况下,$name将只包含字母数字字符,或可能是空格,如字符串ilia。 但在这里,通过附加一个全新的查询到$name,在调用数据库变成灾难:注入DELETE查询删除所有的用户记录。

幸运的是,如果使用MySQL,mysql_query()函数不允许查询堆叠或一个函数调用执行多个查询。如果尝试堆叠查询,调用失败。

然而,其他PHP数据库扩展,如SQLite和PostgreSQL,它们会乐意地进行堆查询,执行一个字符串提供的查询,并创建一个严重的安全问题。

防止SQL注入

可以在脚本语言,如 Perl和PHP巧妙地处理所有转义字符。MySQL扩展为PHP提供mysql_real_escape_string()函数来转义输入的特殊字符。

if (get_magic_quotes_gpc())

{

$name = stripslashes($name);

}

$name = mysql_real_escape_string($name);

mysql_query("SELECT * FROM users WHERE name='{$name}'");

LIKE的困境

为了解决LIKE困境,自定义的转义机制必须把用户提供%和_字符到常量。使用addcslashes()函数,它可以让指定的字符转义。

$sub = addcslashes(mysql_real_escape_string("%something_"), "%_");

// $sub == \%something\_

mysql_query("SELECT * FROM messages WHERE subject LIKE '{$sub}%'");

¥ 我要打赏

纠错/补充

收藏

加QQ群啦,易百教程官方技术学习群

注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。

Mysql的sql注入_MySQL SQL注入相关推荐

  1. mysql 结束符报错_Mysql手工注入小结

    前言 实习电话面的时候,问到了sql注入的利用,我扒拉扒拉一大堆,结果脑子一抽,说Mysql注入不支持堆叠注入 我学安全目前最后悔的事情就是,最开始入门的时候,连数据库这门课都没开始学,当时连最基本的 ...

  2. mysql命令书写顺序_MySQL SQL语句书写顺序和执行顺序

    SQL语句书写顺序和执行顺序 (7) SELECT (8) DISTINCT (1) FROM (3) JOIN (2) ON (4) WHERE (5) GROUP BY (6) HAVING (9 ...

  3. mysql 嵌套查询性能_mysql SQL优化之嵌套查询-遁地龙卷风

    (-1) 写在前面 这篇随笔的数据使用的是http://blog.csdn.net/friendan/article/details/8072668#comments里的,里面有一些常见的select ...

  4. mysql报错型手工注入_mysql手工注入教程

    大家早上好!,H.U.C-枫 又和大家见面啦// 本来早想做这个教程的,因为前段时间做过一套mssql的手工注入教程.今天给大家带来的是php+mysql 手工注入.临时找了个点,所以有些东西不能全给 ...

  5. mysql sql模式_MySQL SQL模式特点汇总

    前言 MySQL服务器可以在不同的SQL模式下运行,并且可以针对不同的客户端以不同的方式应用这些模式,具体取决于sql_mode系统变量的值.DBA可以设置全局SQL模式以匹配站点服务器操作要求,并且 ...

  6. mysql 慢查询sql实例_Mysql sql慢查询监控脚本代码实例

    1.修改my.cnf #整体的效果,全局开启表和日志文件都写,但是对于general_log只写表,对于slow_query_log,表和日志文件都记录. general_log=1#开启mysql执 ...

  7. mysql sql能力_MySQL SQL优化

    优化目标 1.减少 IO 次数 IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先 ...

  8. mysql 42000 报错_MySQL SQL Error: 1064, SQLState: 42000 错误

    你不小心使用了下面的关键字,那么就会报这个错误: SQL Error: 1064, SQLState: 42000 MySQL 关键字和保留字 下面这些是目前 MySQL 所拥有的关键字和保留字,在使 ...

  9. mysql 生成日历视图_mysql sql语句生成日历表

    mysql sql语句生成日历表  (主要用于按月,按天group by分组统计时,有些日期没有记录,需要补0) 从自定义的开始时间,生成1万条记录 CREATE TABLE if not exist ...

最新文章

  1. 他们提出了一个大胆的猜想:GWT(深度学习)→通用人工智能
  2. spring boot: GlobalDefaultExceptionHandler方法内的友好错误提示,全局异常捕获
  3. python读取序列5之后的数据_Python核心编程读笔 5: python的序列
  4. D2 日报 2019年4月17日
  5. 系统架构设计师 - 系统可靠性设计
  6. C语言 十进制和十六进制相互转换 - C语言零基础入门教程
  7. 小程序自定义组件:摇奖小游戏
  8. hdu 4308 Saving Princess claire_ 广搜 多校联合赛第七题
  9. Pandownload 百度网盘光速下载 十分简单 一秒破解
  10. 模拟幅度调制相干解调系统抗噪声性能仿真分析
  11. 史上最详细嵌入式系统设计师修炼手册
  12. 计算机网络与安全课程设计,计算机网络课程设计-网络安全..doc
  13. 激光测距仪全国产化电子元件推荐方案
  14. Matlab------如何控制matlab中的数据输出格式
  15. 只有快速上网 芝麻才能开门
  16. mybatis的<choose>和<otherwise>使用
  17. 冒险岛2官网模拟具体教程之一工具的准备(详解)(连载)
  18. 实现React模板打印
  19. java实现基因牛的繁殖
  20. 隧道锚杆(一键生成)

热门文章

  1. RedHat 6配置DNS服务实现主从同步与正反向解析
  2. CoFun 1612 单词分组(容斥)
  3. 使用Git上传本地项目到http://git.oschina.net
  4. 改善代码设计 —— 组织好你的数“.NET研究”据(Composing Data)
  5. 基于Java Socket的文件UpLoad代码(完美版)-用递归解决java的目录树遍历
  6. 远程备份SQL Server 2005数据库
  7. centos搭建ftp环境
  8. linux c 实现 http get post 请求
  9. nmap 获取主机名
  10. linux centos7 createrepo 创建本地 yum 仓库