search
Homephp教程php手册自己了解php中sql注入一些方法介绍
自己了解php中sql注入一些方法介绍Jun 13, 2016 am 10:12 AM
phpsqlunderlearnintroducemethodinjectionofOwn

自己了解php中sql注入一些方法介绍,下面介绍的全部是最常见的sql注入方法了,有需要的朋友可参考一下。

何为注入?

比如我们在查询数据库的时候,我们通过文章的id号来取出这篇文章的所有信息。那么SQL语句可以这样写:

 代码如下 复制代码

select * from blog where id=5 

id的值通过用户的操作来传递,一般是GET方式,形如read.php?id=5。这样看起来是没有任何问题,但是如果我们稍微改下SQL语句:

 代码如下 复制代码

select * from blog where id=5 or 1=1 

1=1这个是恒等的,那么这条语句就会取出所有的文章。要修改这个只需要改一下GET的传值即可:read.php?id='5 or 1=1';注意这两个单引号...所以最简单的就是我们可以通过直接把参数改为单引号来查看这个链接是否存在注入。当然,非法用户看到所有的文章并不要紧,但是如果这个表是保存账号和密码的呢?

2.如何防范注入?

说到底,防范注入的根本就在于字符的过滤,因为非法用户一般都是通过构造URL来传值的,如果我们过滤了他传进来的非法参数,这非法的SQL语句就不会执行,那么我们也就防止网站被注入!

PHP内置的过滤字符串还是相当不错的,先看看具体代码:

 代码如下 复制代码

function safe($s) 

    if(!get_magic_quotes_gpc()) 

    { 

        if(is_array($s)) 

            foreach($s as $key=>$value) 

                $s[$key] = addslashes($value); 

        else 

            $s=addslashes($s); 

    } 

    return $s; 

 

function html_safe($s) 

    return nl2br(htmlspecialchars(safe($s) )) ; 

如果你不知道上面用到的几个内置函数,也懒了去查手册的话,那我就说下这几个函数:

magic_quotes_gpc这个称为魔术引号,如果这个功能开启,那么当向数据库中插入数据时,魔术引号所做的就是自动对所有的 GET、POST、COOKIE 数据运用 addslashes() 函数。get_magic_quotes_gpc()就是用来获取服务器上这个功能是否开启的:如果开启了,那么直接返回数据;如果没开启,那么手动对参数进行addslashes()转义。这样就可以防止双层转义~

addslashes -- 使用反斜线引用字符串。描述:string addslashes ( string str );返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。这些字符是单引号(')、双引号(")、反斜线()与 NUL(NULL 字符)。 一个使用 addslashes() 的例子是当你要往数据库中输入数据时。例如,将名字 O'reilly 插入到数据库中,这就需要对其进行转义。大多数据库使用 作为转义符:O'reilly。这样可以将数据放入数据库中,而不会插入额外的 。当 PHP 指令 magic_quotes_sybase 被设置成 on 时,意味着插入 ' 时将使用 ' 进行转义。 

下面的那个htmlspecialchars就是对Html中的字符进行转换,比如说将‘&’转成‘&’,,将‘,这个在用户输入评论之类的信息时候用得比较多。

通过上面的几个函数,我们已经可以过滤一些简单的注入了。另外再说几个小的方面:

对于最开始的那个例子,实际上改进的地方很多,比如写成这样看起来应该更规范一些:

 代码如下 复制代码

SELECT * FROM `blog` WHERE `id`='$id' 

对于SQL的关键字我们用大写来表示,对于数据库中的表和字段我们用小写,另外在字段名和表名上加上“·”这个符号(键盘上数字1左边的那个键上),并且在进来的id上我们用单引号引起来。

对于这样的传进来参数是数字类型的,我们可以对$_GET到的值进行强制转换。但我更习惯这样:

 代码如下 复制代码

$id = $_GET['id']*1; //获取文章的id,用来显示文章信息 

if($id == 0){ 

echo "ERROR..."; 

exit(); 

如果一发现传进来的不是数字,那么很大可能性性是存在问题的参数,那么我们直接给出错误提示然后退出就行,这样再省得再去给非法用户执行数据库查询操作了。

最后我们看一下JBlog中的一个处理注入的地方:

includecommon.php的38行

 代码如下 复制代码

if ( !get_magic_quotes_gpc() ) { 

    $_GET = add_slashes($_GET); 

    $_POST = add_slashes($_POST); 

    $_COOKIE = add_slashes($_COOKIE); 

includefunc_global.php的194行

 代码如下 复制代码

//addslashes 

function add_slashes($string) { 

    if (!is_array($string)) return addslashes($string); 

    foreach ($string as $key => $val) { 

        $string[$key] = add_slashes($val); 

    } 

    return $string; 


 

当然,这应该只是一部分,其他的应该也大同小异。

 

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

了解 TRedis 缓存技术了解 TRedis 缓存技术Jun 19, 2023 pm 08:01 PM

TRedis缓存技术是一种高性能的内存缓存技术,能够提高网站或应用程序的性能和响应速度。在本文中,我们将介绍TRedis缓存技术的基本概念,以及如何在应用程序中使用它。什么是TRedis缓存技术?TRedis是一种内存缓存技术,它可以将经常使用的数据存储在内存中,从而提高访问这些数据的速度。这种技术的主要思想是通过使用内存缓存来减少对数据库或磁盘

了解 ECache 缓存技术了解 ECache 缓存技术Jun 20, 2023 am 08:10 AM

ECache是一种Java缓存框架,提供了一种简单而强大的方法来减少计算机应用的响应时间。它通过将数据存储在内存中,使应用程序能够更快地响应客户端请求,并提高系统吞吐量。在本文中,我们将介绍ECache缓存技术的一些基础知识,包括它的优点、安装和使用方式等。一、ECache的优点提高系统性能:ECache将缓存数据存储在内存中,这意味着应用程序

php怎么判断有没有小数点php怎么判断有没有小数点Apr 20, 2022 pm 08:12 PM

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

一目了然:JSP文件打开的方法速览一目了然:JSP文件打开的方法速览Jan 31, 2024 pm 09:28 PM

JSP文件打开方式JSP(JavaServerPages)是一种动态网页技术,它允许程序员在HTML页面中嵌入Java代码。JSP文件是文本文件,其中包含HTML代码、XML标记和Java代码。当JSP文件被请求时,它会被编译成JavaServlet,然后由Web服务器执行。打开JSP文件的方法有几种方法可以打开JSP文件。最简单的方法是使用文本编辑器,

了解 Redisson 缓存技术了解 Redisson 缓存技术Jun 21, 2023 am 09:54 AM

Redisson是一种基于Redis的Java应用程序缓存解决方案。它提供了许多有用功能,使得在Java应用中使用Redis作为缓存变得更加方便和高效。Redisson提供的缓存功能包括:1.分布式映射(Map):Redisson提供了一些用于创建分布式映射的API。这些映射可以包含键值对、哈希表项或对象,它们可以支持在多个节点之间共

php怎么设置implode没有分隔符php怎么设置implode没有分隔符Apr 18, 2022 pm 05:39 PM

在PHP中,可以利用implode()函数的第一个参数来设置没有分隔符,该函数的第一个参数用于规定数组元素之间放置的内容,默认是空字符串,也可将第一个参数设置为空,语法为“implode(数组)”或者“implode("",数组)”。

php怎么将url的参数转化成数组php怎么将url的参数转化成数组Apr 21, 2022 pm 08:50 PM

转化方法:1、使用“mb_substr($url,stripos($url,"?")+1)”获取url的参数部分;2、使用“parse_str("参数部分",$arr)”将参数解析到变量中,并传入指定数组中,变量名转为键名,变量值转为键值。

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

Repo: How To Revive Teammates
1 months agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
1 months agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools

Atom editor mac version download

Atom editor mac version download

The most popular open source editor

WebStorm Mac version

WebStorm Mac version

Useful JavaScript development tools

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor