精华内容
下载资源
问答
  • if(strpos($string,$numtmp)!==false){ echo "恭喜中奖!中奖号码:".$numtmp; }else{ echo "谢谢!欢迎再来,中奖号码不是".$numtmp; } 运行时出现问题了!当随机数到3的时候,应该是判断成功,并输出“恭喜中奖...
  • 本文实例讲述了php使用substr()和strpos()联合查找字符串中某一特定字符的方法。分享给大家供大家参考。具体分析如下: 要求:在下面的字符串中... echo substr($str,0,strpos($str,"||")); ?> 输出内容为admin。 s
  • 主要介绍了详解PHP中mb_strpos的使用,通过使用语法以及实例给大家详细分析了用法,需要的朋友参考学习下。
  • 首先应该知道 strpos 函数可能返回布尔值 FALSE,但也可能返回一个与 FALSE 等值的非布尔值,例如 0 或者""。我们应使用 === 运算符来测试本函数的返回值。
  • 自写PHP strpos() 函数 查找字符串在另一字符串中第一次出现的位置. https://blog.csdn.net/qq_40534785/article/details/87939551
  • 主要介绍了PHP中使用strpos函数实现屏蔽敏感关键字功能,本文用在发布文章保存到数据库时前拦截敏感关键,需要的朋友可以参考下
  • php中的strpos使用示例

    2020-10-26 05:18:27
    strpos()函数返回字符串在另一个字符串中第一次出现的位置。如果没有找到该字符串,则返回 false,下面看示例使用方法
  • strpos

    2018-10-23 16:43:00
    用法: int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] ) 看下面代码: $a = 'abcd'; $b = 'b'; $c = 'a'; echo strpos($a,$b) ? '原来是兄弟 ' : '非我族类,...

    一、前方有坑

    php某些自带函数,如果使用不当,也会坑得你人仰马翻。比如:strpos()

    先了解一下strpos()函数是干啥的。

    strpos — 查找字符串首次出现的位置

    用法: int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )

    看下面代码:

    $a = 'abcd';

    $b = 'b';

    $c = 'a';

    echo strpos($a,$b) ? '原来是兄弟<br/>' : '非我族类,砍ta<br/>';

    echo strpos($a,$c) ? '原来是兄弟<br/>' : '非我族类,砍ta<br/>';

    echo strpos($a,$c)!=false ? '原来是兄弟' : '非我族类,砍ta';

    结果显示

    原来是兄弟

    非我族类,砍ta

    非我族类,砍ta

    $c 命名是$a的一部分,结果当成异类,连着被砍了两次,冤枉,引发了一场本是同根生,相煎何太急的血案悲剧!

    php踩过的那些坑(4) strpos引发的血案

    二、防坑攻略

    stripos()返回的是字符串在另一个字符串出现的位置,而这个位置是从0开始计算的。$c在$a中出现的位置是0,因此被砍。

    所以,正确的判断应该是:

    $a = 'abcd';

    $c = 'a';

    echo strpos($a,$c)!==false ? '原来是兄弟' : '非我族类,砍ta';

    三、为啥有坑

    防坑攻略里说了一些原因,这里先充分了解strpos()函数说起。

    用法:int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )

    参数:

    • haystack 在该字符串中进行查找。

    • needle 如果 needle 不是一个字符串,那么它将被转换为整型并被视为字符的顺序值。

    • offset 可选的 offset 参数可以用来指定从 haystack 中的哪一个字符开始查找。返回的数字位置是相对于 haystack 的起始位置而言的。

    返回值

    以整型返回位置信息。如果没找到 needle,strpos() 将返回布尔型的 FALSE 值。

    也就是说,此函数可能返回布尔值 FALSE,但也可能返回等同于 FALSE 的非布尔值,例如 0 或 ""(空串)。因此,在判断的时候,需要使用恒等于’===‘或者恒不等于’===‘来判断,千万不能省去一个’=‘号。

    四、防坑扩展:

    1、类似的函数还有

    strrpos() - 计算指定字符串在目标字符串中最后一次出现的位置

    stripos() - 查找字符串首次出现的位置(不区分大小写)

    strripos() - 计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写)

    2、判断一个字符串是否在另一个字符串中还有一个函数:strstr()。与strpos()有一点不同是,该函数的返回值是false或者字符串的一部分。如果单纯的判断两个字符串的包含关系,最好使用strpos,因为速度更快、耗费内存更少。

    转载于:https://my.oschina.net/u/3371661/blog/2251354

    展开全文
  • 主要介绍了php使用strpos判断字符串中数字类型子字符串出错的解决方法,结合具体问题分析了strpos函数针对数字类型子字符串进行判断时的注意事项及类型转换处理技巧,需要的朋友可以参考下
  • strpos用来查找一个字符串在另一个字符串中首次出现的位置,strpos区分大小写,如果没有找到则返回false,所以strpos有两种类型的返回值,一种是整形,一种是bool型,开发过程中需要注意 <?php echo strpos(...
  • strpos() 函数返回字符串在另一个字符串中第一次出现的位置,如果没有找到该字符串,则返回 false. 语法:strpos(string,find,start),代码如下: 复制代码 代码如下:$str=”hello world”; //定义字符串1 $result=...
  • strpos()想成真,那么strpos()一定得成假了,假的时候也就是找不到指定字符串,即提交数据时不能包含<或者>,但是不能携带这两字符,就没有办法完成注入了。 这里就得利用!strpos()的一个问题了,当strpos()找到了...

    0x00 第一次尝试

    这个题是别人一个月前问我的一个题,当时忙,看了下,发现好像不会,就先放着了。。。


    0x01 第二次尝试

    这个题之前弄了好一会,都没搞出来,一直没时间,今天下定决定把它做出来!!!(尼玛,我最后花了半个月)

    <?php
        highlight_file(__FILE__);
        class Login {
        public function __construct($user, $pass) {
            $this->loginViaXml($user, $pass);
          }
    
        public function loginViaXml($user, $pass) {
            if (
              (!strpos($user, '<') || !strpos($user, '>')) &&
              (!strpos($pass, '<') || !strpos($pass, '>'))
            ) {
              
                $format = '<?xml version="1.0" encoding="UTF-8"?>'.
                '<test>'.
                '<user v="%s"></user><pass v="%s"></pass>'.
                '</test>';
               
                $xml = sprintf($format, $user, $pass);
                $datas = new SimpleXMLElement($xml);
                $dom = dom_import_simplexml($datas);
                $dom->ownerDocument->xinclude();
                echo $dom->ownerDocument->saveXML();
            }
        }
    }
    
    new Login($_POST['username'], $_POST['password']);
    

    原代码如上,采用oop的方式来写的,先看loginViaXML()相关函数。

    • hightlight_file()以php格式高亮来输出文件内容;
    • _FILE_,php内置常量,当前文件的绝对目录;
    • strops()用来查找字符串A当中是否存在字符串B(从左往右找),如果有,返回位置,从0开始计数,如果没有返回false;
    • sprintf()只格式化,返回字符串,不输出字符串,printf()同样也是格式字符串,但是会输出字符串;
    • SimpleXLElement()实例化xml;
    • dom_import_simplexml将xml转化为dom;
    • $dom->ownerDocument->xinclude()有点没搞明白啥意思,知道的告诉我一下,谢谢。 这里才是拿flag的重点,用这个来包含xml
    • $dom->ownerDocument->saveXML(),将xml放入一个字符串

    其实没明白想要干什么,无非是把用户和密码加上后格式成新的字符串,然后将字符串实例成XML对象,接着将XMl对象转成dom,然后又把dom转成字符串。。。想了半天没看出来想这和flag有什么关系的。

    提交了参数以后,确实能输出。
    在这里插入图片描述
    那就只去构造XXE注入呗,但是上面的函数中有waf,先来分析下。
    在这里插入图片描述
    strpos($user,'<')指的是提交的username中查找<,如果找到了就返回数字,必定为真。
    !strpos()想成真,那么strpos()一定得成假了,假的时候也就是找不到指定字符串,即提交数据时不能包含<或者>,但是不能携带这两字符,就没有办法完成注入了。
    这里就得利用!strpos()的一个问题了,当strpos()找到了特定字符串,并且当这个字符串为开头时,返回的结果会是0,那么此时!strpos()就为真了。
    在这里插入图片描述
    经测试,也就是在开头加上<或者>就可以绕过waf。

    接着构造XXE的poc,好吧,真的弄不出来。凉凉,几天了。。有没有大佬教一下的,放弃了,回头再弄吧。


    0x02 第三次尝试

    又尝试了一次,无果,记录下。
    由于之前尝试闭合XXE时,在写入文档定义时,一直在提示有无效的起始tag符号,其实就是<,无奈之下就放弃了,但是心里一直觉得有个题没弄出来,就到处问人,昨天经过和人讨论,有了一点新的思路,可惜还是没成功。。。
    这次思路是闭合<test>
    在这里插入图片描述
    用自己在本地的环境下测试的闭合语句,构造payload的情况如下
    在这里插入图片描述
    如果没有了办法使用&以外,其余的闭合已经正常了,接着将以下payload提交。

    username=>"></user></test>
    <!DOCTYPE foo [ <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "file:///etc/passwd">]>
    <hehe>
    <wsl>&xxe;</wsl>
    </hehe>
    <test>
    <user><"&password=>"><"
    

    在这里插入图片描述
    格式继续错误,查了一下,应该是XML的文件格式错误,这里大概是不能出现两个根元素,我这里使用了两次<test>,又失败了,下次继续尝试。


    0x03 第N次尝试!!!

    做这个题,真的是把我搞累了,我艹了,QQ微信里面的大佬全问了一遍,要么不理我,要么说看一下就没有结果,要么直接就是不会。。。心想着谁搞出来搞包烟他表示感谢,结果最后还是自己弄出来了。NMD,NMD,NMD,WC,WC,WCNDY,心累了。好了,无能狂怒结束,说正紧的。

    重点就是这个xinculde()函数,最开始没有理解的xinclude()果然是解题关键,确认后又再去查了n次,最后这一次查的信息感觉和几前的不一样(这是什么鬼情况),这次看得明白多了,也许是经历的多了吧hhh

    什么是xinclude?

    导入外部xml文档,将外部定义的dtd引入当前文件,类似于php的include;

    为什么要使用 xinclude?

    为什么要使用 XInclude,而不是 XML external entities?

    答案是,XML 外部实体有很多众所周知的局限和不便于使用的含义,这些因素极大地妨碍了 XML 外部实体成为多用途包含工具。具体来说:

    • XML 外部实体无法成为一个成熟的独立 XML 文档,因为它既不允许独立的 XML 声明,也不允许 Doctype 声明。这实际上意味着 XML 外部实体本身无法包括其他外部实体。
    • XML 外部实体必须是格式规范的 XML(第一眼看起来好象没有这么差,但想象一下怎样将示例 C# 代码包括到 XML 文档中)。
    • 未能加载外部实体是重大错误 (fatal error);严格禁止任何恢复。
    • 只能包括整个外部实体,无法只包括文档的一部分。
    • 外部实体必须在 DTD 或内部子集中进行声明。例如,这些含义可能是:要求文档元素必须在 Doctype 声明中命名,以及对读取方的验证可能需要在其他文档的 DTD 中定义文档的全部内容模型。

    嗯,上面都是查的,点我看原文。。。其中有的碰到过,比如之前在研究闭合的时候,DTD怎么写都不对,只能重新闭合构造根元素,闭合构造后又提示格式错误,这些都是因为XML的限制。

    如何使用xinclude()?

    XInclude 定义了一个便于在 XML 文档中实现模块化的多用途包含机制。包括过程被正式定义为将很多 XML 信息集 (XML Infoset) 合并到单个复合的 XML 信息集中。作者通过包含指令来指定要合并哪些文档并控制合并过程。包含指令的 XInclude 语法基于大家熟悉的、容易产生和处理的 XML 构造:元素、属性和 URI 引用。

    XInclude 支持包含非 XML 文本文档,并允许作者控制恢复过程。例如,您可以提供要包含的默认内容或备用文档,如果无法加载远程资源,就将包括这些默认内容或备用文档。

    XInclude 还支持部分 XML 包含,也就是说,您可以定义(通过提供 XPointer 指针)应当包括 XML 文档的哪一(些)部分。

    下面是另一个介绍性示例,它演示了如何将外部非 XML 文本数据包含到 XML 文档中。假设您有一个存储在服务器上的 XML 文档,并且您想让它包含一个计数器,该计数器描述文档访问的次数:

    <?xml version="1.0"?>
    <catalog xmlns:xi="http://www.w3.org/2003/XInclude">
      <p>This document has been accessed
      <xi:include href="http://www.contoso.com/Counter.aspx?pid=catalog" parse="text"/> times.</p>
    </catalog>
    

    处理后html页面

    <?xml version="1.0"?>
    <catalog xmlns:xi="http://www.w3.org/2003/XInclude">
      <p>This document has been accessed
      45453 times.</p>
    </catalog>
    
    xinclude语法

    XInclude 语法非常简单,只是在 http://www.w3.org/2003/XInclude 命名空间中的两个元素,即 include 和 fallback。常用的命名空间前缀是“xi”(但可以根据喜好自由使用任何前缀)。对于那些习惯使用正式语法定义的人,XInclude 规范提供了XInclude 的 XML 架构和 DTD。对于其他人,下面是它的摘要:

    xi:include 元素

    • xi:include 元素充当包括指令。它定义了要包括哪些文档以及如何包括。它的属性是:
    • href — 对要包括的文档的 URI 引用。
    • parse — 它的值可以是“xml”或“text”,用于定义如何包括指定的文档(是作为 XML 还是作为纯文本)。默认值是“xml”。
    • xpointer — 这是一个 XPointer,用于标识要包括的 XML 文档部分。如果作为文本包括 (parse=“text”),将忽略该属性。
    • encoding — 作为文本包括时,该属性提供所包括文档的编码提示信息。

    详细的看上面的链接吧,那个写的很清楚,了解这个了,就可以做这个题了。

    正式解题
    username=>"></user></test>
    <!DOCTYPE foo [ <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "file:///etc/passwd">]>
    <hehe>
    <wsl>&xxe;</wsl>
    </hehe>
    <test>
    <user><"&password=>"><"
    

    上面是之前的payload,结合xinclude的格式可以写成

    username=>"></user>
    <nmd xmlns:xi="http://www.w3.org/2003/XInclude">
    <xi:include href="file:///etc/passwd" parse="text"/>
    </nmd>
    <user v="a&password=b
    

    提交!!!
    在这里插入图片描述
    再包含一次flag文件!!!
    在这里插入图片描述
    成功拿到flag,这个30分的题,so(ruo)easy(ji)。。。。


    0x04 感想

    哎,这个题总算是弄出来了,会的时候发现真简单,稍微有点学网络时的感觉了,基础真的很重要,确信!!!

    这个过程太难了,问遍了所有的好友,所有的群,朋友们还帮我问各种大佬们,反正都是给网上的那个代码审计题的wp,那个题感觉根本做不了,因为没法闭合啊,又或者说看一下的,最后就没消息,又不好意思直接问出题人这个题的解法。。。

    生气,生气,真的是很生气,半吊子真的有点惨,不上不下,简单的大佬懒得回答,复杂点的大佬懒得看,想帮你的人不会做,会做的人你又不认识,啥时候这玩意能学到我网络的水平,感觉这个路还长着,坚持学习!!!
    在这里插入图片描述
    人的一切痛苦,本质上都是对自己无能的愤怒

    展开全文
  • strpos() 函数返回字符串在另一个字符串中第一次出现的位置。 如果没有找到该字符串,则返回 false。 语法 strpos(string,find,start) 参数 描述 string 必需。规定被搜索的字符串。 find 必需。规定要查找的字
  • strpos mixed strpos ( string $haystack, mixed $needle [, int $offset = 0 ] ) 如果offset指定了,查找会从offset的位置开始。offset不能为负数。 返回needle第一次出现在haystack的位置。如果在haystack中找不到...
  • php strpos 与mb_strpos的区别

    千次阅读 2019-04-02 18:05:56
    $a = '歪麦博客';...$pos = strpos($a, $b); echo $pos;//6 echo "<br/>"; $pos = mb_strpos($a, $b); echo $pos;//2 echo "<br/>"; $pos = strpos(mb_convert_encoding($a, 'utf-8'), mb_conver...

    $a = '歪麦博客';
    $b = '博客';
    $pos = strpos($a, $b);
    echo $pos;//6
    echo "<br/>";

    $pos = mb_strpos($a, $b);
    echo $pos;//2
    echo "<br/>";

    $pos = strpos(mb_convert_encoding($a, 'utf-8'), mb_convert_encoding($b, 'utf-8'));
    echo $pos;//6
    echo "<br/>";
    $submit = "我爱北京天安门";
    $item = "天安门";
    echo mb_strpos($submit, $item); //4
    echo "<br/>";
    var_dump(strpos('开始23测试ceshi', '测试'));//8
    echo "<br/>";
     var_dump(mb_strpos('开始23测试ceshi', '测试'));//4
    echo "<br/>";
    var_dump(strpos('123测试ceshi', '测试'));//3
    echo "<br/>";
    var_dump(mb_strpos('123测试ceshi', '测试'));//3

    mb_strpos 按字处理,strpos 按字符处理

    strpos如果查找的字符串是 【汉字】,那么长度就以 utf-8格式,记3,;

    strpos如果查找的字符串是【非汉字】,那么长度记 1 ;

    展开全文
  • strpos 与mb_strpos的区别

    万次阅读 2018-01-22 17:08:21
    php > var_dump(strpos('开始23测试ceshi', '测试')); int(8) php > var_dump(mb_strpos('开始23测试ceshi', '测试')); int(4) php > var_dump(strpos('123测试ceshi', '测试')); int(3) php > var_dump(mb_strpos('...

    例子:

    php > var_dump(strpos('开始23测试ceshi', '测试'));
    int(8)
    php > var_dump(mb_strpos('开始23测试ceshi', '测试'));
    int(4)
    php > var_dump(strpos('123测试ceshi', '测试'));
    int(3)
    php > var_dump(mb_strpos('123测试ceshi', '测试'));
    int(3)

    mb_strpos 按字处理,strpos 按字符处理

    展开全文
  • 本文实例讲述了php常用字符串查找函数strstr()与strpos()。分享给大家供大家参考,具体如下: ...4、如果你仅仅想确定needle是否存在于haystack中请使用速度更快、耗费内存更少的strpos()函数 <?php
  • strpos($headerInfo->subject, "code. $id")) { echo true } $headerInfo = imap_headerinfo($connection); if (!strpos($headerInfo->subject, "code.$id")) { echo true } </code></pre> <p>How can I...
  • strpos( string $haystack, mixed $needle[, int $offset = 0] ) : int 返回 needle 在 haystack 中首次出现的数字位置。 haystack 在该字符串中进行查找。 needle 如果 needle 不是一个字符串,那么它将被转换为...
  • strpos() expects parameter 1 to be string, integer given 出错代码 public static function showArticle($id) { ArticleModel::where('id', '=', $id) ->update(['is_show', 0]); } 问题在于数组的格式...
  • strpos() 函数

    千次阅读 2019-05-11 11:50:21
    查看更多 https://www.yuque.com/docs/share/f05e06a6-54e9-439a-adcd-90334a5271ac
  • 本文主要和大家介绍PHP中mb_strpos的使用技巧,通过使用语法以及实例给大家详细分析了用法,需要的朋友参考学习下。希望能帮助到大家。mb_strpos(PHP 4 >= 4.0.6, PHP 5, PHP 7)mb_strpos — Find position of ...
  • <p>I'm trying to make a simple search box that uses <code>strpos</code>to check if the entered keyword makes a match with a variable. I have this working perfectly, however I can't seem to get it to ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,746
精华内容 10,298
关键字:

strpos