- 浏览: 912693 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
wangzhen199009:
good. Thx for your sharing.
REST和认证 HMAC -
jsshizhan:
你的这个SQL有问题的
数据库中如何使用SQL查询连续数字并且统计连续个数 -
maoghj:
dddddddddddddd
mysql 更改my.cnf 慢查询日志 -
zhoutong123a:
人的贪婪无止境,只能控制,不能满足
招人心得 -
xuerThinkVickie:
...
ZeroClipboard支持IE,firefox,Chrome复制到剪贴板
SQL injection即SQL注入是我们每个WEB程序员都需要面对的问题,一个WEB应用假如没有起码的安全性,那么其它的一切就可以免谈了。注入问题在ASP上可谓是闹得沸沸扬扬,当然还有不少PHP程序“遇难”。至于SQL injection的详情,网上的文章很多,在此就不作赘述。追其罪恶之源,就是我们误以为用户提交的数据是可靠的。
无论你是否有足够的PHP安全开发经验,本文的目的就是用来帮助你构建更为安全的在线应用程序。针对不同的情况,我们可以使用下面的一种或几种方法来对SQL注入的风险进行预防。
1、在书写SQL语句时不要省略单引号,即使是整型字段也应该加上单引号。
首先,从技术上讲,引号对于数字值来说是不需要使用的。但是,假如你不使用引号把例如书籍数量这样的一个值括起来,并且假如你的用户把一个空值输入到你的表单中,那么,你将会看到一个类似下面的查询:
SELECT * FROM books WHERE num =
当然,这个查询从语法上讲是无效的;但是,下面的语法却是有效的:
SELECT * FROM books WHERE num = ''
第二个查询虽然也不会返回任何结果,但是至少它不会返回一个错误消息。
其次,单引号可以增加注入者的难度,第二句由于把变量放在一对单引号中,这样使得我们所提交的变量都变成了字符串,即使包含了正确的SQL语句,也不会正常执行,而第一句不同,由于没有把变量放进单引号中,那我们所提交的一切,只要包含空格,那空格后的变量都会作为SQL语句执行,因此,我们要养成给SQL语句中变量加引号的习惯。
2、检查用户提交的值的类型,对接收到的整型参数使用intval()强制转换成整形。
我们知道SQL注入的主要来源往往出在一个意料之外的表单提交或URL参数中,所以当你接受一个由用户提交的参数时,你应该有相当的权利来确定你想取得什么样的输入内容。在以前的学习中我们已经讨论过很多这样或那样的校验问题。因此我们只要简单的总结当时我们讨论的要点即可比较轻易的检查用户提交数据的有效性。假如你期望得到的是一个数值,那么你可以使用下面这些技术之一来确保你得到的参数的安全性。
使用is_int()函数(或is_integer()或is_long())。
使用gettype()函数。
使用intval()函数。
使用settype()函数。
我们通常把传送过来的整型参数使用intval()函数强制转换成整形,因为假如不这样做,接收到的查询子句很可能会附带着其它一些我们并不愿看到的语句,比如原本应该是“nid=17”可能会成为“nid=17 or 1=1”,这会使我们预计的SQL语句变成这样:
SELECT * FROM news WHERE nid=17 or 1=1
这对于一个新闻表中的信息可能不会造成什么大的危害,但假如是在显示某个用户的信息时呢?
此外,为了检查用户输入内容的长度,你可以使用strlen()函数。为了检查一个期望的时间或日期是否有效,你可以使用strtotime()函数。它似乎一定能够确保一位用户的提交参数中没有包含分号字符(除非标点符号可以被合法地包括在内)。你可以借助于strpos()函数轻易地实现这一点,如下所示:
if( strpos( $variety, ';' ) ) exit ( "$variety is an invalid value for variety!" );
正如我们在前面所提到的,只要你仔细分析你的用户输入期望,那么,你应该能够很轻易地检查出其中存在的许多问题。
3、使用mysql_real_escape_string()函数从查询字符串中过滤掉危险字符
尽管有很多文章已经讨论过如何过滤掉危险字符的问题,但是在本文中还是让我们再次简单的强调并归纳一下这个问题:
不要使用magic_quotes_gpc指令或它的搭挡addslashes()函数,此函数在程序开发中应该是被限制使用的,在PHP的下一个版本PHP6中已经取消了对此函数的支持,并且此函数还要求使用额外的步骤stripslashes()函数。相比之下,mysql_real_escape_string()函数更为适合,受此函数影响的字符包括:\x00,\n,\r,\,',",\x1a。这二个函数的功能类似,但addslashes()函数无法转换以十六进制形式提交的字符,另外需要注重的是,mysqli_real_escape_string()函数需要先建立数据库连接,因为需要考虑到连接的当前字符集,通常防止数据库被攻击的使用方法如下:
<?php
function check_input($value)
{
// 去除斜杠
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
// 假如不是数字则加引号
if (!is_numeric($value))
{
$value = "'" . mysqli_real_escape_string($value) . "'";
}
return $value;
}
?>
4、对用户输入的字符进行HTML编码以防止跨站攻击
对于数据库防止SQL注入的问题,通过前面三点所述综合的运用我们似乎全部解决,但假如用户提交的内容中有一些不良的HTML标签则可能会导致页面变形,严重的还可能会出现跨站攻击之类的安全问题,所以对带有HTML的内容增加过滤检查是很有必要的。
例如一段接收用户的输入并显示的功能代码,一但恶意用户输入:<script type='text/javascript'>location.href='http://xxx.com';</script>这样的一条数据,网页在显示该条数据时,用户的浏览器将会跳转到恶意代码指定的地址,这就是最简单的跨站攻击,我们试想一下,假如跳转的地址是一个伪造原网站来骗取用户密码或银行信息的页面,那么会是什么样的后果?
对于这类攻击行为,就需要我们在接收用户提交的数据时在服务器端进行过滤,我们可以编写一个过滤函数用来查询提交数据中有害字符并将之替换掉,还有一种较简便的方式就把用户所提交的内容中“<”,“>”,“&”等符号转换成正确的HTML编码,而函数htmlspecialchars()正是干这个活的。
htmlspecialchars()
功能:将“'"&<>”五个字符转换成HTML字符串。
语法:string htmlspecialchars(string,quotestyle,character-set);
参数:ENT_NOQUOTES,不对任何引号进行格式化;ENT_QUOTES,对单引号及双引号进行格式化;默认为ENT_COMPAT,仅编码双引号。
返回值:字符串
因此,用户提交的数据经过格式化后为:
<script type='text/javascript'>location.href='http://xxx.com';</script>
这样代码就失去了原有的攻击功能,可以基本预防脚本攻击的潜在危险,假如不明白这之间的区别,可以测试下面这段代码:
<?php
$str="<a href='http://www.php3c.com'>PHP3C技术分享社区</a>";
echo $str;
echo "<br>";
echo htmlspecialchars($str);
?>
另外,转换非凡字符为HTML字符串还可以使用函数htmlentities(),使用方法相同,它与htmlspecialchars在格式化带有英文字符的html代码的时候没有什么区别,但是htmlentities对中文字符也不放过,所以同样的调用方法得出来的结果是由于没有指定字符集而默认由 ISO-8859-1 代替,中文字符部分变为一堆乱码,因此我们在使用的时候,需要指定参数character-set为我们页面使用的字符集,例如'UTF-8'或'GB2312'。
SQL注入攻击是针对服务器端的数据库实行的,而跨站脚本攻击是把恶意javascript代码在用户的客户端运行,但他们的相同之处在于攻击者必须通过互联网的输入区域插入恶意的数据,因此我们只要做好用户提交数据的过滤以及合法性验证就能从源头上制止这二类攻击,但这种过滤及验证被很多程序员所忽视的,希望本文能能引起大家的重视。
无论你是否有足够的PHP安全开发经验,本文的目的就是用来帮助你构建更为安全的在线应用程序。针对不同的情况,我们可以使用下面的一种或几种方法来对SQL注入的风险进行预防。
1、在书写SQL语句时不要省略单引号,即使是整型字段也应该加上单引号。
首先,从技术上讲,引号对于数字值来说是不需要使用的。但是,假如你不使用引号把例如书籍数量这样的一个值括起来,并且假如你的用户把一个空值输入到你的表单中,那么,你将会看到一个类似下面的查询:
SELECT * FROM books WHERE num =
当然,这个查询从语法上讲是无效的;但是,下面的语法却是有效的:
SELECT * FROM books WHERE num = ''
第二个查询虽然也不会返回任何结果,但是至少它不会返回一个错误消息。
其次,单引号可以增加注入者的难度,第二句由于把变量放在一对单引号中,这样使得我们所提交的变量都变成了字符串,即使包含了正确的SQL语句,也不会正常执行,而第一句不同,由于没有把变量放进单引号中,那我们所提交的一切,只要包含空格,那空格后的变量都会作为SQL语句执行,因此,我们要养成给SQL语句中变量加引号的习惯。
2、检查用户提交的值的类型,对接收到的整型参数使用intval()强制转换成整形。
我们知道SQL注入的主要来源往往出在一个意料之外的表单提交或URL参数中,所以当你接受一个由用户提交的参数时,你应该有相当的权利来确定你想取得什么样的输入内容。在以前的学习中我们已经讨论过很多这样或那样的校验问题。因此我们只要简单的总结当时我们讨论的要点即可比较轻易的检查用户提交数据的有效性。假如你期望得到的是一个数值,那么你可以使用下面这些技术之一来确保你得到的参数的安全性。
使用is_int()函数(或is_integer()或is_long())。
使用gettype()函数。
使用intval()函数。
使用settype()函数。
我们通常把传送过来的整型参数使用intval()函数强制转换成整形,因为假如不这样做,接收到的查询子句很可能会附带着其它一些我们并不愿看到的语句,比如原本应该是“nid=17”可能会成为“nid=17 or 1=1”,这会使我们预计的SQL语句变成这样:
SELECT * FROM news WHERE nid=17 or 1=1
这对于一个新闻表中的信息可能不会造成什么大的危害,但假如是在显示某个用户的信息时呢?
此外,为了检查用户输入内容的长度,你可以使用strlen()函数。为了检查一个期望的时间或日期是否有效,你可以使用strtotime()函数。它似乎一定能够确保一位用户的提交参数中没有包含分号字符(除非标点符号可以被合法地包括在内)。你可以借助于strpos()函数轻易地实现这一点,如下所示:
if( strpos( $variety, ';' ) ) exit ( "$variety is an invalid value for variety!" );
正如我们在前面所提到的,只要你仔细分析你的用户输入期望,那么,你应该能够很轻易地检查出其中存在的许多问题。
3、使用mysql_real_escape_string()函数从查询字符串中过滤掉危险字符
尽管有很多文章已经讨论过如何过滤掉危险字符的问题,但是在本文中还是让我们再次简单的强调并归纳一下这个问题:
不要使用magic_quotes_gpc指令或它的搭挡addslashes()函数,此函数在程序开发中应该是被限制使用的,在PHP的下一个版本PHP6中已经取消了对此函数的支持,并且此函数还要求使用额外的步骤stripslashes()函数。相比之下,mysql_real_escape_string()函数更为适合,受此函数影响的字符包括:\x00,\n,\r,\,',",\x1a。这二个函数的功能类似,但addslashes()函数无法转换以十六进制形式提交的字符,另外需要注重的是,mysqli_real_escape_string()函数需要先建立数据库连接,因为需要考虑到连接的当前字符集,通常防止数据库被攻击的使用方法如下:
<?php
function check_input($value)
{
// 去除斜杠
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
// 假如不是数字则加引号
if (!is_numeric($value))
{
$value = "'" . mysqli_real_escape_string($value) . "'";
}
return $value;
}
?>
4、对用户输入的字符进行HTML编码以防止跨站攻击
对于数据库防止SQL注入的问题,通过前面三点所述综合的运用我们似乎全部解决,但假如用户提交的内容中有一些不良的HTML标签则可能会导致页面变形,严重的还可能会出现跨站攻击之类的安全问题,所以对带有HTML的内容增加过滤检查是很有必要的。
例如一段接收用户的输入并显示的功能代码,一但恶意用户输入:<script type='text/javascript'>location.href='http://xxx.com';</script>这样的一条数据,网页在显示该条数据时,用户的浏览器将会跳转到恶意代码指定的地址,这就是最简单的跨站攻击,我们试想一下,假如跳转的地址是一个伪造原网站来骗取用户密码或银行信息的页面,那么会是什么样的后果?
对于这类攻击行为,就需要我们在接收用户提交的数据时在服务器端进行过滤,我们可以编写一个过滤函数用来查询提交数据中有害字符并将之替换掉,还有一种较简便的方式就把用户所提交的内容中“<”,“>”,“&”等符号转换成正确的HTML编码,而函数htmlspecialchars()正是干这个活的。
htmlspecialchars()
功能:将“'"&<>”五个字符转换成HTML字符串。
语法:string htmlspecialchars(string,quotestyle,character-set);
参数:ENT_NOQUOTES,不对任何引号进行格式化;ENT_QUOTES,对单引号及双引号进行格式化;默认为ENT_COMPAT,仅编码双引号。
返回值:字符串
因此,用户提交的数据经过格式化后为:
<script type='text/javascript'>location.href='http://xxx.com';</script>
这样代码就失去了原有的攻击功能,可以基本预防脚本攻击的潜在危险,假如不明白这之间的区别,可以测试下面这段代码:
<?php
$str="<a href='http://www.php3c.com'>PHP3C技术分享社区</a>";
echo $str;
echo "<br>";
echo htmlspecialchars($str);
?>
另外,转换非凡字符为HTML字符串还可以使用函数htmlentities(),使用方法相同,它与htmlspecialchars在格式化带有英文字符的html代码的时候没有什么区别,但是htmlentities对中文字符也不放过,所以同样的调用方法得出来的结果是由于没有指定字符集而默认由 ISO-8859-1 代替,中文字符部分变为一堆乱码,因此我们在使用的时候,需要指定参数character-set为我们页面使用的字符集,例如'UTF-8'或'GB2312'。
SQL注入攻击是针对服务器端的数据库实行的,而跨站脚本攻击是把恶意javascript代码在用户的客户端运行,但他们的相同之处在于攻击者必须通过互联网的输入区域插入恶意的数据,因此我们只要做好用户提交数据的过滤以及合法性验证就能从源头上制止这二类攻击,但这种过滤及验证被很多程序员所忽视的,希望本文能能引起大家的重视。
发表评论
-
php学习网站
2011-04-25 09:51 1091http://www.php100.com/ -
计划高效的工作
2010-11-09 10:55 953计划高效的工作 打印机为什么卡纸,所以就要有人盯着,不能卡纸 ... -
php编码规范
2010-11-03 22:12 1255B.4. 编码风格 B.4. 编码风格 ¶ B.4.1. PH ... -
一些鲜为人知的编程事实
2010-09-05 18:45 962我的程序员经历让我明 ... -
apache 日志分析软件 Weg Log Explorer
2010-09-04 10:54 1035apache 日志分析软件 Weg Log Explorer -
symfony 和 thinkphp
2010-09-02 17:43 1899symfony 和 thinkphp 配置 需要 ... -
接口也是为了方便团队开发上的协同工作!
2010-07-27 12:47 1010接口也是为了方便团队开发上的协同工作! 解耦 // 接口定义 ... -
vi apache 日志脚本 查询统计
2010-06-25 17:15 1191cat wap.snjifen.com-access_log. ... -
chown apache:apache
2010-06-25 09:36 1196drwxr-xr-x 9 root root 4096 ... -
递归删除.svn
2010-06-24 17:17 916引用递归删除.svn -
IE在对iframe里面的页面写Cookie的时候有一些安全限制,导致读写Cookie不成功,解决办法
2010-06-22 11:28 1906IE在对iframe里面的页面写Cookie的时候有一些安全限 ... -
VI 编辑器查询删除
2010-05-14 19:20 1175:g/^,/d :g/fail/d ":g&qu ... -
crontab
2010-04-23 12:47 1038#########自动执行一定要写全路径########### ... -
linux tar 解压缩
2010-04-23 09:58 945tar -zcvf test.tar.gz www/* 压缩 ... -
copy 目录
2010-04-21 17:57 903cp -r -
重启apache
2010-04-20 17:21 959/usr/local/apache2/bin/apachect ... -
配置UCHOME 出现不支持简短标签写法 short_open_tag
2010-04-20 17:07 1482gettpl('header');?>错误 把PHP. ... -
改变表结构字符集
2010-04-13 18:26 1057Alter TABLE joy_winner CONVERT ... -
mysql错误:Table XXX is marked as crashed and should be repaired[转]
2010-04-13 10:53 8538一日正在上班,朋友的QQ图标就激烈的闪亮起来,一看,原来是论坛 ... -
$_SERVER[PHP_SELF],[SCRIPT_NAME], ['REQUEST_URI']
2010-03-09 13:31 4670$_SERVER[PHP_SELF], $_SERVER[SC ...
相关推荐
SQL注入的基本思路是,攻击者在应用程序的输入字段中插入恶意SQL语句,这些语句与应用程序原有的SQL查询相结合,从而改变查询的意图。例如,一个简单的用户登录表单,如果未对用户输入的用户名和密码进行有效过滤,...
本文针对SQL注入攻击及其防范措施展开了详细讨论,以下是对文档内容的知识点梳理: 1. SQL注入攻击的定义与原理 SQL注入攻击是一种常见的网络攻击技术,攻击者利用网站应用程序对用户输入数据的合法性判断不足,向...
### SQL注入攻击与防范研究 #### 一、SQL注入攻击概述 SQL注入攻击是一种常见的网络安全威胁,主要通过向Web应用程序提交恶意SQL代码来实现。这种攻击利用了Web应用开发过程中未能充分验证用户输入数据的问题,...
总的来说,"360提供的php防sql注入代码修改类"是一个实用的工具,旨在帮助开发者提高PHP应用的安全性,减少SQL注入和HTTP跨站攻击的风险。通过理解并应用这个类,我们可以更好地保护我们的网站和用户数据。在实践中...
PHP 中 MySQL 数据库的 SQL 注入与全面防范 SQL 注入是 Web 应用程序中的一种常见的安全漏洞,它可以导致攻击者非法访问数据库,获取敏感信息甚至控制整个系统。在 PHP 中使用 MySQL 数据库时,SQL 注入问题非常...
"sql注入法攻击.sql注入法攻击.rar"这个文件很可能是关于如何预防和应对SQL注入攻击的教学资料。 在了解SQL注入攻击之前,我们首先要明白SQL(Structured Query Language)是用于管理和处理关系数据库的标准语言。...
【PHP中的SQL注入攻击】 SQL注入式攻击是网络安全领域中的一种常见威胁,主要针对使用PHP等编程语言构建的Web应用程序。这种攻击方式是通过输入恶意的SQL代码到应用程序的输入字段,来操纵后端数据库,获取、修改或...
SQL注入攻击是网络安全领域中的一个严重威胁,它发生在应用程序与数据库交互时,恶意用户通过输入特殊的SQL代码,篡改原本的查询逻辑,从而获取、修改、删除敏感数据或执行非法操作。了解SQL注入的种类和防范手段...
开发代码安全规范防SQL注入和XSS跨站攻击代码编写规范样本 随着技术的高速发展,Web应用被广泛使用,但同时也伴随着各种安全隐患。为了提高编程人员的安全意识和安全编程经验,本规范提供了防止SQL注入和XSS跨站...
5. 检测和防御SQL注入和跨站脚本攻击: - 使用自动化工具进行扫描,如Nessus、OWASP ZAP。 - 应用防火墙(WAF)可以拦截和阻止恶意的SQL注入请求。 - 定期进行安全审计和更新代码库,修复已知漏洞。 综上所述,...
6. SQL注入防范方法:为了提高Web应用程序的安全性,文档提到了对Web服务器配置参数、数据库类型、数据库权限配置和脚本逻辑等方面的考量,强调了配置文件php.ini中与注入攻击相关的重要选项的正确配置。虽然这可以...
下面将详细讨论SQL注入、PHP与MySQL的结合使用,以及如何防范SQL注入。 **SQL注入** SQL注入是一种常见的网络攻击方式,攻击者通过输入恶意的SQL代码来操纵或破坏数据库。当应用程序没有正确地过滤用户输入并将其...
### SQL注入攻击及其防范检测技术研究 #### 一、SQL注入攻击概述 ##### 1.1 SQL注入技术定义 SQL注入(SQL Injection)攻击是指攻击者利用Web应用程序中未经过滤或验证的用户输入,向应用程序发送恶意SQL代码,...
在网络安全领域,SQL注入是一种常见的攻击手段,尤其在PHP编程中更为常见。本文将深入探讨PHP SQL注入漏洞的原理、类型、影响以及防范措施,旨在帮助开发者更好地理解并避免此类安全问题。 一、SQL注入漏洞概述 SQL...
### 基于jQuery的SQL注入攻击防范实现 #### 一、引言 SQL注入攻击是Web应用程序中常见的安全威胁之一。它通过恶意输入来操纵数据库查询,从而获取未授权的数据或执行非法操作。传统的防御措施多集中在服务器端,如...
SQL注入攻击者可以通过这个漏洞在数据库中执行恶意的SQL语句,从而对网站数据库进行非授权的操作。 ### SQL注入漏洞知识点 1. **SQL注入概念** SQL注入(SQL Injection)是一种攻击技术,攻击者通过在Web表单输入...
在网络安全领域,SQL注入和XSS(跨站脚本)攻击是两种常见的威胁,它们针对的是Web应用程序的安全性。本文将详细介绍这两种攻击类型以及相关的防范措施,并介绍一款名为"扫描SQL注射与XSS攻击的牛B工具"的实用工具,...
4. **参数化查询**:参数化查询是防范SQL注入的强有力工具,它允许开发者在SQL语句中指定占位符,再单独传递参数值,从而确保输入数据不会改变SQL语句结构。 5. **使用安全框架**:现代Web框架如Laravel、Symfony等...
下面将详细阐述SQL注入攻击的原理、类型、防范措施以及相关资源。 **一、SQL注入攻击原理** SQL注入通常发生在应用程序没有正确地过滤或转义用户提供的输入时。当用户输入的数据被直接拼接到SQL查询语句中,恶意的...