php 防止SQL注入的几种方法
发布:smiling 来源: PHP粉丝网 添加日期:2015-04-13 11:26:58 浏览: 评论:0
SQL注入是可以通过一些sql语法上的处理不当导致数据库或网站权限给你拿到了,今天小编整理了一些常用的php mysql中的SQL注入防范方法吧.
使用php5.3或以上的版本我们可以直接使用PDO与mysqli处理数据
1.使用PDO(PHP Data Objects),代码如下:
- $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
- $stmt->execute(array(':name' => $name));
- foreach ($stmt as $row) {
- // do something with $row
- }
2.使用mysqli,代码如下:
- $stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
- $stmt->bind_param('s', $name);
- $stmt->execute();
- $result = $stmt->get_result();
- while ($row = $result->fetch_assoc()) {
- // do something with $row
- } //开源软件:phpfensi.com
3.如果是php5.3以下版本我们可以使用ADDSLASHES和MYSQL_REAL_ESCAPE_STRING这些函数来处理,代码如下:
- function get_str($string)
- {
- if (!get_magic_quotes_gpc())
- {
- return addslashes($string);
- }
- return $string;
- }
国内很多PHP coder仍在依靠addslashes防止SQL注入(包括我在内),我还是建议大家加强中文防止SQL注入的检查,addslashes的问题在于可以用0xbf27来代替单引号,而addslashes只是将0xbf27修改为0xbf5c27,成为一个有效的多字节字符,其中的0xbf5c仍会被看作是单引号,所以addslashes无法成功拦截.
当然addslashes也不是毫无用处,它是用于单字节字符串的处理,多字节字符还是用mysql_real_escape_string吧.
最好对magic_quotes_gpc已经开放的情况下,还是对$_POST[‘lastname’]进行检查一下.
再说下mysql_real_escape_string和mysql_escape_string这2个函数的区别:
mysql_real_escape_string 必须在(PHP 4 >= 4.3.0, PHP 5)的情况下才能使用,否则只能用 mysql_escape_string,两者的区别是:
mysql_real_escape_string 考虑到连接的当前字符集,而mysql_escape_string 不考虑.
如果是字符型就用addslashes()过滤一下,然后再过滤”%”和”_”,代码如下:
- $search=addslashes($search);
- $search=str_replace(“_”,”\_”,$search);
- $search=str_replace(“%”,”\%”,$search);
当然也可以加php通用防注入代码:
- /*************************
- PHP通用防注入安全代码
- 说明:
- 判断传递的变量中是否含有非法字符
- 如$_POST、$_GET
- 功能:
- 防注入
- **************************/
- //要过滤的非法字符
- $ArrFiltrate=array(”‘”,”;”,”union”);
- //出错后要跳转的url,不填则默认前一页
- $StrGoUrl=”";
- //是否存在数组中的值
- function FunStringExist($StrFiltrate,$ArrFiltrate){
- foreach ($ArrFiltrate as $key=>$value){
- if (eregi($value,$StrFiltrate)){
- return true;
- }
- }
- return false;
- }
- //合并$_POST 和 $_GET
- if(function_exists(array_merge)){
- $ArrPostAndGet=array_merge($HTTP_POST_VARS,$HTTP_GET_VARS);
- }else{
- foreach($HTTP_POST_VARS as $key=>$value){
- $ArrPostAndGet[]=$value;
- }
- foreach($HTTP_GET_VARS as $key=>$value){
- $ArrPostAndGet[]=$value;
- } //开源软件:phpfensi.com
- }
- //验证开始
- foreach($ArrPostAndGet as $key=>$value){
- if (FunStringExist($value,$ArrFiltrate)){
- echo “alert(/”Neeao提示,非法字符/”);”;
- if (emptyempty($StrGoUrl)){
- echo “history.go(-1);”;
- }else{
- echo “window.location=/”".$StrGoUrl.”/”;”;
- }
- exit;
- }
- }
保存为checkpostandget.php
然后在每个php文件前加include(“checkpostandget.php“);即可
总结一下:
addslashes() 是强行加.
mysql_real_escape_string() 会判断字符集,但是对PHP版本有要求.
mysql_escape_string不考虑连接的当前字符集.
Tags: php防止SQL SQL注入
- 上一篇:PHP禁用EVAL的错误理解
- 下一篇:Php中过滤表单提交的html标签
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)