周报

C语言算法题

题目描述众所周知,在每一个彗星后都有一只UFO。这些UFO时常来收集地球上的忠诚支持者。不幸的是,他们的飞碟每次出行都只能带上一组支持者。因此,他们要用一种聪明的方案让这些小组提前知道谁会被彗星带走。他们为每个彗星起了一个名字,通过这些名字来决定这个小组是不是被带走的那个特定的小组(你认为是谁给这些彗星取的名字呢?)。关于如何搭配的细节会在下面告诉你;你的任务是写一个程序,通过小组名和彗星名来决定这个小组是否能被那颗彗星后面的UFO带走。小组名和彗星名都以下列方式转换成一个数字:最终的数字就是名字中所有字母的积,其中AAA是111,ZZZ是262626。例如,USACOUSACOUSACO小组就是21×19×1×3×15=1795521 \times 19 \times 1 \times 3 \times 15=1795521×19×1×3×15=17955。如果小组的数字 mod 47 \bmod 47mod47等于彗星的数字 mod 47 \bmod 47mod47,你就得告诉这个小组需要准备好被带走!(记住“a mod ba \bmod bamodb”是aaa除以bbb的余数;34 mod 1034 \bmod 1034mod10等于444)写出一个程序,读入彗星名和小组名并算出用上面的方案能否将两个名字搭配起来,如果能搭配,就输出“GO”,否则输出“STAY”。小组名和彗星名均是没有空格或标点的一串大写字母(不超过666个字母)。输入格式第1行:一个长度为111到666的大写字母串,表示彗星的名字。第2行:一个长度为111到666的大写字母串,表示队伍的名字。
输出格式无输入输出样例输入 #1
复制 COMETQ
HVNGAT
输出 #1
复制 GO输入 #2
复制 ABSTAR
USACO输出 #2 复制 STAY说明/提示题目翻译来自NOCOW。
USACO Training Section 1.1

#include<stdio.h>
int main()
{
 char a[10],b[10];
 int i;
 long long int t1=1,t2=1;
 gets(a);
 gets(b);
 for(i=0;a[i]!='\0';i++)
 {
 t1=t1*(a[i]-64);
 }
 for(i=0;b[i]!='\0';i++)
  t2=t2*(b[i]-64);
 if((t2%47)==(t1%47))
  printf("GO\n");
 else
  printf("STAY\n");
}

题目描述一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例1 ),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2 )。
输入格式共22行。第11行为一个字符串,其中只含字母,表示给定单词;第22行为一个字符串,其中只可能包含字母和空格,表示给定的文章。输出格式一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从00 开始);如果单词在文章中没有出现,则直接输出一个整数-1−1。输入输出样例输入 #1复制To
to be or not to be is a question
输出 #1复制2 0

输入 #2复制to
Did the Ottoman Empire lose its power at that time输出 #2复制-1说明/提示数据范围1≤1≤单词长度≤10≤10。1≤1≤文章长度≤1,000,000≤1,000,000。

#include <stdio.h>
#include <string.h>
int main() 
{
    char a[11], b[1000001];
    gets(a);
    gets(b);
    strcat(a," ");
    strcat(b," ");
    int i, cnt, n=0, l, j, cnt1=0, k, result;
    for (i = 0; a[i] != '\0'; i++) 
    {
        if (a[i] >= 'a')
            a[i] -= 'a' - 'A';
    }
    for (i = 0; b[i] != '\0'; i++) 
    {
        if (b[i] >= 'a')
            b[i] -= 'a' - 'A';
    }
    for (i = 0; b[i] != '\0'; i++) 
    {
        if (b[i] == ' ') 
        {
            cnt=1;
            for (j = n,k = 0; j <= i, a[k] != '\0'; j++, k++) 
            {
                if(b[j] == a[k]) 
                {
                    cnt*=1;
                } 
                else 
                {
                     cnt*=0;
                }
            }
            if (cnt == 1) 
            {
                cnt1++;
            }
            if (cnt1 == 1 && cnt==1) 
            {
                result = n;
            }
            n=i;
            n++;
        }
    }
    if (cnt1 == 0) 
    {
        cnt1 = -1;
        printf("%d", cnt1);
    } 
    else if (cnt1 >= 1) 
    {
        printf("%d %d", cnt1, result);
    }
    return 0;
}

题目描述已知 nnn 个整数 x1,x2,…,xnx_1,x_2,…,x_nx1​,x2​,…,xn​,以及111个整数kkk(k<nk<nk<n)。从nnn个整数中任选kkk个整数相加,可分别得到一系列的和。例如当n=4,k=3n=4,k=3n=4,k=3,444个整数分别为3,7,12,193,7,12,193,7,12,19时,可得全部的组合与它们的和为:3+7+12=223+7+12=223+7+12=223+7+19=293+7+19=293+7+19=297+12+19=387+12+19=387+12+19=383+12+19=343+12+19=343+12+19=34。现在,要求你计算出和为素数共有多少种。
例如上例,只有一种的和为素数:3+7+19=293+7+19=293+7+19=29。输入格式键盘输入,格式为:n,kn,kn,k(1≤n≤20,k<n1 \le n \le 20,k<n1≤n≤20,k<n)x1,x2,…,xn(1≤xi≤5000000)x_1,x_2,…,x_n (1 \le x_i \le 5000000)x1​,x2​,…,xn​(1≤xi​≤5000000)输出格式屏幕输出,格式为: 111个整数(满足条件的种数)。
输入输出样例输入 #1
复制 4 3
3 7 12 19

#include <stdio.h>
#include <math.h>
#include <string.h>
#define MAX 40
int sort=0,n,k,a[MAX];
int sushu(int x)
{
    int i,y;
    y=sqrt(x);
    for(i=2;i<=y;i++)
        if(x%i==0)
            return 0;
    return 1;
}
void f(int input[],int pos,int m) 
{
    if(m==0)
    {
        int j,sum=0;
        for(j=0;j<n;j++)
            if(input[j]==1)
                sum+=a[j];
        if(sushu(sum)==1)
            sort++;
        return;
    }
    else
    {
        int i;
        for(i=pos;i<n;i++)
        {
            if(input[i]==0)
                input[i]=1;
                f(input,i+1,m-1);
                input[i]=0;
        }
    }
    return;
}
int main()
{
    int input[MAX],i;
    scanf("%d%d",&n,&k);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    memset(input,0,sizeof(int)*MAX);
    f(input,0,k);
    printf("%d\n",sort);
    return 0;
}

测试XSS漏洞

可得知输入位置(能在页面查看源码)

输入aaaaaaa<>’"&然后在源码中查找aaaaaaa,可得知程序是否对敏感字符做过滤;

无法得知输入位置

留言过后需要管理员审核的情况,无法得知数据在后台页面处于何种状态,通常采用输入/>xss test来测试。

XSS会话劫持

cookie简介

cookie允许服务器存储少量的数据到客户端硬盘,并通过读取这些数据标识用户,维持会话。
cookie分内存cookie(存在时间短,浏览器关闭即消失)和硬盘cookie(存在时间较长)。
cookie通常由变量名和值组成,可能还有date用来确定失效时间、domain和path设置允许访问cookie的范围、secure加密协议才可使用cookie。还有HttpOnly字段,禁止JavaScript读取cookie,此字段可有效防止xss会话劫持。

cookie的利用

cookie有时会用来做身份验证,黑客获取到cookie即可使用burpsuite等工具实现无密码登录。

SESSION简介

用户浏览一个网页即是一个客户端与服务端的会话,被称为SESSION。
SESSION是一个随机不重复的的“编号”,随浏览器和服务器关闭。
SESSION可以存储在cookie中,作为临时cookie。cookie和SESSION的最大区别是,cookie存储于客户端,SESSION存储于服务端,其在客户端仅显示为一个ID。
当会话未关闭时,获取到session同样可以 会话劫持。

XSS框架

xss框架是一组JavaScript工具集合,如键盘记录,盗取cookie,表单劫持的等,国内最著名的是xsser.me。

XSS可能发生的场景

1.输入的数据在标签内部

最简单的的跨站,无需构造标签

<div class="${input}"></div>
---------------->
<div class=""><script>alert(/xss/)</script>"></div>
<div class="" onclick="alert(/xss/)"></div>
2.输入的数据在事件中输出

与属性内输入相同

<img src="xx.jpg" onerror="${input}">
---------------->
<img src="xx.jpg" onerror=""><script>alert(/xss/)</script>">
<img src="xx.jpg" onerror="" onclick="alert(/xss/)">
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值