首页 > 数据库 > MySQL > 正文

MySQL和PHP中的SQL注入式漏洞解决方法

2024-07-24 12:55:57
字体:
来源:转载
供稿:网友

sql注入式漏洞是许多php程序的主要安全危害,产生的原因是在向数据库执行插入等语句时,者允许最终用户操作变量(例如根据表单提交内容显示相应信息),通常是_get、_post或_session等全局变量。

让我们看以下的代码:

以下为引用的内容: <?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 script 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 script
die("invalid input");
}
}

// _post['name'] should be a string
// _post['id'] should be an integer, if not the script 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);
?>
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表