PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】


Posted in PHP onJuly 21, 2017

本文实例讲述了PHP实现表单提交数据的验证处理功能。分享给大家供大家参考,具体如下:

防XSS攻击代码:

/**
 * 安全过滤函数
 *
 * @param $string
 * @return string
 */
function safe_replace($string) {
 $string = str_replace('%20','',$string);
 $string = str_replace('%27','',$string);
 $string = str_replace('%2527','',$string);
 $string = str_replace('*','',$string);
 $string = str_replace('"','"',$string);
 $string = str_replace("'",'',$string);
 $string = str_replace('"','',$string);
 $string = str_replace(';','',$string);
 $string = str_replace('<','<',$string);
 $string = str_replace('>','>',$string);
 $string = str_replace("{",'',$string);
 $string = str_replace('}','',$string);
 $string = str_replace('\\','',$string);
 return $string;
}

代码实例:

<?php
$user_name = strim($_REQUEST['user_name']);
function strim($str)
{
 //trim() 函数移除字符串两侧的空白字符或其他预定义字符。
 //htmlspecialchars() 函数把预定义的字符转换为 HTML 实体(防xss攻击)。
 //预定义的字符是:
 //& (和号)成为 &
 //" (双引号)成为 "
 //' (单引号)成为 '
 //< (小于)成为 <
 //> (大于)成为 >
 return quotes(htmlspecialchars(trim($str)));
}
//防sql注入
function quotes($content)
{
 //if $content is an array
 if (is_array($content))
 {
  foreach ($content as $key=>$value)
  {
   //$content[$key] = mysql_real_escape_string($value);
   /*addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。
   预定义字符是:
   单引号(')
   双引号(")
   反斜杠(\)
   NULL */
   $content[$key] = addslashes($value);
  }
 } else
 {
  //if $content is not an array
  //$content=mysql_real_escape_string($content);
  $content=addslashes($content);
 }
 return $content;
}
?>
//过滤sql注入
function filter_injection(&$request)
{
 $pattern = "/(select[\s])|(insert[\s])|(update[\s])|(delete[\s])|(from[\s])|(where[\s])/i";
 foreach($request as $k=>$v)
 {
    if(preg_match($pattern,$k,$match))
    {
      die("SQL Injection denied!");
    }
    if(is_array($v))
    {
     filter_injection($request[$k]);
    }
    else
    {
     if(preg_match($pattern,$v,$match))
     {
      die("SQL Injection denied!");
     }
    }
 }
}

防sql注入:

mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。

下列字符受影响:

\x00
\n
\r
'

\x1a

如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。

语法

mysql_real_escape_string(string,connection)

参数 描述
string 必需。 规定要转义的字符串。
connection 可选。 规定 MySQL 连接。如果未规定,则使用上一个连接。

对于纯数字或数字型字符串的校验可以用

is_numeric()检测变量是否为数字或数字字符串

实例:

<?php 
function get_numeric($val) { 
 if (is_numeric($val)) { 
 return $val + 0; 
 } 
 return 0; 
} 
?>

is_array — 检测变量是否是数组
bool is_array ( mixed $var )
如果 var 是 array,则返回 TRUE,否则返回 FALSE。

is_dir 判断给定文件名是否是一个目录
bool is_dir ( string $filename )
判断给定文件名是否是一个目录。
如果文件名存在,并且是个目录,返回 TRUE,否则返回FALSE。

is_file — 判断给定文件名是否为一个正常的文件
bool is_file ( string $filename )
判断给定文件名是否为一个正常的文件。
如果文件存在且为正常的文件则返回 TRUE,否则返回 FALSE。
Note:
因为 PHP 的整数类型是有符号整型而且很多平台使用 32 位整型,对 2GB 以上的文件,一些文件系统函数可能返回无法预期的结果 。

is_bool — 检测变量是否是布尔型
bool is_bool ( mixed $var )
如果 var 是 boolean 则返回 TRUE。

is_string — 检测变量是否是字符串
bool is_string ( mixed $var )
如果 var 是 string 则返回 TRUE,否则返回 FALSE。

is_int — 检测变量是否是整数
bool is_int ( mixed $var )
如果 var 是 integer 则返回 TRUE,否则返回 FALSE。
Note:
若想测试一个变量是否是数字或数字字符串(如表单输入,它们通常为字符串),必须使用 is_numeric()。

is_float — 检测变量是否是浮点型
bool is_float ( mixed $var )
如果 var 是 float 则返回 TRUE,否则返回 FALSE。
Note:
若想测试一个变量是否是数字或数字字符串(如表单输入,它们通常为字符串),必须使用 is_numeric()。

is_null — 检测变量是否为 NULL
bool is_null ( mixed $var )
如果 var 是 null 则返回 TRUE,否则返回 FALSE。

is_readable — 判断给定文件名是否可读
bool is_readable ( string $filename )
判断给定文件名是否存在并且可读。如果由 filename 指定的文件或目录存在并且可读则返回 TRUE,否则返回 FALSE。

is_writable — 判断给定的文件名是否可写
bool is_writable ( string $filename )
如果文件存在并且可写则返回 TRUE。filename 参数可以是一个允许进行是否可写检查的目录名。

file_exists — 检查文件或目录是否存在
bool file_exists ( string $filename )
检查文件或目录是否存在。
在 Windows 中要用 //computername/share/filename 或者 \computername\share\filename 来检查网络中的共享文件。
如果由 filename 指定的文件或目录存在则返回 TRUE,否则返回 FALSE。

is_executable — 判断给定文件名是否可执行
bool is_executable ( string $filename )
判断给定文件名是否可执行。如果文件存在且可执行则返回 TRUE,错误时返回FALSE。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP调用三种数据库的方法(2)
Oct 09 PHP
PHP 数组教程 定义数组
Oct 23 PHP
PHP 多维数组的排序问题 根据二维数组中某个项排序
Nov 09 PHP
php中http_build_query 的一个问题
Mar 25 PHP
PHP容易忘记的知识点分享
Apr 30 PHP
CURL的学习和应用(附多线程实现)
Jun 03 PHP
php获取字段名示例分享
Mar 03 PHP
php 判断网页是否是utf8编码的方法
Jun 06 PHP
Codeigniter中mkdir创建目录遇到权限问题和解决方法
Jul 25 PHP
PHP中抽象类和抽象方法概念与用法分析
May 24 PHP
php判断手机浏览还是web浏览,并执行相应的动作简单实例
Jul 28 PHP
Laravel 实现关系模型取出需要的字段
Oct 10 PHP
php实现基于pdo的事务处理方法示例
Jul 21 #PHP
php基于自定义函数记录log日志方法
Jul 21 #PHP
解决form中action属性后面?传递参数 获取不到的问题
Jul 21 #PHP
PHP实现的redis主从数据库状态检测功能示例
Jul 20 #PHP
PHP实现的mysql主从数据库状态检测功能示例
Jul 20 #PHP
php检测mysql表是否存在的方法小结
Jul 20 #PHP
Laravel接收前端ajax传来的数据的实例代码
Jul 20 #PHP
You might like
PHP数组无限分级数据的层级化处理代码
2012/12/29 PHP
怎样使用php与jquery设置和读取cookies
2013/08/08 PHP
PHP+shell实现多线程的方法
2015/07/01 PHP
PHP HTTP 认证实例详解
2016/11/03 PHP
Yii框架模拟组件调用注入示例
2019/11/11 PHP
潜说js对象和数组
2011/05/25 Javascript
AngularJS HTML编译器介绍
2014/12/06 Javascript
JavaScript中switch语句的用法详解
2015/06/03 Javascript
Jqgrid之强大的表格插件应用
2015/12/02 Javascript
微信小程序 选项卡的简单实例
2017/05/24 Javascript
详解利用jsx写vue组件的方法示例
2017/07/17 Javascript
vue.js 使用axios实现下载功能的示例
2018/03/05 Javascript
QQ跳转支付宝并自动领红包脚本(最新)
2018/06/22 Javascript
详解webpack2异步加载套路
2018/09/14 Javascript
WebGL three.js学习笔记之阴影与实现物体的动画效果
2019/04/25 Javascript
layui实现tab的添加拒绝重复的方法
2019/09/04 Javascript
jquery将信息遍历到界面上实例代码
2020/01/21 jQuery
js实现聊天对话框
2020/02/08 Javascript
微信小程序webSocket的使用方法
2020/02/20 Javascript
[27:08]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第二场 11.21
2020/11/23 DOTA
Python利用字典将两个通讯录文本合并为一个文本实例
2018/01/16 Python
python使用sqlite3时游标使用方法
2018/03/13 Python
selenium使用chrome浏览器测试(附chromedriver与chrome的对应关系表)
2018/11/29 Python
Python3 关于pycharm自动导入包快捷设置的方法
2019/01/16 Python
Python使用线程来接收串口数据的示例
2019/07/02 Python
Python3读取和写入excel表格数据的示例代码
2020/06/09 Python
python 实现音频叠加的示例
2020/10/29 Python
详解canvas在圆弧周围绘制文本的两种写法
2018/05/22 HTML / CSS
一名女生的自荐信
2013/12/08 职场文书
毕业典礼主持词大全
2014/03/26 职场文书
2014县政府领导班子三严三实对照检查材料思想汇报
2014/09/26 职场文书
离婚起诉书范本
2015/05/18 职场文书
一封真诚的自荐信帮你赢得机会
2019/05/07 职场文书
2019中秋节祝福语大全,提前收藏啦
2019/09/10 职场文书
MySQL update set 和 and的区别
2021/05/08 MySQL
nginx设置资源请求目录的方式详解
2022/05/30 Servers