• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

mysql 搞代码 7年前 (2018-06-17) 226次浏览 已收录 0个评论

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

让我们看以下的代码:

以下为引用的内容: <?PHP
query = “Select news_title, news_text “;
query .= “FROM news”;
query .= “Where news_id=”. _GET[‘id’];

http://www.gaodaima.com/39819.htmlmysql和PHP中的SQL注入式漏洞解决方法_mysql

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);
?>

欢迎大家阅读《MySQL和PHP中的SQL注入式漏洞解决方法_mysql》,跪求各位点评,若觉得好的话请收藏本文,by 搞代码


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:MySQL和PHP中的SQL注入式漏洞解决方法_mysql

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址