仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 782|回复: 7
打印 上一主题 下一主题

[学习教程] MYSQL教程之MySQL和PHP中的SQL注进式毛病办理办法

[复制链接]
小女巫 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:18:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
越来越多的开发者将继续选择MySQL。Evans的总裁JohnAndrews表示,MySQL学习教程用户对MySQL和其他开源数据库的评价正在赶上甚至超过很多专有商业数据库软件。SQL注进式毛病是很多PHP程序的次要平安伤害,发生的缘故原由是在向数据库实行拔出等语句时,web开辟者同意终极用户操纵变量(比方依据表单提交内容显现响应信息),一般是_GET、_POST或_SESSION等全局变量。

让我们看以下的代码:
以下为援用的内容:<?PHP
query="Selectnews_title,news_text";
query.="FROMnews";
query.="Wherenews_id="._GET[id];

mysql_query(query);
?>
假如以为个中的_GET[‘id’]会永久是个数值型的值那将是很严峻的毛病。终极用户能够改动这个变量的值,比方"0;DeleteFROMnews;",那末query语句就会酿成上面的值:

Selectnews_title,news_textFROMnewsWherenews_id=0;DeleteFROMnews;

这将发生很严峻的成果。

考证数值型数据

数值型数据是最简单考证的,PHP有一个自带的函数叫is_numeric()能够前往ture值来判别是不是是数值型,这个函数并非MySQL自带的,因而可在任何数据库平台的php程序顶用于考证数字。

上面是修正后的代码:

以下为援用的内容:<?PHP
if(!is_numeric(_GET[id]))
{
//idsnotnumeric?
//killthescriptbeforethequerycanrun
die("Theidmustbenumeric!");
}

query="Selectnews_title,news_text";
query.="FROMnews";
query.="Wherenews_id="._GET[id];

mysql_query(query);
?>
考证非数值型数据

非数值型数据的考证稍有点贫苦。PHP有个叫MagicQuotes的特别功效。当它激活时,PHP会主动过滤失落_GET和_POST全局变量中的反斜线标记(),双引号(”),单引号(’)和空缺字符。成绩是并非一切的服务器都能翻开了这个功效,以是必需检测服务器是不是守旧了这个功效。可使用get_magic_quotes_gpc()函数来判断maigcquotes功效是不是翻开。
在MySQL查询语句可使用mysql_real_escape_string()函数来加强平安性,代码以下:

以下为援用的内容:<?PHP
//Fixa_POSTvariablecalledfirstNameforMySQL
firstName=_POST[firstName];
if(get_magic_quotes_gpc())
{
//Ifmagicquotesisenabled-turnthestringbackintoanunsafestring
firstName=stripslashes(firstName);
}

//NowconverttheunsafestringintoaMySQLsafestring
firstName=mysql_real_escape_string(firstName);

//firstNameshouldnowbesafetoinsertintoaquery
?>
输入到页面

为准确显现字符中的引号和反斜线,应利用stripslashes()函数

以下为援用的内容:<?PHP
firstName=_POST[firstName];
if(get_magic_quotes_gpc())
{
//Ifmagicquotesisenabled-turnthestringbackintoanunsafestring
firstName=stripslashes(firstName);
}

//NowconverttheunsafestringintoaMySQLsafestring
firstName=mysql_real_escape_string(firstName);

//Safequery
mysql_query("InsertINTONamesVALUES(".firstName.")");

//Pageoutputshouldlookproper
echo"Hello".htmlentities(stripslashes(firstName));
?>
终极整合

最初能够创建一个复杂的函数来办理在PHP中假如平安的举行MySQL查询字符。值得注重的是,假如要输入到WEB页面上还必要利用stripslashes。

以下为援用的内容:<?PHP
functionVerifyInput(input,forceInt=false)
{
if(is_numeric(input))
{
returninput;
}
elseif(!forceInt)
{
if(get_magic_quotes_gpc())
{
//ifmagicquotesisenabled,getridofthose
//peskyslashes
input=stripslashes(input);
}

//converttheinputvariableintoaMySQLsafestring.
input=mysql_real_escape_string(input);

returninput;
}
else
{
//ifinputnotanintegerandforceInt=true,
//killscript
die("InvalidInput");
}
}

//_POST[name]shouldbeastring
//_POST[id]shouldbeaninteger,ifnotthescriptdies
id=_POST[id];
name=_POST[name];

query="UpdateusersSETname=".VerifyInput(name)."";
query.="Whereid=".VerifyInput(id,true);

//queryshouldbesafetorun
mysql_query(query);
?>MySQL已经为支持所有最流行的Web2.0语言做好了准备,诸如Ruby、Ajax等,当然还有PHP。有的业界分析师说过,“每一个Web2.0公司实质上就是一个数据库公司。
沙发
发表于 2015-1-27 15:07:29 | 只看该作者
SQL语言是学习所有数据库产品的基础,无论你是做数据库管理还是做数据库开发都是这样。不过具体学习的侧重点要看你将来做哪一块,如果是做数据库管理(DBA),侧重点应该放在SQLServer的系统管理上.
透明 该用户已被删除
板凳
发表于 2015-2-5 11:16:02 | 只看该作者
记得在最开始使用2k的时候就要用到这个功能,可惜2k没有,现在有了作解决方案的朋友会很高兴吧。
若相依 该用户已被删除
地板
发表于 2015-2-11 11:35:10 | 只看该作者
习惯敲命令行的朋友可能会爽一些。但是功能有限。适合机器跑不动SQLServerManagementStudio的朋友使用。
冷月葬花魂 该用户已被删除
5#
发表于 2015-3-2 12:48:19 | 只看该作者
代替了原来VB式的错误判断。比Oracle高级不少。
admin 该用户已被删除
6#
发表于 2015-3-11 04:09:00 | 只看该作者
而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~
爱飞 该用户已被删除
7#
发表于 2015-3-17 20:50:40 | 只看该作者
可以动态传入参数,省却了动态SQL的拼写。
莫相离 该用户已被删除
8#
发表于 2015-3-25 01:45:06 | 只看该作者
语句级快照和事务级快照终于为SQLServer的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 20:27

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表