|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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公司实质上就是一个数据库公司。 |
|