SQL注入安全

简述:

所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。

在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。

magic_quotes_gpc的一点认识 以及addslashes addcslashes区别:

1、条件: magic_quotes_gpc=off

写入数据库的字符串未经过任何过滤处理。从数据库读出的字符串也未作任何处理。

数据: $data=”snow\‘\‘\‘\‘sun” ; (snow和sun之间是四个连续的单引号).

操作: 将字符串:”snow\‘\‘\‘\‘sun” 写入数据库,

结果: 出现sql语句错误,mysql不能顺利完成sql语句,写入数据库失败。

数据库保存格式:无数据。

输出数据格式:无数据。

2、条件: magic_quotes_gpc=off

写入数据库的字符串经过函数addslashes()处理。从数据库读出的字符串未作任何处理。

数据: $data=”snow\‘\‘\‘\‘sun” ; (snow和sun之间是四个连续的单引号)

操作: 将字符串:”snow\‘\‘\‘\‘sun” 写入数据库

结果: sql语句顺利执行,数据成功写入数据库

数据库保存格式:snow\‘\‘\‘\‘sun (和输入一样)

输出数据格式:snow\‘\‘\‘\‘sun (和输入一样)

说明: addslashes()函数将单引号转换为\\\‘的转义字符使sql语句成功执行,但\\\‘并未作为数据存入数据库,数据库保存的是snow\‘\‘\‘\‘sun 而并不是我们想象的snow\\\‘\\\‘\\\‘\\\‘sun

说明: 对于未经处理的单引号在写入数据库时会使sql语句发生错误

3、条件: magic_quotes_gpc=on

写入数据库的字符串未经过任何处理。从数据库读出的字符串未作任何处理。

数据: $data=”snow\‘\‘\‘\‘sun” ; (snow和sun之间是四个连续的单引号)

操作: 将字符串:”snow\‘\‘\‘\‘sun” 写入数据库

结果: sql语句顺利执行,数据成功写入数据库

数据库保存格式:snow\‘\‘\‘\‘sun (和输入一样)

输出数据格式:snow\‘\‘\‘\‘sun (和输入一样)

说明: magic_quotes_gpc=on 将单引号转换为\\\‘的转义字符使sql语句成功执行,但\\\‘并未作为数据入数据库,数据库保存的是snow\‘\‘\‘\‘sun而并不是我们想象的snow\\\‘\\\‘\\\‘\\\‘sun。

4、条件: magic_quotes_gpc=on

写入数据库的字符串经过函数addlashes()处理。从数据库读出的字符串未作任何处理。

数据: $data=”snow\‘\‘\‘\‘sun” ; (snow和sun之间是四个连续的单引号)

操作: 将字符串:”snow\‘\‘\‘\‘sun” 写入数据库

结果: sql语句顺利执行,数据成功写入数据库

数据库保存格式:snow\\\‘\\\‘\\\‘\\\‘sun (添加了转义字符)

输出数据格式:snow\\\‘\\\‘\\\‘\\\‘sun (添加了转义字符)

说明: magic_quotes_gpc=on 将单引号转换为\\\‘的转义字符使sql语句成功执行

addslashes又将即将写入数据库的单引号转换为\\\‘,后者的转换被作为数据写入

数据库,数据库保存的是snow\\\‘\\\‘\\\‘\\\‘sun

总结如下:

1、对于magic_quotes_gpc=on的情况

我们可以不对输入和输出数据库的字符串数据作

addslashes()和stripslashes()的操作,数据也会正常显示。

如果此时你对输入的数据作了addslashes()处理,那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。

2、对于magic_quotes_gpc=off 的情况

必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出

因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。

补充:

magic_quotes_gpc 作用范围是:WEB客户服务端;作用时间:请求开始时,例如当脚本运行时。

magic_quotes_runtime 作用范围:从文件中读取的数据或执行exec()的结果或是从SQL查询中得到的;作用时间:每次当脚本访问运行状态中产生的数据。

另外:

addslashes()函数的作用是为字符串里面的部分字符添加反斜线转义字符,addslashes()函数只为4个字符添加转义,单引号“’ ”,双引号“””,反斜线“\\”和NULL(“\\0”)。

addcslashes()函数的作用也是对字符串添加转义,但是转义的字符必须由第二个参数指定,第二个参数的使用方法难度太高,跳过不讲。

stripslashes()函数的作用和addslashes()函数正好相反,可以将 addslashes()函数转义的那4个字符取消转义。

同样,stripcslashes()函数的作用和addcslashes()函数相反。

quotemeta()函数的作用是对11个特定字符进行转义,包括:. \\ + * ? [ ^ ] ( $ ) 似乎是可以用在正则里面。

echo addslashes(\"\‘\\\"\\ \");

// 显示 \\\‘\\\"\\\\

echo addcslashes(\"zoo[\‘.\‘]\", \‘zo\‘);

// 显示 \\z\\o\\o[\‘.\‘]

echo addcslashes(\"z\\\"oo[\‘.\‘]\", \‘\\\‘\\\"\‘);

// 显示 z\\\"oo[\\\‘.\\\‘]

echo addcslashes(\‘foo[ ]\‘, \‘A..z\‘);

// 显示 \\f\\o\\o\\[ \\]

echo stripslashes(addslashes(\"\‘\\\"\\ \"));

// 显示 \‘\"\\

echo stripcslashes(addcslashes(\"z\\\"oo[\‘.\‘]\", \‘\\\‘\\\"\‘));

// 显示 z\"oo[\‘.\‘]

echo quotemeta(\". \\ + * ?\");

// 显示 \\. \\\\ \\+ \\* \\?

补充:

get_magic_quotes_gpc

取得 PHP 环境变量 magic_quotes_gpc 的值。

语法:        long get_magic_quotes_gpc(void);   

返回值:     返回 0 表示关闭本功能;   

返回 1 表示本功能打开。   

当 magic_quotes_gpc 打开时,所有的 ‘ (单引号), " (双引号), \ (反斜线) and 空字符会自动转为含有反斜线的转义字符。

解决方案,检查用户提交的值的类型:

从前面的讨论中我们看到,迄今为止,SQL注入的主要来源往往出在一个意料之外的表单入口上。

然而,当你经由一个表单向用户提供机会提交某些值时,你应该有相当的优势来确定你想取得什么样的输入内容-这可以使得我们比较容易地检查用户入口的有效性。

在以前的文章中,我们已经讨论过这样的校验问题;所以,在此,我们仅简单地总结当时我们讨论的要点。

如果你正在期望一个数字,那么你可以使用下面这些技术之一来确保你得到的真正是一个数字类型:

  · 使用is_int()函数(或is_integer()或is_long())。

  · 使用gettype()函数。

  · 使用intval()函数。

  · 使用settype()函数。

为了检查用户输入内容的长度,你可以使用strlen()函数。

为了检查一个期望的时间或日期是否有效,你可以使用strtotime()函数。它几乎一定能够确保一位用户的入口中没有包含分号字符(除非标点符号可以被合法地包括在内)。

你可以借助于strpos()函数容易地实现这一点,如下所示:

if( strpos( $variety, ‘;‘ ) ) exit ( "$variety is an invalid value for variety!" );

正如我们在前面所提到的,只要你仔细分析你的用户输入期望,那么,你应该能够很容易地检查出其中存在的许多问题。

从你的查询中滤去每一个可疑字符 。

尽管在以前的文章中,我们已经讨论过如何过滤掉危险字符的问题;但是在此,还是让我们再次简单地强调并归纳一下这个问题:

· 不要使用magic_quotes_gpc指令或它的"幕后搭挡"-addslashes()函数,此函数在应用程序开发中是被限制使用的,并且此函数还要求使用额外的步骤-使用stripslashes()函数。

· 相比之下,mysql_real_escape_string()函数更为常用,但是也有它自己的缺点。

mysql_real_escape_string — 转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集。

区别:

addslashes() 是强行加;

mysql_real_escape_string()  会判断字符集,但是对PHP版本有要求;

mysql_escape_string不考虑连接的当前字符集。

时间: 2024-08-24 03:47:44

SQL注入安全的相关文章

WAF——针对Web应用发起的攻击,包括但不限于以下攻击类型:SQL注入、XSS跨站、Webshell上传、命令注入、非法HTTP协议请求、非授权文件访问等

核心概念 WAF Web应用防火墙(Web Application Firewall),简称WAF. Web攻击 针对Web应用发起的攻击,包括但不限于以下攻击类型:SQL注入.XSS跨站.Webshell上传.命令注入.非法HTTP协议请求.非授权文件访问等.

sql注入初中高学习

以下三篇文件关于SQL注入写的很通俗易懂,整理收藏下 渗透攻防Web篇-SQL注入攻击初级: http://bbs.ichunqiu.com/thread-9518-1-1.html 渗透攻防Web篇-SQL注入攻击中级: http://bbs.ichunqiu.com/thread-9668-1-1.html 渗透攻防Web篇-SQL注入攻击高级: http://bbs.ichunqiu.com/thread-10093-1-1.html

php中防止SQL注入的方法

[一.在服务器端配置] 安全,PHP代码编写是一方面,PHP的配置更是非常关键. 我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最主要就是要配置php.ini中的内容,让我们执行 php能够更安全.整个PHP中的安全设置主要是为了防止phpshell和SQL Injection的攻击,一下我们慢慢探讨.我们先使用任何编辑工具打开 /etc/local/apache2/conf/php.ini,如果你是采用其他方式安装,配置文件

sql注入总结

本实验测试是基于sqli-labs的实验环境 环境配置:php+mysql 环境搭建请参考 http://www.freebuf.com/articles/web/34619.html Sql注入定义: 就是通过把sql命令插入到web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行的sql命令的目的 sql注入分类: 基于联合查询 基于错误回显 基于盲注,分时间盲注和布尔型的盲注 基于user-agent 基于feferer 基于cookie 二次注入 宽字节注入 注入一个网站

SQL注入解决思路(C#示例)

最近在编程中遇到一个SQL注入防护的问题.在这里顺便把SQL注入小结一下.以MYSQL(5.1)为例. 一.常规的SQL语句 观察SQL语句 SELECT * FROM [tableName] WHERE col1='value1' 这个语句由3个部分组成,SELECT子句筛选得到结果,FROM子句指定了筛选的范围,WHERE子句指定了条件.当在其中进行如下置换: SELECT * FROM [tableName] WHERE 1 之后,选出了[tableName]表中的全部内容.分析其语法不难

微擎SQL注入漏洞

漏洞名称:微擎SQL注入漏洞 补丁文件:/web/source/mc/card.ctrl.php 补丁来源:阿里云云盾自研 漏洞描述:微擎CMS的/web/source/mc/card.ctrl.php中,对cardid输入参数未进行严格类型转义,导致SQL注入的发生 解决方法 搜索代码 if ($do == 'manage') 如下图: 在 201 行 前添加代码 $_GPC['cardid'] = intval($_GPC['cardid']); 修改后如图: 补丁文件:/web/sourc

SQL注入之SQLmap入门

什么是SQLmap? SQLmap是一款用来检测与利用SQL注入漏洞的免费开源工具,有一个非常棒的特性,即对检测与利用的自动化处理(数据库指纹.访问底层文件系统.执行命令). 读者可以通过位于SourceForge的官方网站下载SQLmap源码:http://sourceforge.net/projects/sqlmap/ SQLmap的作者是谁? Bernardo DameleAssumpcao Guimaraes (@inquisb),读者可以通过[email protected]与他取得联

PHPCMS \phpcms\modules\member\index.php 用户登陆SQL注入漏洞分析

catalog 1. 漏洞描述 2. 漏洞触发条件 3. 漏洞影响范围 4. 漏洞代码分析 5. 防御方法 6. 攻防思考 1. 漏洞描述2. 漏洞触发条件 0x1: POC http://localhost/phpcms_v9/index.php?m=member&c=index&a=login dosubmit=1&username=phpcms&password=123456%26username%3d%2527%2bunion%2bselect%2b%25272%2

关于ECSHOP中sql注入漏洞修复

公司部署了一个ecshop网站用于做网上商城使用,部署在阿里云服务器上,第二天收到阿里云控制台发来的告警信息,发现ecshop网站目录下文件sql注入漏洞以及程序漏洞 如下图: 与技术沟通未果的情况下,网上查了点资料,对其文件进行修复,如下修改: 1,/admin/shopinfo.php修复方法 (大概在第53.71.105.123行,4个地方修复方式都一样)     admin_priv('shopinfo_manage');      修改为     admin_priv('shopinf

SQL注入之mysql显错注入

在我们实际渗透中,明明发现一个注入点,本以为丢给sqlmap就可以了,结果sqlmap只显示确实是注入点,但是数据库却获取不了,如图1所示,这时我们可以使用手工进行注入,判断出过滤规则以及基本过滤情况,然后再选择对应的sqlmap脚本(如果有的话),本文主要是讲述如何通过mysql函数报错来进行注入,另外如何使用手工进行全程注入的利用过程,如果你知道sqlmap里面有对应的脚本的话,烦请告知一下,谢谢!. 图1 获取数据库失败 此时我们可以考虑下是否是显错注入,对于显错注入我们可以使用mysql