欢迎您访问我爱IT技术网,今天小编为你分享的编程技术是:【PHP与MySQL中的SQL注入式漏洞】,下面是详细的分享!
PHP与MySQL中的SQL注入式漏洞
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? // 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); ?> |
以上所分享的是关于PHP与MySQL中的SQL注入式漏洞,下面是编辑为你推荐的有价值的用户互动:
相关问题:PHP代码网站如何防范SQL注入漏洞攻击建议分享
答:做为网络开发者的你对这种黑客行为恨之入骨,当然也有必要了解一下SQL注入这种功能方式的原理并学会如何通过代码来保护自己的网站数据库。今天就通过PHP和MySQL数据库为例,分享一下我所了解的SQL注入攻击和一些简单的防范措施和一些如何避免SQL... >>详细
相关问题:现今非常流行的SQL(数据库语言)注入攻击属于下列...
答:C。。。。SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问 防止SQL注入攻击 没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看ⅡS日志的习惯,可能被入侵很长时间都不会发觉。但是,SQL注入的手法相... >>详细
相关问题:在确定一个网站的admin.php文件存在SQL注入漏洞,...
答:SQL 语句查询他的数据库管理员的帐号密码,然后通过SQL更改他服务器的系统设置 给自己开一个系统管理员的权限 之后就可以远程登入他的服务器了 之后想干什么 那就看你心情了 嘎嘎 >>详细
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
