PHP正确使用mysql的方法是什么

2024-10-13 11:25:13

1、关于SQL注入SQLInjection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。在网上可以搜到一些简单例子,通过一步步有目的地调整url请求参数,让server返回其MySQL数据结构及内容,以达到获取敏感数据的目的。

2、防注入的方法开发者要使用合适的数据库操作函数,这一点也是开发手册和教程上很少提到的。举个例子,要实现一个简单的查询功能,一般会这样写:<?php$con=mysql_connect("localhost","mysql_user","mysql_pwd");if(!$con){die('Couldnotconnect:'.mysql_error());}$username=$_POST['user'];$password=$_POST['pwd'];$sql="SELECT*FROMPersonWHEREusername=$usernameANDpassword=$password";mysql_query($sql,$con);//一些代码mysql_close($con);?>这种用法相当不安全,如果被人盯上,会很容易地进行sql注入所以有不少人推荐使用mysql_real_escape_string,写法如下:<?php$con=mysql_connect("localhost","mysql_user","mysql_pwd");if(!$con){die('Couldnotconnect:'.mysql_error());}$username=$_POST['user'];$password=$_POST['pwd'];//如果不是数字则加引号$username="'".mysql_real_escape_string($username)."'";$password="'".mysql_real_escape_string($password)."'";$sql="SELECT*FROMPersonWHEREusername=$usernameANDpassword=$password"mysql_query($sql,$con);//一些代码mysql_close($con);?>这种方法安全性比第一种更高,但对方还是可以利用编码的漏洞来实现输入任意密码就能登录服务器的注入攻击。另外像一些str_replace,addslashes或者使用magic_quotes_gpc选项之类的方法,不是已经失效就是仍然有可能被破解。

3、然而百度一下「PHP防注入」,仍然有很多文章在介绍上述办法。所以我们这里要郑重提示大家这个风险,提醒所有后来者绕过这个坑。那么,如今还能幸免于注入的方法就是PreparedStatement机制了。这里推荐大家使用mysqli方式,mysql扩展已经在php5.5中被废弃,在php7中更是直接不支持。为向高版本兼容考虑,新代码尽量使用mysqli最终的查询代码就变成了这样:<?php$mysqli=newmysqli("localhost","mysql_user","mysql_pwd");if(mysqli_connect_errno()){printf("Connectfailed:%s\n",mysqli_connect_error());exit();}$username=$_POST['user'];$password=$_POST['pwd'];if($stmt=$mysqli->prepare("SELECT*FROMPersonWHEREusername=?ANDpassword=?")){$stmt->bind_param("ss",$username,$password);$stmt->execute();}//一些代码$mysqli->close();?>

猜你喜欢