SQL注入式漏洞是许多PHP程序的主要安全危害,产生的原因是在向数据库执行插入等语句时,web开发者允许最终用户操作变量(例如根据表单提交内容显示相应信息),通常是_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?
//