php 一些基本安全处理技巧

 更新时间:2016年11月25日 15:25  点击:1889

对于一些常见的输出目标(包括客户端、数据库教程和URL)的转义,PHP 中有内置函数可用。
如果你要写一个自己算法,做到万无一失很重要。需要找到在外系统中特殊字符的可靠和完整的列表,以及它们的表示方式,这样数据是被保留下来而不是转译了。
最常见的输出目标是客户机,使用htmlentities( )在数据发出前进行转义是最好的方法。与其它字符串函数一样,它输入是一个字符串,对其进行加工后进行输出。但是使用htmlentities( )函数的最佳方式是指定它的两个可选参数:引号的转义方式(第二参数)及字符集(第三参数)。引号的转义方式应该指定为ENT_QUOTES,它的目的是同时转义单引号和双引号,这样做是最彻底的,字符集参数必须与该页面所使用的字符集相必配。
为了区分数据是否已转义,我还是建议定义一个命名机制。对于输出到客户机的转义数据,我使用$html 数组进行存储,该数据首先初始化成一个空数组,对所有已过滤和已转义数据进行保存。

<?php教程
$html = array( );
$html['username'] = htmlentities($clean['username'], ENT_QUOTES, 'UTF-8');
echo "<p>Welcome back, {$html['username']}.</p>";
?>

小提示
htmlspecialchars( )函数与htmlentities( )函数基本相同,它们的参数定义完全相同,只不过是htmlentities( )的转义更为彻底。通过$html['username']把username 输出到客户端,你就可以确保其中的特殊字符不会被浏览
器所错误解释。如果username 只包含字母和数字的话,实际上转义是没有必要的,但是这体现了深度防范的原则。转义任何的输出是一个非常好的习惯,它可以戏剧性地提高你的软件的安全性。
另外一个常见的输出目标是数据库。如果可能的话,你需要对SQL 语句中的数据使用PHP内建函数进行转义。对于MySQL 用户,最好的转义函数是mysql教程_real_escape_string( )。如果你使用的数据库没有PHP 内建转义函数可用的话,addslashes( )是最后的选择。
下面的例子说明了对于MySQL 数据库的正确的转义技巧:

<?php
$mysql = array( );
$mysql['username'] = mysql_real_escape_string($clean['username']);
$sql = "SELECT *
FROM profile
WHERE username = '{$mysql['username']}'";
$result = mysql_query($sql);
?>

我们利用了php教程自带的Magic Quotes来判断是否是开启了,如果是就strips教程lashes否则就用mysql教程_real_escape_string来过滤

//如果Magic Quotes功用启用

if (get_magic_quotes_gpc()) {
$name = stripslashes($name);
}else{
$name = mysql_real_escape_string($name);
}

mysql_query("SELECT * FROM users WHERE name='{$name}'");

注:mysql_real_escape_string函数要等到mysql数据库教程连接成功才有效。

PHP使用eval(gzinflate(str_rot13(base64_decode(‘BASE64加密后内容’))))核心代码的解密
下非扩展方式的php教程加密方法:
这里有个在线的,还不错。木马防杀还行,要保护代码可就不行了。
对应的写了一个简单的解密的,
专门针对eval。这个原理很有用途。
特别说明:此解密程序好像一定得在PHP5上面使用,
我在PHP4上面测试eval(gzinflate(str_rot13(base64_decode(‘BASE64加密后内容’))))内加密的代码始终无法正常解密.

<?php
//已经加密的文件内容
$a=”eval(gzinflate(str_rot13(base64_decode(‘这里面放BASE64代码’))));”;
function decodephp($a) {
$max_level=300; //最大层数
for($i=0;$i<$max_level;$i++) {
ob_start();
eval(str_replace(‘eval’,'echo’,$a));
$a = ob_get_clean();
if(strpos($a,’eval(gzinflate(str_rot13(base64_decode’)===false) {
return $a;
}
}
}
echo decodephp($a);
?>

php使用N层加密eval(gzinflate(base64_decode(“codes”)))的破解
首先申明一下,这个并非是我原创,是我转自一个国外的BLOG上面的.自己测试了下.觉得很好用的.

如果您想看的是PHP使用eval(gzinflate(str_rot13(base64_decode(‘BASE64加密后内容’))))核心代码的解密,请移步这里查看:PHP使用eval(gzinflate(str_rot13(base64_decode(‘BASE64加密后内容’))))核心代码的解密.
特别说明:此解密程序好像一定得在PHP5上面使用,
我在PHP4上面测试eval(gzinflate(base64_decode(“codes”)))内加密的代码始终无法正常解密
以下是代码:

<?php
/*
Taken from [url]http://www.php.net/manual/de/function.eval.php#59862[/url]
Directions:
1. Save this snippet as decrypt.php
2. Save encoded PHP code in coded.txt
3. Create a blank file called decoded.txt (from shell do CHMOD 0666 decoded.txt)
4. Execute this script (visit decrypt.php in a web browser or do php decrypt.php in the shell)
5. Open decoded.txt, the PHP should be decrypted if not post the code on [url]http://www.ariadoss.com/forums/web-development/lamp[/url]

gzinflate执行加密代码的解密方法翻译为中文后的文字(此段汉字原始文件里面可没.嘿)
1. 把这整段脚本保存为decrypt.php
2. 把需要解密的代码保存为coded.txt并且和decrypt.php在同一目录.
3. 创建一个空白文件命名为 decoded.txt (必须把 decoded.txt 的权限设置为CHMOD 0666,也就是可以写入的.当然,你可以不创建文件文件.只要文件夹有写入权限,脚本便会自动创建一个名为decoded.txt的文档. )
4. 运行解密脚本 (浏览器中运行decrypt.php 即访问 http://您的域名/存放目录/decrypt.php)
5. 打开 decoded.txt, 代码应该已经解密完成,如果出现错误请把代码发送到 [url]http://www.ariadoss.com/forums/web-

development/lamp[/url]
*/
echo “nDECODE nested eval(gzinflate()) by DEBO Jurgen <mailto:jurgen@person.benn”;
echo “1. Reading coded.txtn”;
$fp1 = fopen (“coded.txt”, “r”);
$contents = fread ($fp1, filesize (“coded.txt”));
fclose($fp1);
echo “2. Decodingn”;
while (preg_match(“/eval(gzinflate/”,$contents)) {
$contents=preg_replace(“/<?|?>/”, “”, $contents); eval(preg_replace(“/eval/”, “$contents=”, $contents)); } echo “3. Writing decoded.txtn”; $fp2 = fopen(“decoded.txt”,”w”); fwrite($fp2, trim($contents)); fclose($fp2);
?>

再简单的说下gzinflate,eval(gzinflate(base64_decode(“codes”)));decoding-eval-gzinflate-base64_decode的使用方法.
保存上面的程序文件decrypt.php,
当然文件名可以自己设置.
在此文件的同一目录建立一个coded.txt,
这个里面放的是加密过的代码,也就是eval(gzinflate(base64_decode(“codes”)))当中的codes;
再说明白点就是是要解密的eval(gzinflate(base64_decode(“codes”)))里面执行的密原文.
执行保存过的文件decrypt.php,这样便会在同一目录生成一个decoded.txt的txt文档,
打开此文档.里面就是那些被加密的原始代码.

获取会话ID的方式很多,攻击者可以通过查看明文通信来获取,所以把会话ID放在URL中或者放在通过未加密连接传输的Cookie中是很危险的;还有在URL中(作为_get()参数)传递会话ID也是不安全的,因为浏览器历史缓存中会存储URL,这样就很容易被读取。(可以考虑使用ssh进行加密传输)

主要的安全措施有以下两个方面。

1、防止攻击者获取用户的会话ID。

还有一种更为隐蔽的攻击手段,攻击者通过一个被脚本攻击突破的Web站点,把被突破的这个站点上的用户重新定向到另一个站点,然后在重新定向的站点的URL中插入以下代码:
?PHPSESSID=213456465412312365465412312;

最后发送到Web应用程序。当用户查看Web应用程序时,PHP会发现没有与这个会话ID相关联的数据并且会创建一些数据。用户不知道发生了什么,但攻击者却知道了会话ID,就可以利用这个会话ID进入应用程序。

要防止这种攻击,有两种方法。
(1)检查php教程.ini中是否打开了session.use_only_cookie。如果是这种情况,PHP会拒绝基于URL的会话ID。
(2)当启动会话时,在会话数据中放一个变量,这个变量表示会话是用户创建的;如果发现会话数据中没有这个变量,那就说明会话ID是假的,就可以调用session_regenerate_id函数,给现有会话分配一个新的会话ID。

示例:

通过判断变量是否存在来确定会话ID的真假,如果存在,则说明会话ID是真的,否则是假的,并使用session_regenerate_id()函数对会话ID进行更改,重新给会话创建一个新的会话ID,

代码如下:
复制代码 代码如下:

< ?php
session_start () ;
if (!isset ( $_SESSION['shili1'] )) { //判断shili1变量是否配置
$old_id = session_id () ; //原来的会话ID的变量名
session_regenerate_id () ; //获取一个新的会话ID
$new_id = session_id () ; //新的会话ID的变量名
echo "old : $old_id<br/>" ; //输出原来的会话ID
echo "new : $new_id<br/>" ; //输出新的会话ID
$_SESSION['shili1'] = TRUE ; }
?>

运行结果如图所示:

这只是一个示例,输出会话ID是为了更好的理解和应用这个函数,而在程序设计中是不需要输出会话ID的。

2、限制攻击者获取会话ID。

限制攻击者获取会话ID的方法如下。
(1)使用一个函数(md5)计算User-Agent头加上某些附加字符串数据后的散列值(hash)。(散列函数(hash function)接受一个任意大的数据集,并且将它转换为一个看起来完全不同的数据,这个数据很短。产生的散列值是完全不可重现的,也不可能由另一个输入产生。)

在User-Agent字符串后面添加一些数据,攻击者就无法通过对常见的代理值计算md5编码来试探User-Agent字符串。

(2)将这个经过编码的字符串保存在用户的会话数据中。
(3)每次从这个用户接收到请求时,检查这个散列值。

此方案的代码如下:
复制代码 代码如下:

<?php
define ( ‘ua_seed','webapp' ) ;
session_start () ;
if ( !isset($_SESSION['user_agent'] )){
$_SESSION['user_agent'] = md5 ( $_SERVER['HTTP_USER_AGENT'].ua_seed );
}else{
if ($_SESSION['user_agent'] != md5($_SERVER['HTTP_USER_AGENT'].ua_seed)){} }
?>

通过给攻击者制造一些麻烦,使攻击者即使获取了会话ID,也无法进行破坏,能够减少对系统造成的损失

session 跟踪,可以很方便地避免上述情况的发生:

<?php教程
session_start();
$clean = array();
$email_pattern = '/^[^@s<&>]+@([-a-z0-9]+.)+[a-z]{2,}$/i';
if (preg_match($email_pattern, $_POST['email']))
{
$clean['email'] = $_POST['email'];
$user = $_SESSION['user'];
$new_password = md5(uniqid(rand(), TRUE));
if ($_SESSION['verified'])
{
/* Update Password */
mail($clean['email'], 'Your New Password', $new_password);
}
}
?>

http://example.org/reset.php?user=php&email=chris%40example.org

如果reset.php 信任了用户提供的这些信息,这就是一个语义URL 攻击漏洞。在此情况下,系统将会为php 帐号产生一个新密码并发送至chris@example.org,这样chris 成功地窃取了php 帐号。

[!--infotagslink--]

相关文章

  • 详解前端安全之JavaScript防http劫持与XSS

    作为前端,一直以来都知道HTTP劫持与XSS跨站脚本、CSRF跨站请求伪造。防御这些劫持最好的方法是从后端入手,前端能做的太少。而且由于源码的暴露,攻击者很容易绕过防御手段。但这不代表我们去了解这块的相关知识是没意义的,本文的许多方法,用在其他方面也是大有作用。...2021-05-24
  • photoshop打开很慢怎么办 ps打开慢的设置技巧

    photoshop软件是一款专业的图像设计软件了,但对电脑的要求也是越高越好的,如果配置一般打开ps会比较慢了,那么photoshop打开很慢怎么办呢,下面来看问题解决办法。 1、...2016-09-14
  • Windows批量搜索并复制/剪切文件的批处理程序实例

    这篇文章主要介绍了Windows批量搜索并复制/剪切文件的批处理程序实例,需要的朋友可以参考下...2020-06-30
  • Jquery Ajax Error 调试错误的技巧

    JQuery使我们在开发Ajax应用程序的时候提高了效率,减少了许多兼容性问题,我们在Ajax项目中,遇到ajax异步获取数据出错怎么办,我们可以通过捕捉error事件来获取出错的信息。在没给大家介绍正文之前先给分享Jquery中AJAX参...2015-11-24
  • BAT批处理判断服务是否正常运行的方法(批处理命令综合应用)

    批处理就是对某对象进行批量的处理,通常被认为是一种简化的脚本语言,它应用于DOS和Windows系统中。这篇文章主要介绍了BAT批处理判断服务是否正常运行(批处理命令综合应用),需要的朋友可以参考下...2020-06-30
  • php语言中使用json的技巧及json的实现代码详解

    目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识...2015-10-30
  • 图解Sublime Text3使用技巧

    通过本篇文章给大家介绍Sublime Text3使用技巧的相关知识,对sublime text3技巧相关知识感兴趣的朋友一起学习吧...2015-12-24
  • PHP file_get_contents设置超时处理方法

    file_get_contents的超时处理话说,从PHP5开始,file_get_content已经支持context了(手册上写着:5.0.0 Added the context support. ),也就是说,从5.0开始,file_get_contents其实也可以POST数据。今天说的这篇是讲超时的,确实在...2013-10-04
  • 基于PHP给大家讲解防刷票的一些技巧

    刷票行为,一直以来都是个难题,无法从根本上防止。但是我们可以尽量减少刷票的伤害,比如:通过人为增加的逻辑限制。基于 PHP,下面介绍防刷票的一些技巧:1、使用CURL进行信息伪造$ch = curl_init(); curl_setopt($ch, CURLOP...2015-11-24
  • C#多线程中的异常处理操作示例

    这篇文章主要介绍了C#多线程中的异常处理操作,涉及C#多线程及异常的捕获、处理等相关操作技巧,需要的朋友可以参考下...2020-06-25
  • postgresql 中的时间处理小技巧(推荐)

    这篇文章主要介绍了postgresql 中的时间处理小技巧(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-29
  • 安全地关闭MySQL服务的教程

    普通关闭 我的mysql是自己下载的tar包,自己设定安装目录来安装的。停止mysql服务,说来简单,但不知道的话,还真是挠头。在这和mysql入门的同学们共享:)正确方法是,进入mysql的bin目录下,然后执行./mysqladmin -uroot -p shut...2015-11-24
  • Python同时处理多个异常的方法

    这篇文章主要介绍了Python同时处理多个异常的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-29
  • C#异常处理中try和catch语句及finally语句的用法示例

    这篇文章主要介绍了C#异常处理中try和catch语句及finally语句的用法示例,finally语句的使用涉及到了C#的垃圾回收特性,需要的朋友可以参考下...2020-06-25
  • 分享12个非常实用的JavaScript小技巧

    这篇文章主要介绍了分享12个非常实用的JavaScript小技巧,这些小技巧可能在你的实际工作中或许能帮助你解决一些问题,需要的朋友可以参考下...2016-05-14
  • Python爬虫必备技巧详细总结

    本篇文章介绍了我在爬虫过程中总结的几个必备技巧,都是经过实验的,通读本篇对大家的学习或工作具有一定的价值,需要的朋友可以参考下...2021-10-22
  • python用moviepy对视频进行简单的处理

    这篇文章主要介绍了python如何用moviepy对视频进行简单的处理,帮助大家更好的利用python处理视频,感兴趣的朋友可以了解下...2021-03-11
  • C#实现线程安全的简易日志记录方法

    这篇文章主要介绍了C#实现线程安全的简易日志记录方法,比较实用的功能,需要的朋友可以参考下...2020-06-25
  • Illustrator像素级完美绘制经验技巧分享

    今天小编在这里就来给Illustrator的这一款软件的使用者们来说一说像素级完美绘制的经验技巧,各位想知道具体信息的使用者们,那么下面就快来跟着小编一起看一看。 给...2016-09-14
  • C#异常处理详解

    这篇文章介绍了C#异常处理,有需要的朋友可以参考一下...2020-06-25