热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php中sql注入一些方法介绍

自己了解php中sql注入一些方法介绍,下面介绍的全部是最常见的sql注入方法了,有需要的朋友可参考一下.1,何为注入?比如我们在查询数据库的时候,我们通过文章的id号来取出这篇文章的所有信息,...
自己了解php中sql注入一些方法介绍,下面介绍的全部是最常见的sql注入方法了,有需要的朋友可参考一下.

1,何为注入?比如我们在查询数据库的时候,我们通过文章的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中的字符进行转换,比如说将‘&’转成‘&’,将‘<’转成‘<’,nl2br这个是将回车换行转换成
,这个在用户输入评论之类的信息时候用得比较多。

通过上面的几个函数,我们已经可以过滤一些简单的注入了,另外再说几个小的方面:对于最开始的那个例子,实际上改进的地方很多,比如写成这样看起来应该更规范一些,代码如下:

SELECT * FROM `blog` WHERE `id`=&#39;$id&#39;

对于SQL的关键字我们用大写来表示,对于数据库中的表和字段我们用小写,另外在字段名和表名上加上“·”这个符号(键盘上数字1左边的那个键上),并且在进来的id上我们用单引号引起来,对于这样的传进来参数是数字类型的,我们可以对$_GET到的值进行强制转换,但我更习惯这样:

$id = $_GET[&#39;id&#39;]*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;  
}

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


本文地址:

转载随意,但请附上文章地址:-)

推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 延迟注入工具(python)的SQL脚本
    本文介绍了一个延迟注入工具(python)的SQL脚本,包括使用urllib2、time、socket、threading、requests等模块实现延迟注入的方法。该工具可以通过构造特定的URL来进行注入测试,并通过延迟时间来判断注入是否成功。 ... [详细]
  • 本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
author-avatar
史三万岁_710
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有