php字符串插入另一字符串任意位置
原理也非常的简单我们只要指定位置然后遍历字符再判断位置然后把字符分开再把新字符push 进入再组成新的字符即可。
例子
代码如下 | 复制代码 |
$str='字符串'; $AllNum = mb_strlen($str,'gbk').'<br>'; |
例子2
代码如下 | 复制代码 |
<?php |
你会发现, 只要登录的时候勾选上这个框框(ps: 你的提示文字最好使用label+for), 即使你关闭浏览器再重新打开还是"已经登录的状态", 可能你也知道, 大多网站都是用session记录标识, 因为使用cookie记录不太安全, 可以被伪造, 那么session关闭浏览器会清空, 那还乍的记录标识呢? 嘎嘎, 接着往下看
session+cookie验证登录
大概的思路是在登录成功后, 记录session标识, 并根据相关参数写入cookie, 当然不会包含重要信息, 每次用户刷新页面, 会进行session判定, 如果没有, 则进行cookie判定, 如果正确则查库并写入session,大概伪代码是这样的:
每个页面初始化
开启session;
if(session存在){
//已经登录
} else {
if(指定cookie存在){
//解密cookie
if(匹配成功){
//查询数据库
if(有这个用户){
//写入session, 这里是否还用更新cookie信息你说了算
} else {
//假的也想进我的站?
}
} else {
//小样, 还想伪造 cookie? 嘎嘎
}
} else {
//这里认为没有登录
}
}
//这里已经知道用户登录的状态了
登录页面埋点
开启session;
if(各种表单验证通过){
//写入session, 并提取uid,uname等不敏感信息再加自己的密钥生成唯一的token码, 用base64方式写入cookie, 这里为了让重启浏览器或者session过期后使用
}
但是你有没有发现, 如果为一个正常的用户, 在没有登录状态下, 上面初始化代码会在每个页面进行判定, 感觉不太帅, 且可能被别人伪造cookie, 如果站内涉及到$方面的事就更不好了, 于是改之:
session分权限等级方式
我们设置session标识, 0为未登录, 1为已登录, 2为cookie方式登录(这样就可以针对这样的用户进行再次验证), 然后我们需要改我们的伪代码.
页面初始化
开启session;
if(session存在){
if(session > 0){
//如果>0则说明已登录
} else {
//这里说明没有登录, 这个状态码是cookie验证没通过时留下的
}
} else {
//这里验证session不存在, 但可能cookie存在, 所以需要验证
if(cookie存在){
//这里进行解密
if(成功){
//查数据库
if(成功){
//session = 2, 为啥=2? 因为打上标识说明这次的登录方式是使用cookie验证登录的, 以方便在进行安全操作的时候再次验证
} else {
// session = 0
}
} else {
//session = 0
}
} else {
//cookie不存在的话视为没有登录, 这里把session标识 = 0, 以方便下次验证
}
}
登录页面埋点
开启session;
if(各种表单验证通过){
// session = 1, 打上标识说明是正常登录方式, 并生成token存入cookie以便下次使用
}
重要操作时再次验证, 比如: 交易等
开启session;
if(session===2){
//弹出登录层 或者 跳转到登录页面再次验证, 是不是觉得跟taobao.com很像, 嘎嘎
}
致此验证完比, 当然实际使用哪种方式对token进行加密视项目情况而定, 但建议别使用敏感信息, 因为cookie你懂的...
你可能会想到这些问题
问: 清空cookie后这种方式就不行了?
答: 是的, 目前再主流的站, 只要你把缓存清空, 这里缓存包括任何, 比如 cookie, localStorage, sessionStorage, userDB, Web SQL, IndexdDB等, 你再重启浏览器, 我就不信你还是登录状态...(ps: 什么, 真的还是? 请留言反馈给我, 谢谢)
问: 这样岂不是知道cookie就可以直接登录?
答: 理论上是的, 只要用户知道你的加密方式, 写入个cookie理论是ok的, 但重要的地方建议登录再次验证, 当然只能说你点被...
问: 我复制某人的cookie岂不是就直接登录了?
答: 理论上还真是, 这可能就涉及到注入,攻击啥的了, 那如果这样的话, 要不是把浏览器相关信息+系统相关信息也加密到token里啊, 解密的时候再进行浏览器判断... 感觉好复杂啊...
例子代码
代码如下 | 复制代码 |
$login_url = 'http://passport.renren.com/PLogin.do';
$send_url=$info['redirect_url']; $head = array( |
最后就发布成功了,当然前面的数据库大写自己写一个吧,非常的简单的一个记录库也是你要发布的信息哦。
原文来自:http://www.mapenggang.com
在php中利用curl伪造来源IP是非常的方法的,下面来给大家介绍一个php 伪造来源IP的例子,但经过测试不能伪造$_SERVER["REMOTE_ADDR"]的来源。
test.php文件
代码如下 | 复制代码 |
<?php $out = ob_get_contents(); ?> |
test2.php文件代码如下
代码如下 | 复制代码 |
<?php echo "<br />IP: " . getClientIp() . " HTTP_CLIENT_IP-: " . $_SERVER["HTTP_CLIENT_IP"] . " HTTP_X_FORWARDED_FOR-: " . $_SERVER["HTTP_X_FORWARDED_FOR"] . " REMOTE_ADDR-: " . $_SERVER["REMOTE_ADDR"] . " "; |
执行结果:
HTTP/1.1 200 OK
Server: DWS/01.03Z33
Date: Mon, 09 Jun 2014 09:27:09 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
<br />IP: 2.2.2.2 HTTP_CLIENT_IP-: 2.2.2.2 HTTP_X_FORWARDED_FOR-: 1.1.1.1
REMOTE_ADDR-: 127.0.0.1 <br />referer: http://www.111cn.net/
但是暂时还无法伪造骗过:
$_SERVER["REMOTE_ADDR"]。
所以建议大家记录IP时使用$_SERVER["REMOTE_ADDR"]。
本文章以php中serialize() 和 unserialize()函数来引出我们在正常开发应用中对于序列化使用方法与使用序列化时的一些安全问题,希望对各位会带来帮助把复杂的数据类型压缩到一个字符串中
serialize() 把变量和它们的值编码成文本形式
unserialize() 恢复原先变量
eg:
代码如下 | 复制代码 |
$stooges = array('Moe','Larry','Curly'); 结果: |
当把这些序列化的数据放在URL中在页面之间会传递时,需要对这些数据调用urlencode(),以确保在其中的URL元字符进行处理:
代码如下 | 复制代码 |
$shopping = array('Poppy seed bagel' => 2,'Plain Bagel' =>1,'Lox' =>4); echo '<a href="next.php?cart='.urlencode(serialize($shopping)).'">next</a>'; |
margic_quotes_gpc和magic_quotes_runtime配置项的设置会影响传递到unserialize()中的数据。
如果magic_quotes_gpc项是启用的,那么在URL、POST变量以及cookies中传递的数据在反序列化之前必须用stripslashes()进行处理:
代码如下 | 复制代码 |
$new_cart = unserialize(stripslashes($cart)); //如果magic_quotes_gpc开启 |
如果magic_quotes_runtime是启用的,那么在向文件中写入序列化的数据之前必须用addslashes()进行处理,而在读取它们之前则必须用stripslashes()进行处理:
代码如下 | 复制代码 |
$fp = fopen('/tmp/cart','w'); fputs($fp,addslashes(serialize($a))); fclose($fp); //如果magic_quotes_runtime开启 //如果magic_quotes_runtime关闭 |
在启用了magic_quotes_runtime的情况下,从数据库中读取序列化的数据也必须经过stripslashes()的处理,保存到数据库中的序列化数据必须要经过addslashes()的处理,以便能够适当地存储。
代码如下 | 复制代码 |
mysql_query("insert into cart(id,data) values(1,'".addslashes(serialize($cart))."')"); $rs = mysql_query('select data from cart where id=1'); $ob = mysql_fetch_object($rs); //如果magic_quotes_runtime开启 //如果magic_quotes_runtime关闭 |
当对一个对象进行反序列化操作时,PHP会自动地调用其__wakeUp()方法。这样就使得对象能够重新建立起序列化时未能保留的各种状态。例如:数据库连接等。
用例子给你说明一下
代码如下 | 复制代码 |
<?php //声明一个类 class dog { var $name; var $age; var $owner; function dog($in_name="unnamed",$in_age="0",$in_owner="unknown") { $this->name = $in_name; $this->age = $in_age; $this->owner = $in_owner; } function getage() { return ($this->age * 365); } function getowner() { return ($this->owner); } function getname() { return ($this->name); } } //实例化这个类 $ourfirstdog = new dog("Rover",12,"Lisa and Graham"); //用serialize函数将这个实例转化为一个序列化的字符串 $dogdisc = serialize($ourfirstdog); print $dogdisc; //$ourfirstdog 已经序列化为字符串 O:3:"dog":3:{s:4:"name";s:5:"Rover";s:3:"age";i:12;s:5:"owner";s:15:"Lisa and Graham";} /* ----------------------------------------------------------------------------------------- 在这里你可以将字符串 $dogdisc 存储到任何地方如 session,cookie,数据库,php文件 ----------------------------------------------------------------------------------------- */ //我们在此注销这个类 unset($ourfirstdog); ?> b.php <?php
?> <?php //声明一个类 class dog { var $name; var $age; var $owner; function dog($in_name="unnamed",$in_age="0",$in_owner="unknown") { $this->name = $in_name; $this->age = $in_age; $this->owner = $in_owner; } function getage() { return ($this->age * 365); } function getowner() { return ($this->owner); } function getname() { return ($this->name); } } /*还原操作 */ /* ----------------------------------------------------------------------------------------- 在这里将字符串 $dogdisc 从你存储的地方读出来如 session,cookie,数据库,php文件 ----------------------------------------------------------------------------------------- */ $dogdisc='O:3:"dog":3:{s:4:"name";s:5:"Rover";s:3:"age";i:12;s:5:"owner";s:15:"Lisa and Graham";}'; //我们在这里用 unserialize() 还原已经序列化的对象 $pet = unserialize($dogdisc); //此时的 $pet 已经是前面的 $ourfirstdog 对象了 //获得年龄和名字属性 $old = $pet->getage(); $name = $pet->getname(); //这个类此时无需实例化可以继续使用,而且属性和值都是保持在序列化之前的状态 print "Our first dog is called $name and is $old days old<br>"; ?> |
序列化与反序列化语法解析不一致带来的安全隐患
. PHP string serialize() 相关源码分析
------------------------------------
代码如下 | 复制代码 |
static inline void php_var_serialize_string(smart_str *buf, char *str, int len) /* {{{ */
|
通过上面的代码片段可以看到 serialize() 对 string 序列化处理方式如下:
代码如下 | 复制代码 |
$str = 'ryatsyne'; var_dump(serialize($str)); // $str serialized string output // s:8:"ryatsyne"; |
ii. PHP string unserialize() 相关源码分析
---------------------------------------
unserialize() 函数对 string 的反序列化则分为两种,一种是对 `s:` 格式的序列化 string 进行处理:
代码如下 | 复制代码 |
switch (yych) {
|
另一种是对 S: 格式的序列 string 进行处理(此格式在 serialize() 函数序列化处理中并没有定义):
代码如下 | 复制代码 |
static char *unserialize_str(const unsigned char **p, size_t *len, size_t maxlen)
|
从上面的代码片段可以看到 unserialize() 对序列化后的 string 反序列化处理如下:
代码如下 | 复制代码 |
$str1 = 's:8:"ryatsyne";';
|
iii. 语法解析处理不一致导致的安全隐患
-----------------------------
从上述分析过程可以看到 PHP 在反序列化 string 时没有严格按照序列化格式 s:x:"x"; 进行处理,没有对 " 后面的是否存在 ; 进行判断,同时增加了对十六进制形式字符串的处理,这样前后处理的不一致让人很费解,同时由于 PHP 手册中对此没有详细的说明,大部分程序员对此处理过程并不了解,这可能导致其在编码过程中出现疏漏,甚至导致严重的安全问题。
回到文章开头提到的 IPB 漏洞上,利用这个 funny feature of PHP 可以很容易的 bypass safeUnserialize() 函数的过滤:)
代码如下 | 复制代码 |
* mixed safe_unserialize(string $serialized) return false; |
相关文章
- 这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
- 这篇文章介绍了C#判断字符串是否数字或字母的实例,有需要的朋友可以参考一下...2020-06-25
- 这篇文章主要介绍了PostgreSQL判断字符串是否包含目标字符串的多种方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-23
- 这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
iOS设置UIButton文字显示位置和字体大小、颜色的方法
这篇文章给大家分享了iOS如何设置UIButton的文字显示位置和字体的大小、颜色,文中给出了示例代码,相信对大家的学习和理解很有帮助,有需要的朋友们下面来一起看看吧。...2020-06-30- 本文实例讲述了php字符串按照单词进行反转的方法。分享给大家供大家参考。具体分析如下:下面的php代码可以将字符串按照单词进行反转输出,实际上是现将字符串按照空格分隔到数组,然后对数组进行反转输出。...2015-03-15
- 这篇文章主要介绍了mybatis-plus 处理大数据插入太慢的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-18
- 这篇文章主要介绍了MySQL 字符串拆分操作(含分隔符的字符串截取),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-22
- 这篇文章主要介绍了C#实现字符串转换成字节数组的简单实现方法,仅一行代码即可搞定,非常简单实用,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了使用list stream:任意对象List拼接字符串操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-09
- 这篇文章主要介绍了C# 16 进制字符串转 int的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2020-06-25
- JS中默认中文字符长度和其它字符长度计算方法是一样的,但某些情况下我们需要获取中文字符串的实际长度,代码如下: 复制代码 代码如下: function strLength(str) { var realLength = 0, len = str.length, charCode = -1;...2014-06-07
- 这篇文章主要介绍了PostgreSQL 字符串处理与日期处理操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-01
- 在debian环境下,彻底解决mysql无法插入和显示中文的问题Linux下Mysql插入中文显示乱码解决方案mysql -uroot -p 回车输入密码进入mysql查看状态如下:默认的是客户端和服务器都用了latin1,所以会乱码。解决方案:mysql>use...2013-10-04
- 文章介绍一个实用的函数,我们如果用php substr来截取字符在中文上处理的很有问题,今天自己写了一个比较好的中文与英文字符截取的函数,有需要的朋友可以参考下。 ...2016-11-25
- 这篇文章主要介绍了C#实现对字符串进行大小写切换的方法,涉及C#操作字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了c#将字节数组转成易读的字符串的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 这篇文章主要介绍了C#获取字符串后几位数的方法,实例分析了C#操作字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 当unique列在一个UNIQUE键上插入包含重复值的记录时,我们可以控制MySQL如何处理这种情况:使用IGNORE关键字或者ON DUPLICATE KEY UPDATE子句跳过INSERT、中断操作或者更新旧记录为新值。mysql> create table menus(id t...2015-11-08
- 这篇文章主要介绍了解决vue字符串换行问题(绝对管用),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-06