什么是SQL注入?

SQL注入是指在你系统防御之外,某人将一段Mysql语句注入到你的数据库。注入通常发生在系统要求用户输入数据的时候,比如用户名的输入,用户可能输入的不是一个用户名,而是一段SQL语句,这个语句可能就会不知不觉地运行在你的数据库中。

SQL注入实例

$name = $_POST['username'];
$query="SELECT * FROM `tbl_name` WHERE `name`='$name' ";

如同你看到的,用户输入的值会通过url参数分配给变量$name,然后直接放置到sql语句中。这意味着用户是有可能编辑sql语句的。

$name = "admin' OR 1=1 -- ";
$query="SELECT * FROM `tbl_name` WHERE `name`='$name' ";
sql数据库最后会接收到下面的这一段sql语句:
SELECT * FROM `tbl_name` WHERE `name`='admin' OR 1=1 --';
在Mysql中- -表示忽略掉后面所有的内容,就是注释掉后面所有内容。这是有效的SQL语句,而且执行结果不是返回当前用户数据,而是将返回所有数据表(table_name)中的所有数据。这是任何人都不希望在他们的web应用程序中出现。下面将会教你如何防止这种类型的漏洞。
那么,如何简单防止Mysql注入?

这个问题已经被知道了一段时间,PHP有一个特制的功能以防止这些攻击。所有你需要做的就是使用一个函数mysql_real_escape_string()。

mysql_real_escape_string所做的是把一个输入的字符串,在MySQL查询时将它处理为用户输入的真实字符串,来防止SQL注入。有点绕,基本上,就是将用户输入可能引起Mysql安全隐患的字符串比如单引号('),用逃脱引用来表示\ '。

将这个函数应用到上面那个可能被注入的例子中:

$name = mysql_real_escape_string($_POST['username']);
$query = "SELECT * FROM `tbl_name` WHERE `name` = '$name' ";
这里要十分小心的是,mysql_real_escape_string要先成功地通过mysql_connect连接到mysql server上以后才能正常使用,如果数据库
还没连接直接使用这个函数会报错。上面经过函数转化后,$query最后打印出来的语句为:
SELECT * FROM `tbl_name` WHERE `name`='admin\' OR 1=1 -- ';

也就是说上面那个admin后面的单引号(')被转义为真实的输入字符,不再和admin前的字符进行匹配,admin前的单引号将和字符串–后面的单引号进行匹配。

让我们创建一个通用的函数,你可以用任何名字来命名它,在这里,我要将它命名为"mres":

function mres($var){
    if (get_magic_quotes_gpc()){
        $var = stripslashes(trim($var));
    }
    return mysql_real_escape_string(trim($var));
}
现在,可以把函数简化成下面这个样子:
$name = mres($_POST['username']);
$query="SELECT * FROM `tbl_name` WHERE `name`='$name' ";
 

使用php函数防止SQL注入方法的更多相关文章

  1. sql注入方法以及防范

    sql注入方法: 1.数字注入 ; get请求 www.bobo.com?id=1 可以查出 ID等于1的一条数据. 如果有人在链接后面增加  www.bobo.com?id=1 or 1=1 / w ...

  2. 另类的SQL注入方法

    前言:相比基于查询的SQL注入,使用insert.update和delete进行SQL注入显得略显另类 参考自:http://www.exploit-db.com/wp-content/themes/ ...

  3. PHP mysql_real_escape_string() 函数防SQL注入

    PHP MySQL 函数 定义和用法 mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符. 下列字符受影响: \x00 \n \r \ ' &quo ...

  4. ref:web 防止SQL注入方法

    ref:https://blog.csdn.net/beidou321/article/details/6482618 小结:spring采用JdbcTemplate来操作sql,一般不要自行拼接sq ...

  5. PHP最全防止sql注入方法

    (1)mysql_real_escape_string -- 转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集 使用方法如下: $sql = "select count ...

  6. 防止SQL注入方法总结

    一.参数化SQL 是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,用@来表示参数. 在使用参数化查询的情况下,数据库服务器不会将参数的内容视为 ...

  7. 网站防止SQL注入方法

    方法:所有获取GET.POST变量都先进行过滤: 字符串-- htmlspecialchars(addslashes($string))  addslashes() 函数返回在预定义字符之前添加反斜杠 ...

  8. 防止sql注入方法 如何防止java中将MySQL的数据库验证密码加上 ' or '1'= '1 就可以出现万能密码 的PreparedStatement

    package com.swift; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepar ...

  9. 防sql注入方法

    mysql_escape_string(strip_tags($arr)) /** * 函数名称:post_check() * 函数作用:对提交的编辑内容进行处理 * 参 数:$post: 要提交的内 ...

随机推荐

  1. Pytorch: parameters(),children(),modules(),named_*区别

    nn.Module vs nn.functional 前者会保存权重等信息,后者只是做运算 parameters() 返回可训练参数 nn.ModuleList vs. nn.ParameterLis ...

  2. C#进程间通讯或同步的框架引荐

    这篇文章主要介绍了一个进程间通讯同步的C#框架,代码具有相当的稳定性和可维护性,随着.NET的开源也会被注入更多活力,推荐!需要的朋友可以参考下  0.背景简介 微软在 .NET 框架中提供了多种实用 ...

  3. nginx docker 命令: command not found

    1. ps: command not found 使用如下命令安装 apt-get update && apt-get -y install procps 2. vim: comman ...

  4. USACO Superprime Rib

    洛谷 P1218 [USACO1.5]特殊的质数肋骨 Superprime Rib 洛谷传送门 JDOJ 1673: Superprime Rib JDOJ传送门 题目描述 农民约翰的母牛总是产生最好 ...

  5. python--线程知识详解

    Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 1.1.threading模块 threading模块建立在_thread模块之上.thread模块以低级=原始的方式来处理 ...

  6. ABP 从core降到级.net framework

    后台: Application层得先写接口 再写实现,不然 abp.services.app 这个里面就没有该service.并且service保留的接口,就是interface里面定义的接口. 文件 ...

  7. Problem C. 欧皇 ————2019.10.12

    题目: 再次感激土蛋 #include <bits/stdc++.h> using namespace std; typedef long long ll; ; ll C[][]; voi ...

  8. 【JZOJ100209】【20190705】狂妄之人

    题目 \(S\)串长为\(n\),字符集大小为\(k\) 一次操作为:取走\(S\)的任意一个字符或将\(S\)重排为一个没有出现过的字符\(S'\) 询问有多少个\(S\)使得后手必胜,答案对\(P ...

  9. 【BZOJ3569】DZY Loves Chinese II

    [BZOJ3569]DZY Loves Chinese II 题面 bzoj 题目大意: 给你一张\(N(1\leq N\leq 10^5)\)个点\(M(1\leq M\leq 5\times 10 ...

  10. vue - 小日历项目制作中的问题与解决思路

    效果图: 项目难点: 1. 每个月的日期数是不定的,拢共需要几个格子? 按照教程的做法需要42个.所以遍历数字42,得到42个div做格子. 2. 格子的排版怎么做? 顶部的星期布局使用的flex水平 ...