ecshop递归过滤get,post函数的程序代码

 更新时间:2016年11月25日 15:21  
我们只要查看开源的程序几乎都会有下面两段差不多相关的代码,代码的功能就是过滤提交数据中的一些特殊字符了,通常是有post与get了,下面来看看吧.
/**

* 递归方式
我们只要查看开源的程序几乎都会有下面两段差不多相关的代码,代码的功能就是过滤提交数据中的一些特殊字符了,通常是有post与get了,下面来看看吧.

 

/**
 * 递归方式的对变量中的特殊字符进行转义
 *
 * @access  public
 * @param   mix     $value
 *
 * @return  mix
 */
function addslashes_deep($value)
{
    if (empty($value))
    {
        return $value;
    }
    else
    {
        return is_array($value) ? array_map('addslashes_deep', $value) : addslashes($value);
    }
}

使用:

/* 对用户传入的变量进行转义操作。*/
if (!get_magic_quotes_gpc())
{
    if (!empty($_GET))
    {
        $_GET  = addslashes_deep($_GET);
    }
    if (!empty($_POST))
    {
        $_POST = addslashes_deep($_POST);
    }
 
    $_COOKIE   = addslashes_deep($_COOKIE);
    $_REQUEST  = addslashes_deep($_REQUEST);
}

验证码通常是用来安全保证我们网站注册或登录不被注入的,但为了更安全我们通常会生成一些混合验证码了,下面一起来看看例子.

在我们开发登录模块或者是论坛的灌水模块的时候,为了防止恶意提交,需要用到验证码。验证码就是用来区分人和机器的一种手段,当然这种手段不是万无一失,但总归会起到一些作用。

验证码的实现需要GD库的支持,没有开启GD库的童鞋需开启GD库。

其实验证码的制作和使用非常的简单,仅仅只是需要4个步骤就可以搞定:创建验证码底图,显示验证码内容,增加干扰元素,输出验证码。下面我们来进行步骤拆分:

第一步:创建验证码底图

$image = imagecreatetruecolor(100, 30); // 创建一个宽为 100 高为 30 的底图  该底图的背景色 为黑色  是系统定义的
$bgcolor = imagecolorallocate($image, 255, 255, 255);   // 为上面创建的底图分配 白色的背景颜色
imagefill($image, 0, 0, $bgcolor);  // 填充白色背景色


第二步:显示验证码内容

// 输出验证码内容
for ($i=0; $i < 4; $i++) {
    $fontsize = 6;
    $fontcolor = imagecolorallocate($image, rand(0,120), rand(0,120), rand(0,120));
    $data = 'qwertyuipkjhgfdsazxcvbnm23456789';
    $content = substr($data, rand(0, strlen($data)), 1);

    $x = ($i*100/4) + rand(5,9); 
    $y = rand(5,10);
    imagestring($image, $fontsize, $x, $y, $content, $fontcolor);  //在图像上水平输出一行字符串
}


第三步:增加干扰元素

// 增加干扰点元素
for ($i=0; $i < 300; $i++) {
    $pointcolor = imagecolorallocate($image, rand(50,200), rand(50,200), rand(50,200));
    imagesetpixel($image, rand(0,99), rand(0,29), $pointcolor);
}

// 增加干扰线元素   线 和 点 的颜色一定要控制好  要比验证码数字的颜色浅  避免出现验证码数字看不见的现象
for ($i=0; $i < 4; $i++) {
    $linecolor = imagecolorallocate($image, rand(100,240), rand(100,240), rand(100,240));
    imageline($image, rand(0,99), rand(0,29), rand(0,99), rand(0,29), $linecolor);
}

第四步:输出验证码

// 输出创建的图像   在输出图像之前 必须输出头信息  用来规定输出的图像类型
header("Content-Type: image/png");
imagepng($image);

// 销毁图像
imagedestroy($image);


至此,一个简单的验证码就实现了,关于实现验证码的注意事项已经写在了注释里。

使用验证码的时候,我们一般都需要用session来保存以便验证,在这里就不作详细介绍。

AES加密是一个非常高级的加密了,听很多人说要破解AES加密是非常的困难了,下文小编来为各位整理一个使用AES加密算法加密数据的例子。

在研究Discuz 的时候,发现Discuz有一套相当完美的加密算法(相对而言)。这个算法可以将数据加密后,储存起来,到需要用的时候,用之前加密的秘钥将之还原。

除了这个之外,还有AES这个算法能够将数据很好的加密起来,在传输过程中不容易被破解。

在PHP中,我们必须先安装好mcrypt这个模块,并且添加相应版本的扩展到php中,详情可以看 不重新编译PHP安装Mcrypt扩展

AES加密模式和填充方式有以下之中,但不是全部

算法/模式/填充                16字节加密后数据长度        不满16字节加密后长度
AES/CBC/NoPadding             16                          不支持
AES/CBC/PKCS5Padding          32                          16
AES/CBC/ISO10126Padding       32                          16
AES/CFB/NoPadding             16                          原始数据长度
AES/CFB/PKCS5Padding          32                          16
AES/CFB/ISO10126Padding       32                          16
AES/ECB/NoPadding             16                          不支持
AES/ECB/PKCS5Padding          32                          16
AES/ECB/ISO10126Padding       32                          16
AES/OFB/NoPadding             16                          原始数据长度
AES/OFB/PKCS5Padding          32                          16
AES/OFB/ISO10126Padding       32                          16
AES/PCBC/NoPadding            16                          不支持
AES/PCBC/PKCS5Padding         32                          16
AES/PCBC/ISO10126Padding      32                          16

下面就是在PHP中使用AES对数据加密

AES-CBC 加密方案

 代码如下 复制代码

<?php
$privateKey = "1234567812345678";
$iv = "1234567812345678";
$data = "Test String";

//加密
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $privateKey, $data, MCRYPT_MODE_CBC, $iv);
echo(base64_encode($encrypted));
echo '<br/>';

//解密
$encryptedData = base64_decode("2fbwW9+8vPId2/foafZq6Q==");
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $privateKey, $encryptedData, MCRYPT_MODE_CBC, $iv);
echo($decrypted);
?>

AES-ECB加密方案

 代码如下 复制代码

<?php 
//加密   
$key = '1234567890123456';   
$content = 'hello';   
$padkey = pad2Length($key,16);   
$cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');   
$iv_size = mcrypt_enc_get_iv_size($cipher);   
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); #IV自动生成?   
echo '自动生成iv的长度:'.strlen($iv).'位:'.bin2hex($iv).'<br>';   
if (mcrypt_generic_init($cipher, pad2Length($key,16), $iv) != -1)   
{   
   // PHP pads with NULL bytes if $content is not a multiple of the block size..   
   $cipherText = mcrypt_generic($cipher,pad2Length($content,16) );   
   mcrypt_generic_deinit($cipher);   
   mcrypt_module_close($cipher);   
    
   // Display the result in hex.   
   printf("128-bit encrypted result:n%snn",bin2hex($cipherText));   
   print("<br />");   
    
}   
//解密   
$mw = bin2hex($cipherText);   
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');   
if (mcrypt_generic_init($td, $padkey, $iv) != -1)   
{   
   $p_t = mdecrypt_generic($td, hexToStr($mw));   
   mcrypt_generic_deinit($td);   
   mcrypt_module_close($td);   
    
   $p_t = trimEnd($p_t);   
   echo '解密:';   
   print($p_t);   
   print("<br />");   
   print(bin2hex($p_t));   
   echo '<br><br>';   
}   
//将$text补足$padlen倍数的长度   
function pad2Length($text, $padlen){   
   $len = strlen($text)%$padlen;   
   $res = $text;   
   $span = $padlen-$len;   
   for($i=0; $i<$span; $i++){   
       $res .= chr($span);   
   }   
   return $res;   
}   
//将解密后多余的长度去掉(因为在加密的时候 补充长度满足block_size的长度)   
function trimEnd($text){   
   $len = strlen($text);   
   $c = $text[$len-1];   
   if(ord($c) <$len){   
       for($i=$len-ord($c); $i<$len; $i++){   
           if($text[$i] != $c){   
               return $text;   
           }   
       }   
       return substr($text, 0, $len-ord($c));   
   }   
   return $text;   
}   
//16进制的转为2进制字符串   
function hexToStr($hex)   
{   
   $bin="";   
   for($i=0; $i<strlen($hex)-1; $i+=2)   
   {   
       $bin.=chr(hexdec($hex[$i].$hex[$i+1]));   
   }   
   return $bin;   
}   

AES-ECB加密方案

 代码如下 复制代码

<?php       
$key = '1234567890123456';   
$key = pad2Length($key,16);   
$iv = 'asdff';   
$content = 'hello';   
$content = pad2Length($content,16);   
$AESed =  bin2hex( mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$key,$content,MCRYPT_MODE_ECB,$iv) ); #加密   
echo "128-bit encrypted result:".$AESed.'<br>';   
$jiemi = mcrypt_decrypt(MCRYPT_RIJNDAEL_128,$key,hexToStr($AESed),MCRYPT_MODE_ECB,$iv); #解密   
echo '解密:';   
echo trimEnd($jiemi);     
?> 

以上只是我列出的简单的3种加密方法,事实上还有很多中方法,需要我们不断的学习。密码学的道路还任重而道远

EVAl函数是一个非常强大的可以直接执行用户提交的php代码了,同时此函数也给黑客常利用到了,所以很多站长都想去禁止此函数,但小编搜索后发现很多朋友对于PHP禁用EVAL函数有错误的理解了,下面小编为各位纠证一下。

val()针对php安全来说具有很大的杀伤力 一般不用的情况下 为了防止<?php eval($_POST[cmd]);?> 这样的小马砸门 需要禁止掉的

网上好多说使用disable_functions禁止掉eval 是错误的

其实eval() 是无法用php.ini中的disable_functions禁止掉的  because eval() is a language construct and not a function

eval是zend的 不是PHP_FUNCTION 函数;

php怎么禁止eval:

如果想禁掉eval 可以用 php的扩展 Suhosin

安装Suhosin后在

php.ini 中load进来Suhosin.so 加上suhosin.executor.disable_eval = on即可

linux中suhosin安装方法

 代码如下 复制代码

# cd /usr/local/src
# wget http://cn.php.net/get/php-5.2.5.tar.gz/from/this/mirror
wget http://www.hardened-php.net/suhosin/_media/suhosin-patch-5.2.5-0.9.6.2.patch.gz //从官方下载补丁
# tar zxvf php-5.2.5.tar.gz
# gunzip suhosin-patch-5.2.5-0.9.6.2.patch.gz // 解压补丁
# cd php-5.2.5
# patch -p 1 -i ../suhosin-patch-5.2.5-0.9.6.2.patch // 给php打上补丁
# ./buildconf --force //一定要执行这一步。
# CHOST="i686-pc-linux-gnu" CFLAGS="-O3 -msse2 -mmmx -mfpmath=sse -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" CXXFLAGS="-O3 -msse2 -mmmx -mfpmath=sse -funroll-loops -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs --with-zlib-dir --with-bz2 --with-tiff-dir --with-libxml-dir=/usr/local/libxml2 --with-gd=/usr/local/gd2 --with-freetype-dir --with-jpeg-dir --with-png-dir --with-ttf --enable-mbstring --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-config-file-path=/etc --with-iconv --disable-ipv6 --enable-static --enable-maintainer-zts --enable-memory-limit --enable-zend-multibyte --enable-sockets --enable-soap --enable-suhosin // 配置选项
# make
# make install
重启apachectl,查看phpinfo信息,会出现
This server is protected with the Suhosin Patch 0.9.6.2
Copyright (c) 2006 Hardened-PHP Project
等许多Suhosin信息那么你就成功了。呵呵。
在这里也顺便说一下将suhosin安装成为php的动态扩展的方法。
wget http://download.suhosin.org/suhosin-0.9.23.tgz
tar zxvfsuhosin-0.9.23.tgz
cd suhosin-0.9.23
/usr/local/php/bin/phpize //这一步不能省
./configure --with-php-config=/usr/local/php/bin/php-config //必须在这儿注明php-config所在的绝对路径。
make
make install
会提示编译的模块存在的目录,记住它。
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/
然后在php.ini中增加一行下列语句。
extension=suhosin.so
suhosin.executor.disable_eval = on

如果对于部分业务需要运行eval咋办?如果是 PHP 5.3+ 且 CGI/FastCGI 方式运行,可以这么改 php.ini,则可以破例使用  eval

操作方法:

 代码如下 复制代码

suhosin.executor.disable_eval = on
[PATH=/htdocs/www/ex1/]
suhosin.executor.disable_eval = off

最后重启php-fpm 即可!

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
}

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;
}
}
//验证开始
foreach($ArrPostAndGet as $key=>$value){
if (FunStringExist($value,$ArrFiltrate)){
echo “alert(/”Neeao提示,非法字符/”);”;
if (empty($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不考虑连接的当前字符集。

相关文章

  • Java 数组内置函数toArray详解

    这篇文章主要介绍了Java 数组内置函数toArray详解,文本详细的讲解了toArray底层的代码和文档,需要的朋友可以参考下...2021-06-29
  • 详解python代码模块化

    今天给大家带来的是关于Python的相关知识,文章围绕着python代码模块化展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下...2021-06-17
  • 详解Python函数print用法

    今天给大家带来的是关于Python的相关知识,文章围绕着Python print函数的用法展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下...2021-06-18
  • 一文秒懂python正则表达式常用函数

    这篇文章主要介绍了python正则表达式常用函数及使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-07
  • OpenCV-Python实现通用形态学函数

    本文将结合实例代码,介绍OpenCV-Python实现通用形态学函数,包含开运算,闭运算等复杂的形态学运算,需要的朋友们下面随着小编来一起学习学习吧...2021-06-11
  • Python常用的正则表达式处理函数详解

    这篇文章主要介绍了Python常用的正则表达式处理函数,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-07
  • pycharm 如何查看某一函数源码的快捷键

    这篇文章主要介绍了在pycharm中实现查看某一函数源码的快捷键,具有很好的参考价值,希望能给大家做个参考,如有错误或未考虑完全的地方,望不吝赐教...2021-05-13
  • Python基础之函数嵌套知识总结

    今天带大家回顾python基础知识,文中对Python函数嵌套作了非常详细的知识总结,对正在学习python基础的小伙伴们很有帮助,需要的朋友可以参考下...2021-05-23
  • python 定义函数 返回值只取其中一个的实现

    这篇文章主要介绍了python 定义函数 返回值只取其中一个的实现操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-05-22
  • python基础入门之普通操作与函数(三)

    这篇文章主要介绍了python基础入门之普通操作与函数...2021-06-13
  • Python基础学习之简单理解函数

    学了函数才算是能推动python的门了,今天就带大家了解一下函数的相关知识,文中有非常详细的介绍,需要的朋友可以参考下...2021-06-06
  • 关于JavaScript回调函数的深入理解

    由于函数是一等对象,我们可以把一个函数作为参数传递给另一个函数,然后在那个函数内执行,至也可以被那个函数返回,然后再执行,这篇文章主要给大家介绍了关于JavaScript回调函数的深入理解,需要的朋友可以参考下...2021-06-27
  • pytorch自定义不可导激活函数的操作

    这篇文章主要介绍了pytorch自定义不可导激活函数的操作,具有很好的参考价值,希望大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-06
  • vue使用节流函数的踩坑实例指南

    防抖和节流的目的都是为了减少不必要的计算,下面这篇文章主要给大家介绍了关于vue使用节流函数踩坑的相关资料,需要的朋友可以参考下...2021-05-20
  • Python max函数中key的用法及原理解析

    最近有童鞋向小编求助怎么样找到字符串中出现字数最多的字符呢,其实最简单的处理方法是使用max函数,max()函数用于获得给定的可迭代对象中的最大值,关于Python max函数key用法跟随小编一起通过本文学习下吧...2021-06-26
  • MySQL中日期型单行函数代码详解

    这篇文章给大家介绍MySQL中日期型单行函数的相关知识,包括返回当前日期时精确到日、秒的参考代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧...2021-06-21
  • Runnable.com 在线测试代码片

    Runnable是一个代码片段集合网站,通过它你不仅可以搜索代码,还可以编辑、运行这些代码,确保它们的正确性与可用性,大大简化了查找和测试代码片段的流程...2013-10-10