MySQL和PHP中的SQL注入式漏洞解决方法
添加时间:2014-5-31 17:25:40
添加:
思海网络
SQL注入式漏洞是许多PHP程序的主要安全危害,产生的原因是在向数据库执行插入等语句时,web开发者允许最终用户操作变量(例如根据表单提交内容显示相应信息),通常是_GET、_POST或_SESSION等全局变量。
如果认为其中的_GET[‘id’]会永远是个数值型的值那将是很严重的错误。最终用户可以改变这个变量的值,例如"0; Delete FROM news;",那么query语句就会变成下面的值:
Select news_title, news_text FROM news Where news_id=0; Delete FROM news;
这将产生很严重的后果。
验证数值型数据
数值型数据是最容易验证的,PHP有一个自带的函数叫 is_numeric()可以返回ture值来判断是否是数值型,这个函数并不是MySQL自带的,因此可在任何数据库平台的php程序中用于验证数字。
下面是修改后的代码:
验证非数值型数据
非 数值型数据的验证稍有点麻烦。PHP有个叫Magic Quotes的特殊功能。当它激活时,PHP会自动过滤掉_GET和_POST全局变量中的反斜线符号(\),双引号(”),单引号(’)和空白字符。问 题是并不是所有的服务器都能打开了这个功能,所以必须检测服务器是否开通了这个功能。可以使用get_magic_quotes_gpc()函数来判定 maigc quotes功能是否打开。
在MySQL查询语句可以使用mysql_real_escape_string()函数来增强安全性,代码如下:
输出到页面
为正确显示字符中的引号和反斜线,应使用stripslashes()函数
最终整合
最后可以建立一个简单的函数来解决在PHP中如果安全的进行MySQL查询字符。值得注意的是,如果要输出到WEB页面上还需要使用stripslashes。
以下为引用的内容: <?PHP
function VerifyInput(input, forceInt = false)
{
if (is_numeric(input))
{
return input;
}
elseif (!forceInt)
{
if (get_magic_quotes_gpc())
{
// if magic quotes is enabled, get rid of those
// pesky slashes
input = stripslashes(input);
}
// convert the input variable into a MySQL safe string.
input = mysql_real_escape_string(input);
return input;
}
else
{
// if input not an integer and forceInt = true,
// kill
die("Invalid Input");
}
}
// _POST['name'] should be a string
// _POST['id'] should be an integer, if not the dies
id = _POST['id'];
name = _POST['name'];
query = "Update users SET name=". VerifyInput(name) ." ";
query .= "Where id=". VerifyInput(id, true);
// query should be safe to run
mysql_query(query);
让我们看以下的代码:
以下为引用的内容: <?PHP query = "Select news_title, news_text "; query .= "FROM news"; query .= "Where news_id=". _GET['id']; mysql_query(query); ?> |
如果认为其中的_GET[‘id’]会永远是个数值型的值那将是很严重的错误。最终用户可以改变这个变量的值,例如"0; Delete FROM news;",那么query语句就会变成下面的值:
Select news_title, news_text FROM news Where news_id=0; Delete FROM news;
这将产生很严重的后果。
验证数值型数据
数值型数据是最容易验证的,PHP有一个自带的函数叫 is_numeric()可以返回ture值来判断是否是数值型,这个函数并不是MySQL自带的,因此可在任何数据库平台的php程序中用于验证数字。
下面是修改后的代码:
以下为引用的内容: <?PHP if (!is_numeric(_GET['id'])) { // id's not numeric? // kill the before the query can run die("The id must be numeric!"); } query = "Select news_title, news_text "; query .= "FROM news"; query .= "Where news_id=". _GET['id']; mysql_query(query); ?> |
验证非数值型数据
非 数值型数据的验证稍有点麻烦。PHP有个叫Magic Quotes的特殊功能。当它激活时,PHP会自动过滤掉_GET和_POST全局变量中的反斜线符号(\),双引号(”),单引号(’)和空白字符。问 题是并不是所有的服务器都能打开了这个功能,所以必须检测服务器是否开通了这个功能。可以使用get_magic_quotes_gpc()函数来判定 maigc quotes功能是否打开。
在MySQL查询语句可以使用mysql_real_escape_string()函数来增强安全性,代码如下:
以下为引用的内容: <?PHP // Fix a _POST variable called firstName for MySQL firstName = _POST['firstName']; if (get_magic_quotes_gpc()) { // If magic quotes is enabled - turn the string back into an unsafe string firstName = stripslashes(firstName); } // Now convert the unsafe string into a MySQL safe string firstName= mysql_real_escape_string(firstName); // firstName should now be safe to insert into a query ?> |
输出到页面
为正确显示字符中的引号和反斜线,应使用stripslashes()函数
以下为引用的内容: <?PHP firstName = _POST['firstName']; if (get_magic_quotes_gpc()) { // If magic quotes is enabled - turn the string back into an unsafe string firstName = stripslashes(firstName); } // Now convert the unsafe string into a MySQL safe string firstName = mysql_real_escape_string(firstName); // Safe query mysql_query("Insert INTO Names VALUES('". firstName ."')"); // Page output should look proper echo "Hello ". htmlentities(stripslashes(firstName)); ?> |
最终整合
最后可以建立一个简单的函数来解决在PHP中如果安全的进行MySQL查询字符。值得注意的是,如果要输出到WEB页面上还需要使用stripslashes。
以下为引用的内容: <?PHP
function VerifyInput(input, forceInt = false)
{
if (is_numeric(input))
{
return input;
}
elseif (!forceInt)
{
if (get_magic_quotes_gpc())
{
// if magic quotes is enabled, get rid of those
// pesky slashes
input = stripslashes(input);
}
// convert the input variable into a MySQL safe string.
input = mysql_real_escape_string(input);
return input;
}
else
{
// if input not an integer and forceInt = true,
// kill
die("Invalid Input");
}
}
// _POST['name'] should be a string
// _POST['id'] should be an integer, if not the dies
id = _POST['id'];
name = _POST['name'];
query = "Update users SET name=". VerifyInput(name) ." ";
query .= "Where id=". VerifyInput(id, true);
// query should be safe to run
mysql_query(query);
?>
关键字:MySQL、PHP、数据库
新文章:
- CentOS7下图形配置网络的方法
- CentOS 7如何添加删除用户
- 如何解决centos7双系统后丢失windows启动项
- CentOS单网卡如何批量添加不同IP段
- CentOS下iconv命令的介绍
- Centos7 SSH密钥登陆及密码密钥双重验证详解
- CentOS 7.1添加删除用户的方法
- CentOS查找/扫描局域网打印机IP讲解
- CentOS7使用hostapd实现无AP模式的详解
- su命令不能切换root的解决方法
- 解决VMware下CentOS7网络重启出错
- 解决Centos7双系统后丢失windows启动项
- CentOS下如何避免文件覆盖
- CentOS7和CentOS6系统有什么不同呢
- Centos 6.6默认iptable规则详解