PHP & MYSQL 注入与安全 如何防止mysql 注入漏洞

引发SQL注入攻击的最主要原因
没有对数据类型进行检查过滤和转义

MySQL SELECT 注入

http://www.xxtime.com/show.php?id=2345
show.php文件内容

<?php
$id = $_GET&#91;'id'&#93;;
$sql = 'SELECT * FROM table WHERE id = $id';
$db-&gt;query($sql);
// …
// … do something
?>;

url后面加个英文引号
http://www.xxtime.com/show.php?id=2345′
$sql = ‘SELECT * FROM table WHERE id = 2345”;
报错。。。。
说明过滤不严,可能存在注入漏洞。。。。?

把提交的网址修改为:
http://www.xxtime.com/show.php?id=2345%20or%201=1
访问后
$id = ‘2345 or 1=1’
$sql = ‘SELECT * FROM table WHERE id = 2345 or 1=1’;
这句sql则会列出所有表中数据

MySQL UPDATE注入

<?php
// …
$sql = "UPDATE users SET password='$pass', email='$email'
WHERE id='$id'";
$db->query($sql);
// …
// … do something
?>

我们在添email的地方我们添入 work@xxtime.com’,usergroup=’1
sql语句执行的就是:

UPDATE users SET
password='MyPasword', email='work@xxtime.com',usergroup='1' WHERE id='MyID'

假如usergroup=1 代表管理员权限 那此时我们就获得了管理员权限

MySQL INSERT注入

<?php
// …
$query = "INSERT INTO members VALUES('$id','$login','$pass','$email','2')";
//其中2代表普通用户,如果为1 则是管理员
$db->query($sql);
// …
// … do something
?>

还是在要我们输入email的地方输入:  work@xxtime.com’,’1′)#
sql语句执行时变成了:

INSERT INTO membres
VALUES ('MyID','MyName','MyPassword',' work@xxtime.com','1')# ','2')"

其中#代表注释,#后面的sql不会执行,只会执行

INSERT INTO membres VALUES ('MyID','MyName','MyPassword',' work@xxtime.com','1')

那么我们就获得了管理员权限

总结:
作为一个程序员,一个网络工程师,做研发的同志们, 一定要谨记,一定要严格过滤用户端输入,这也是作为一个优秀的php工程师必须要拥有的素质

php 防mysql注入函数 addslashes和mysql_real_escape_string

什么都不说,先上代码

function get_str($string)
{
	if (!get_magic_quotes_gpc())
	{
		return addslashes($string);
	}
	return $string;
}

国内很多PHP coder仍在依靠addslashes防止SQL注入(包括我在内),我还是建议大家加强中文防止SQL注入的检查。addslashes的问题在于可以用0xbf27来代替单引号,而addslashes只是将0xbf27修改为0xbf5c27,成为一个有效的多字节字符,其中的0xbf5c仍会被看作是单引号,所以addslashes无法成功拦截。
当然addslashes也不是毫无用处,它是用于单字节字符串的处理,多字节字符还是用mysql_real_escape_string吧。

最好对magic_quotes_gpc已经开放的情况下,还是对$_POST[‘lastname’]进行检查一下。
再说下mysql_real_escape_string和mysql_escape_string这2个函数的区别:
mysql_real_escape_string 必须在(PHP 4 >= 4.3.0, PHP 5)的情况下才能使用。否则只能用 mysql_escape_string ,两者的区别是:

mysql_real_escape_string 考虑到连接的当前字符集,而mysql_escape_string 不考虑。

总结一下:

addslashes() 是强行加;
mysql_real_escape_string() 会判断字符集,但是对PHP版本有要求;
mysql_escape_string不考虑连接的当前字符集。

本文转载自网络

Zend Studio 9 注册码 Zend Studio 9下载地址 视频教程

Zend Studio是Zend Technologies开发的PHP语言集成开发环境(Integrated Development Environment IDE)。也支持HTML和js标签,但只对PHP语言提供调试支持。因为是同一个公司的产品,所以提供的Zend Framework方面的支持比其他软件好。Zend Studio5.5系列后,官方推出利用了Eclipse平台,基于PDT的Zend Studio for Eclipse 6.0,之后的版本也都构建于Eclipse。
Zend Studio是屡获大奖的专业 PHP 集成开发环境,具备功能强大的专业编辑工具和调试工具,支持PHP语法加亮显示,支持语法自动填充功能,支持书签功能,支持语法自动缩排和代码复制功能,内置一个强大的PHP代码调试工具,支持本地和远程两种调试模式,支持多种高级调试功能。

官方下载预览页
http://www.zend.com/en/products/studio/downloads?src=downloadb

 

Zend Studio 9.0.1 (with JRE)官方下载地址:
http://downloads.zend.com/studio-eclipse/9.0.1/ZendStudio-9.0.1.msi

 

Zend Studio 9.0.1 (no JRE)官方下载地址:
http://downloads.zend.com/studio-eclipse/9.0.1/ZendStudio-without-JRE-9.0.1.msi

 

Zend Studio 9 官方视频教程:
http://static.zend.com/topics/videos/zend-studio-overview/

 

zend studio 8 注册码(适用于7.0、8.0所有版本,9.0?哦,再等等)
Username: zendstudio.net
Serial Number: 3727234F6095F72034F6095F

经典sql批量数据处理 sql异构数据导入 sql批量替换 sql字符串连接

sql 数据操作语法经典摘录
SQL Server 连接字符串是用“+”,现在数据库用mysql,写个累加两个字段值SQL语句居然不支持”+”,后来才知道mysql里的+是数字相加的操作,连接字符串是CONCAT函数
本文介绍 经典sql批量数据处理 sql异构数据导入 sql批量替换 sql字符串连接

---批量异构数据导入
INSERT INTO Table1(`catid`, `status`, `inputtime`, `updatetime`)
SELECT `typeid`, 99, unix_timestamp(time), unix_timestamp(time)
FROM Table2


----批量数据替换
UPDATE `Table1` SET url=REPLACE(url,"/uacool/","/");


---字符串连接
UPDATE `Table1` SET `id`=CONCAT('c-1-',`id`)

不断更新中,最后一次更新2012-02-22

mb_strlen 与 strlen 计算字符串长度函数区别

当字符全是英文字符的时候,两者是一样。这里主要比较一下,中英文混排的时候,两个计算结果。(测试时编码方式是UTF8)
复制代码代码如下:

<?php
$str=‘中文a字1符‘;
echo strlen($str);
echo ‘<br />‘;
echo mb_strlen($str,‘UTF8‘);
//输出结果
//14
//6
?>

结果分析:在strlen计算时,对待一个UTF8的中文字符是3个长度,所以“中文a字1符”长度是3*4+2=14
在mb_strlen计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算,所以“中文a字1符”长度是6
关于中英文混排串的占位符计算:
利用这两个函数则可以联合计算出一个中英文混排的串的占位是多少(一个中文字符的占位是2,英文字符是1),计算的方法是:如果一个混排字符串有a个中文,b个英文,占位是:
复制代码代码如下:

<?php
$str=‘中文a字1符‘;
//计算如下
echo (strlen($str) + mb_strlen($str,‘UTF8‘)) / 2;
echo
//输出结果
//10
?>

例如 “中文a字1符” 的strlen($str)值是14,mb_strlen($str)值是6,则可以计算出“中文a字1符”的占位是10.
附网站的一篇文章:
还是有关中文的问题。PHP内置的字符串长度函数strlen无法正确处理中文字符串,它得到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍的差异了(在UTF-8编码下,一个汉字占3个字节)。

采用mb_strlen函数可以较好地解决这个问题。mb_strlen的用法和strlen类似,只不过它有第二个可选参数用于指定字符编码。例如得到UTF-8的字符串$str长度,可以用mb_strlen($str,’UTF-8′)。如果省略第二个参数,则会使用PHP的内部编码。内部编码可以通过mb_internal_encoding()函数得到。需要注意的是,mb_strlen并不是PHP核心函数,使用前需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函数的问题。

虚拟机VirtualPC、VMware、VirtualBox比较与浅谈

Virtual PC是世界顶级虚拟机软件,使最先进的用了当今最先进的虚拟技术,Virtual PC是一款微软开发的免费软件,它主要是面向客户,用来做商业软件布署前的测试的,微软自己的产品,因此安装到电脑上不必考虑兼容等问题,但是在此虚拟机上只能安装windows和os/2操作系统,即使装上其他操作系统,问题还会出现很多。
VMware是全球台式电脑及资料中心虚拟化解决方案的领导厂商,VMWare虚拟机同样是世界顶级虚拟机软件,使最先进的用了当今最先进的虚拟技术,它可以在一台电脑上同时运行二个或更多的Windows、DOS、LINUX、Mac OS X等操作系统,目前使用者最多。
VirtualBox名声虽不及以上两款,但也是一款功能强大的虚拟机,已经走向(源代码)开源,成为一个发布在GPL许可之下的自由软件,完全免费使用,可以虚拟安装Windows、Mac OS X和Linux等多种版本的操作系统。

文件共享方面:
VirtualBox无法实现主机和虚拟机之间文件的拖拽,因此和主机实现文件共享,需要设置,这一点是不及其他两款虚拟机的。

在网络方面:
VMware在网络方面功能是最强大的,可以满足一般用户和高端用户需要,Virtual PC可以满足一般用户的需要
Virtual PC的网络共享方式与VMWare不同。VMWare是通过模拟网卡实现网络共享的,而Virtual PC是通过在现有网卡上绑定Virtual PC emulated switch服务实现网络共享的
VMware可以将几台虚拟机用网卡连接为一个局域网。
VirtualBox的网络类型设置没有VMware的种类齐全,能满足一般用户需要,比VirtualPC功能好一些却不及VMware强大