php防sql注入过滤代码 - 搬砖小伙子 - 博客园

mikel阅读(25)

来源: php防sql注入过滤代码 – 搬砖小伙子 – 博客园

防止SQL注入的函数,过滤掉那些非法的字符,提高SQL安全性,同时也可以过滤XSS的攻击。
function filter($str)
{
    if (empty($str)) return false;
    $str = htmlspecialchars($str);
    $str = str_replace( '/', "", $str);
    $str = str_replace( '"', "", $str);
    $str = str_replace( '(', "", $str);
    $str = str_replace( ')', "", $str);
    $str = str_replace( 'CR', "", $str);
    $str = str_replace( 'ASCII', "", $str);
    $str = str_replace( 'ASCII 0x0d', "", $str);
    $str = str_replace( 'LF', "", $str);
    $str = str_replace( 'ASCII 0x0a', "", $str);
    $str = str_replace( ',', "", $str);
    $str = str_replace( '%', "", $str);
    $str = str_replace( ';', "", $str);
    $str = str_replace( 'eval', "", $str);
    $str = str_replace( 'open', "", $str);
    $str = str_replace( 'sysopen', "", $str);
    $str = str_replace( 'system', "", $str);
    $str = str_replace( '$', "", $str);
    $str = str_replace( "'", "", $str);
    $str = str_replace( "'", "", $str);
    $str = str_replace( 'ASCII 0x08', "", $str);
    $str = str_replace( '"', "", $str);
    $str = str_replace( '"', "", $str);
    $str = str_replace("", "", $str);
    $str = str_replace("&gt", "", $str);
    $str = str_replace("&lt", "", $str);
    $str = str_replace("<SCRIPT>", "", $str);
    $str = str_replace("</SCRIPT>", "", $str);
    $str = str_replace("<script>", "", $str);
    $str = str_replace("</script>", "", $str);
    $str = str_replace("select","",$str);
    $str = str_replace("join","",$str);
    $str = str_replace("union","",$str);
    $str = str_replace("where","",$str);
    $str = str_replace("insert","",$str);
    $str = str_replace("delete","",$str);
    $str = str_replace("update","",$str);
    $str = str_replace("like","",$str);
    $str = str_replace("drop","",$str);
    $str = str_replace("DROP","",$str);
    $str = str_replace("create","",$str);
    $str = str_replace("modify","",$str);
    $str = str_replace("rename","",$str);
    $str = str_replace("alter","",$str);
    $str = str_replace("cas","",$str);
    $str = str_replace("&","",$str);
    $str = str_replace(">","",$str);
    $str = str_replace("<","",$str);
    $str = str_replace(" ",chr(32),$str);
    $str = str_replace(" ",chr(9),$str);
    $str = str_replace("    ",chr(9),$str);
    $str = str_replace("&",chr(34),$str);
    $str = str_replace("'",chr(39),$str);
    $str = str_replace("<br />",chr(13),$str);
    $str = str_replace("''","'",$str);
    $str = str_replace("css","'",$str);
    $str = str_replace("CSS","'",$str);
    $str = str_replace("<!--","",$str);
    $str = str_replace("convert","",$str);
    $str = str_replace("md5","",$str);
    $str = str_replace("passwd","",$str);
    $str = str_replace("password","",$str);
    $str = str_replace("../","",$str);
    $str = str_replace("./","",$str);
    $str = str_replace("Array","",$str);
    $str = str_replace("or 1='1'","",$str);
    $str = str_replace(";set|set&set;","",$str);
    $str = str_replace("`set|set&set`","",$str);
    $str = str_replace("--","",$str);
    $str = str_replace("OR","",$str);
    $str = str_replace('"',"",$str);
    $str = str_replace("*","",$str);
    $str = str_replace("-","",$str);
    $str = str_replace("+","",$str);
    $str = str_replace("/","",$str);
    $str = str_replace("=","",$str);
    $str = str_replace("'/","",$str);
    $str = str_replace("-- ","",$str);
    $str = str_replace(" -- ","",$str);
    $str = str_replace(" --","",$str);
    $str = str_replace("(","",$str);
    $str = str_replace(")","",$str);
    $str = str_replace("{","",$str);
    $str = str_replace("}","",$str);
    $str = str_replace("-1","",$str);
    $str = str_replace("1","",$str);
    $str = str_replace(".","",$str);
    $str = str_replace("response","",$str);
    $str = str_replace("write","",$str);
    $str = str_replace("|","",$str);
    $str = str_replace("`","",$str);
    $str = str_replace(";","",$str);
    $str = str_replace("etc","",$str);
    $str = str_replace("root","",$str);
    $str = str_replace("//","",$str);
    $str = str_replace("!=","",$str);
    $str = str_replace("$","",$str);
    $str = str_replace("&","",$str);
    $str = str_replace("&&","",$str);
    $str = str_replace("==","",$str);
    $str = str_replace("#","",$str);
    $str = str_replace("@","",$str);
    $str = str_replace("mailto:","",$str);
    $str = str_replace("CHAR","",$str);
    $str = str_replace("char","",$str);
    return $str;
}
 
 
更加简便的防止SQL注入的方法(推荐使用这个):
 
 if (!get_magic_quotes_gpc()) // 判断magic_quotes_gpc是否为打开    
 {    
    $post = addslashes($name); // magic_quotes_gpc没有打开的时候把数据过滤    
 }    
 
 $name = str_replace("_", "\_", $name); // 把 '_'过滤掉  
   
 $name = str_replace("%", "\%", $name); // 把' % '过滤掉    
 
 $name = nl2br($name); // 回车转换    
 
 $name= htmlspecialchars($name); // html标记转换   
     
 return $name;

 

 

PHP防XSS 防SQL注入的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
 * 过滤参数
 * @param string $str 接受的参数
 * @return string
 */
static public function filterWords($str)
{
    $farr = array(
            "/<(\\/?)(script|i?frame|style|html|body|title|link|meta|object|\\?|\\%)([^>]*?)>/isU",
            "/(<[^>]*)on[a-zA-Z]+\s*=([^>]*>)/isU",
            "/select|insert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile|dump/is"
    );
    $str = preg_replace($farr,'',$str);
    return $str;
}
  
/**
 * 过滤接受的参数或者数组,如$_GET,$_POST
 * @param array|string $arr 接受的参数或者数组
 * @return array|string
 */
static public function filterArr($arr)
{
    if(is_array($arr)){
        foreach($arr as $k => $v){
            $arr[$k] = self::filterWords($v);
        }
    }else{
        $arr = self::filterWords($v);
    }
    return $arr;
}

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
在防止被注入攻击时,常会用到两个函数:htmlspecialchars()和addslashes() 、trim()函数。这两个函数都是对特殊字符进行转义。
1)addslashes()作用及使用
addslashes()通常用于防止sql注入,它可对通过get,post和cookie传递过来的参数的单引号和双引号已经null前加“\”进行转义
如:如变量$str=$_POST["str"];的值为:bb' or 1='1。通过addslashes()函数过滤后会变为:bb\' or 1=\'1;
2)htmlspecialchars()作用及使用
htmlspecialchars()也是对字符进行转义,与addslashes()不同的是htmlspecialchars()是将特殊字符用引用实体替换。
如<script>alert('xss')</script>通过htmlspecialchars()过滤后为<script>alert('xss')</script&gt
3)addslashes()与htmlspecialchars()的区别
除了两个函数的转义方式不同外,它们的使用也不同。
addslashes()通过用于防止sql语句注入,在执行sql语句前对通过get、post和cookie传递来的参数中的单引号,双引号,\ 和null进行转义。
但sql执行成功后,插入到数据库中的数据是不带有转义字符\的。这是如果插入到数据库中的是一些js脚本,当这些脚本被读取出来时还是会被执行。
这是我们可对读取出来的数据使用htmlspecialchars()进行过滤,避免执行被注入的脚本。

如何排查内网ARP断网攻击祸首?局域网ARP攻击检测方法 - 系统之家

mikel阅读(32)

来源: 如何排查内网ARP断网攻击祸首?局域网ARP攻击检测方法 – 系统之家

很多网友小集体或小区、住所都会使用局域网的方式上网,在网速本身并不高的情况下,同路由的用户就可能会因为网速问题使用各种网络控制软件,对局域网内的用户进行ARP断网攻击,以牺牲其他内网用户网速为代价换取更好的网速。

如何排查内网ARP断网攻击祸首?局域网ARP攻击检测方法

ARP断网攻击有什么征兆?

1、局域网内频繁性区域或整体掉线、IP地址冲突;

2、网速时快时慢;

3、极其不稳定,严重影响了网络的正常通讯;

4、安全软件会提示受到ARP网络攻击。

以上任何一条问题出现在用户计算机中都会让人气愤不已,有什么办法可以通过排查ARP断网攻击来源呢?

一、首先诊断是否为ARP病毒攻击

1、当发现上网明显变慢,或者突然掉线时,我们可以用:arp -a 命令来检查ARP表:

点击“开始”按钮-选择“运行”-输入“cmd”点击“确定”按钮,在窗口中输入:arp -a 命令。

如何排查内网ARP断网攻击祸首?局域网ARP攻击检测方法

检查ARP列表

  如果发现网关的MAC地址发生了改变,或者发现有很多IP指向同一个物理地址,那么肯定就是ARP欺骗所致。这时可以通过 arp -d 清除arp列表,重新访问。

2、利用ARP防火墙类软件(如:360ARP防火墙Anti ARP Sniffer等……)。

二、找出ARP病毒主机

1、用 arp -d 命令,只能临时解决上网问题,要从根本上解决问题,就得找到病毒主机。通过上面的 arp -a 命令,可以判定改变了的网关MAC地址或多个IP指向的物理地址,就是病毒机的MAC地址。哪么对应这个MAC地址的主机又是哪一台呢,Windows中有 ipconfig /all 命令查看每台的信息,但如果电脑数目多话,一台台查下去不是办法,因此可以下载一个叫“NBTSCAN”的软件,它可以扫描到PC的真实IP地址和MAC地址。

2、如果手头一下没这个软件怎么办呢?这时也可在客户机运行路由跟踪命令如:tracert -d www.xitongjiazhi.net 马上就发现第一条不是网关机的内网IP,而是本网段内的另外一台机器的IP,再下一跳才是网关的内网IP;正常情况是路由跟踪执行后的输出第一条应该是默认网关地址,由此判定第一跳的那个非网关IP地址的主机就是罪魁祸首。

如何排查内网ARP断网攻击祸首?局域网ARP攻击检测方法

查找访问外网路径

  当然找到了IP之后,接下来是要找到这个IP具体所对应的机子了,如果你每台电脑编了号,并使用固定IP,IP的设置也有规律的话,那么就很快找到了。但如果不是上面这种情况,IP设置又无规律,或者IP是动态获取的那该怎么办呢?难道还是要一个个去查?非也!你可以这样:把一台机器的IP地址设置成与作祟机相同的相同,然后造成IP地址冲突,使中毒主机报警然后找到这个主机。

三、处理病毒主机

1、用杀毒软件查毒,杀毒。

2、建议重装系统,一了百了。(当然你应注意除系统盘外其他盘有无病毒)

四、如何防范ARP断网攻击?

1、IP/MAC双向绑定

由于ARP病毒的种种网络特性,可以采用一些技术手段进行网络中ARP病毒欺骗数据包免疫。即便网络中有ARP中毒电脑,在发送欺骗的ARP数据包,其它电脑也不会修改自身的ARP缓存表,数据包始终发送给正确的网关,普遍使用的一种方式是“双向绑定法”。双向绑定法,顾名思义,就是要在两端绑定IP-MAC地址,其中一端是在路由器中,绑定下面局域网内部计算机的IP和MAC地址。

2、作为网络管理员,应该充分利用一些工具软件,备一些常用的工具,就ARP而言,推荐在手头准备这样几个软件:

(1)飞鱼星网关智能绑定精灵,一键绑定。

(2)“Anti ARP Sniffer”(使用Anti ARP Sniffer可以防止利用ARP技术进行数据包截取以及防止利用ARP技术发送地址冲突数据包,并能查找攻击主机的IP及MAC地址)。

(3)“NBTSCAN”(NBTSCAN可以取到PC的真实IP地址和MAC地址,利用它可以知道局域网内每台IP对应的MAC地址)

(4)“网络执法官”(一款局域网管理辅助软件,采用网络底层协议,能穿透各客户端防火墙对网络中的每一台主机、交换机等配有IP的网络设备进行监控;采用网卡号(MAC)识别用户,主要功能是依据管理员为各主机限定的权限,实时监控整个局域网,并自动对非法用户进行管理,可将非法用户与网络中某些主机或整个网络隔离,而且无论局域网中的主机运行何种防火墙,都不能逃避监控,也不会引发防火墙警告,提高了网络安全性)

3、定时检查局域网病毒,对机器进行病毒扫描,平时给系统安装好补丁程序,最好是局域网内每台电脑保证有杀毒软件(可升级)

4、指导好网络内使用者不要随便点击打开QQ、MSN等聊天工具上发来的链接信息,不要随便打开或运行陌生、可疑文件和程序,如邮件中的陌生附件,外挂程序等。

5、建议对局域网的每一台电脑尽量作用固定IP,路由器不启用DHCP,对给网内的每一台电脑编一个号,每一个号对应一个唯一的IP,这样有利用以后故障的查询也方便管理。并利用“NBTSCAN”软件查出每一IP对应的MAC地址,建立一个“电脑编号-IP地址-MAC地址”一一对应的数据库。

防御ARP断网攻击最好的方法,其实就是退出局域网,重新牵一条网线,一劳永逸,不过有时候我们很少考虑这个条件,既然如此,我们就需要使用以上方法抓出祸首,以儆效尤。

sql server ,没有substring_index,要怎么用substring和charindex实现截取特定字符串_sql 2012 用不了substring_index-CSDN博客

mikel阅读(34)

来源: sql server ,没有substring_index,要怎么用substring和charindex实现截取特定字符串_sql 2012 用不了substring_index-CSDN博客

文章目录
一、截取_第1次出现的位置
二、截取_第2次出现的位置
三、截取_第3次出现的位置
四、截取_第2次出现的位置和第3次出现新的位置之间的字符串
一、截取_第1次出现的位置
CHARINDEX(‘_’, FFullDeptName)
二、截取_第2次出现的位置
CHARINDEX(‘_’, FFullDeptName, CHARINDEX(‘_’, FFullDeptName) + 1)
三、截取_第3次出现的位置
CHARINDEX(‘_’,FFullDeptName,CHARINDEX(‘_’, FFullDeptName, CHARINDEX(‘_’, FFullDeptName) + 1)+1 )
四、截取_第2次出现的位置和第3次出现新的位置之间的字符串
SUBSTRING(
FFullDeptName,
CHARINDEX ( ‘_’, FFullDeptName, CHARINDEX ( ‘_’, FFullDeptName ) + 1 )+1,
CHARINDEX ( ‘_’, FFullDeptName, CHARINDEX ( ‘_’, FFullDeptName, CHARINDEX ( ‘_’, FFullDeptName ) + 1 ) + 1 ) – CHARINDEX ( ‘_’, FFullDeptName, CHARINDEX ( ‘_’, FFullDeptName ) + 1 )-1 )
————————————————
                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/m0_47308415/article/details/134059554

OutputCache 导致页面下载的解决办法 - 寻自己 - 博客园

mikel阅读(37)

来源: OutputCache 导致页面下载的解决办法 – 寻自己 – 博客园

ASP.NET 中的 OutputCache  非常的有用,但是加上后,老是碰见浏览器下载页面的情况,让人十分费解。最后,在 search 了半天后,发现的解决方案都是加上 VaryByHeader=”Content-Type”  这个。但是加上之后,发现不起作用,还仍然会下载。

最后,再请教dudu 之后,给出了一个很完美的解决方案,该解决方案就是重写 Global.asax 中的 Application_BeginRequest 方法,判断页面类型,如果为 “text/vnd.wap.wml” ,则不缓存页面,经过高访问量的测试,这个方法是可靠可行的,没有性能问题的,可以放心大胆的使用

代码:

复制代码
protected void Application_BeginRequest(Object sender, EventArgs e)

{

//use outputcache

string acceptTypes = Request.Headers[“Accept”];

if(!string.IsNullOrEmpty(acceptTypes)&&acceptTypes.ToLower().Contains(“text/vnd.wap.wml”))

{

Response.Cache.SetCacheability(HttpCacheability.NoCache);

}

}

复制代码

使用上之后,服务器的 CPU 占用,立即降低下来了,下面备注下使用 OutPutCache 的好处:直接从内存读页面,页面响应速度更快,用户体验更好;大大的降低了服务器的压力,特别是对于高并发的网站,特别是 CPU 的压力;减少了 DB 的强求,降低 DB(数据库)的压力。

以上就是  OutputCache 导致页面下载的解决办法,如果对你有所帮助,请留言或点击推荐

已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问。 - 特洛伊-Micro - 博客园

mikel阅读(44)

来源: 已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问。 – 特洛伊-Micro – 博客园

已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问。

与基础事务管理器的通信失败。

 

.net 代码里 写事务代码

如:

using System.Transactions;

using (TransactionScope ts = new TransactionScope())
{

}
ts.Complete();

 

 

DTC登陆账户为:NT Authority/NetworkService

防火墙里

SQLServer服务器上配置:IP 和计算机名

 

在web服务器上配置:ip 和计算机全名

 

SqlServer共用表达式(CTE)With As 处理递归查询 - 天才卧龙 - 博客园

mikel阅读(66)

来源: SqlServer共用表达式(CTE)With As 处理递归查询 – 天才卧龙 – 博客园

共用表表达式(CTE)可以看成是一个临时的结果集,可以再SELECT,INSERT,UPDATE,DELETE,MARGE语句中多次引用。

一好处:使用共用表表达式可以让语句更加清晰简练。

1.可以定义递归公用表表达式(CTE)

2.当不需要将结果集作为视图被多个地方引用时,CTE可以使其更加简洁

3.GROUP BY语句可以直接作用于子查询所得的标量列

4.可以在一个语句中多次引用公用表表达式(CTE)

二定义:公用表达式的定义非常简单,只包含三部分:

  1.   公用表表达式的名字(在WITH之后)
  2.   所涉及的列名(可选)
  3.   一个SELECT语句(紧跟AS之后)

在MSDN中的原型:

WITH expression_name [ ( column_name [,...n] ) ]
AS
( CTE_query_definition )

按照是否递归,可以将公用表(CTE)表达式分为递归公用表表达式和非递归公用表表达式.

非递归公用表表达式(CTE)

非递归公用表表达式(CTE)是查询结果仅仅一次性返回一个结果集用于外部查询调用。并不在其定义的语句中调用其自身的CTE

   非递归公用表表达式(CTE)的使用方式和视图以及子查询一致

1
2
3
4
5
WITH cte_Test AS
(
SELECT FROM dbo.SysOrganization
)
SELECT FROM cte_Test

公用表表达式的好处之一是可以在接下来一条语句中多次引用:

 

只能接下来一条使用:

由于CTE只能在接下来一条语句中使用,因此,当需要接下来的一条语句中引用多个CTE时,可以定义多个,中间用逗号分隔:

 

递归公用表表达式(CTE)

递归公用表表达式很像派生表(Derived Tables ),指的是在CTE内的语句中调用其自身的CTE.与派生表不同的是,CTE可以在一次定义多次进行派生递归.对于递归的概念,是指一个函数或是过程直接或者间接的调用其自身,递归的简单概念图如下:

 

对于递归公用表达式来说,实现原理也是相同的,同样需要在语句中定义两部分:

  •    基本语句
  •    递归语句

SQL这两部分通过UNION ALL连接结果集进行返回:

 

 

当然,越强大的力量,就需要被约束.如果使用不当的话,递归CTE可能会出现无限递归。从而大量消耗SQL Server的服务器资源.因此,SQL Server提供了OPTION选项,可以设定最大的递归次数:

还是上面那个语句,限制了递归次数:

 

 

2. CTE后面也可以跟其他的CTE,但只能使用一个with,多个CTE中间用逗号(,)分隔,如下面的SQL语句所示:

复制代码
ith
cte1 as
(
    select * from table1 where name like 'abc%'
),
cte2 as
(
    select * from table2 where id > 20
),
cte3 as
(
    select * from table3 where price < 100
)
select a.* from cte1 a, cte2 b, cte3 c where a.id = b.id and a.id = c.id
复制代码

3. 不能在 CTE_query_definition 中使用以下子句:

复制代码
(1)COMPUTE 或 COMPUTE BY
 
(2)ORDER BY(除非指定了 TOP 子句)
 
(3)INTO
 
(4)带有查询提示的 OPTION 子句
 
(5)FOR XML
 
(6)FOR BROWSE
复制代码

4.如果将 CTE 用在属于批处理的一部分的语句中,那么在它之前的语句必须以分号结尾,如下面的SQL所示:

复制代码
declare @s nvarchar(3)
set @s = 'C%'
;  -- 必须加分号
with
t_tree as
(
    select CountryRegionCode from person.CountryRegion where Name like @s
)
select * from person.StateProvince where CountryRegionCode in (select * from t_tree)
复制代码

如果将 CTE 用在属于批处理的一部分的语句中,那么在它之前的语句必须以分号结尾,如下面的SQL所示:

复制代码
declare @s nvarchar(3)
set @s = 'C%'
;  -- 必须加分号
with
t_tree as
(
    select CountryRegionCode from person.CountryRegion where Name like @s
)
select * from person.StateProvince where CountryRegionCode in (select * from t_tree)
复制代码

最后贴出一个递归相关的语句

复制代码
WITH CTE_Organization([SpClassifyId],[ParentClassifyId],[ClassifyName],ClassifyStatus,IsSiteInspection,IsPerformance,IsAfterPerformance,IsPmInterview,Iscbfy,IsStorage,IsRequired )
 AS 
 (SELECT [SpClassifyId],[ParentClassifyId],[ClassifyName],ClassifyStatus,IsSiteInspection,IsPerformance,IsAfterPerformance,IsPmInterview,Iscbfy,IsStorage,IsRequired 
 FROM dbo.SM_SupplierClassify 
 WHERE [ClassifyName] like '%电梯工程%' and ClassifyStatus='Active' 
 UNION ALL 
 SELECT o.[SpClassifyId],o.[ParentClassifyId],o.[ClassifyName],o.ClassifyStatus,o.IsSiteInspection,o.IsPerformance,o.IsAfterPerformance,o.IsPmInterview,o.Iscbfy,o.IsStorage,o.IsRequired 
 FROM dbo.SM_SupplierClassify o INNER JOIN CTE_Organization oo ON o.[SpClassifyId]=oo.[ParentClassifyId]) 
 SELECT distinct * FROM CTE_Organization
复制代码

上述递归相关的表脚本为:

复制代码
CREATE TABLE [dbo].[SM_SupplierClassify](
    [SpClassifyId] [varchar](100) NOT NULL,
    [ClassifyName] [nvarchar](50) NOT NULL,
    [ClassifyFullName] [nvarchar](100) NULL,
    [ContactPerson] [nvarchar](50) NULL,
    [ContactPhone] [varchar](50) NULL,
    [ParentClassifyId] [varchar](100) NULL,
    [ClassifyLevel] [int] NULL,
    [FullName] [nvarchar](200) NULL,
    [FullId] [varchar](2000) NULL,
    [ClassifyStatus] [varchar](50) NULL,
    [ClassifyRemark] [nvarchar](200) NULL,
    [IsSiteInspection] [bit] NULL,
    [IsPerformance] [bit] NULL,
    [IsAfterPerformance] [bit] NULL,
    [IsPmInterview] [bit] NULL,
    [SeqNo] [int] NULL,
    [Isdeleted] [bit] NULL,
    [CreateUserId] [int] NULL,
    [CreateUserName] [nvarchar](50) NULL,
    [CreateDate] [datetime] NULL,
    [ModifyUserId] [int] NULL,
    [ModifyUserName] [nvarchar](50) NULL,
    [ModifyDate] [datetime] NULL,
    [ForefatherClassifyName] [nvarchar](50) NULL,
    [SupplierClassNo] [nvarchar](100) NULL,
    [Iscbfy] [bit] NULL,
    [IsStorage] [bit] NULL,
    [IsRequired] [bit] NULL,
    [IsMoreContract] [bit] NULL,
PRIMARY KEY CLUSTERED 
(
    [SpClassifyId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
复制代码

数据为:https://files.cnblogs.com/files/chenwolong/%E6%95%B0%E6%8D%AE.zip

@陈卧龙的博客

SQL Server 事务日志文件过大 解决方案_sqlserver日志文件过大-CSDN博客

mikel阅读(56)

来源: SQL Server 事务日志文件过大 解决方案_sqlserver日志文件过大-CSDN博客

事务日志文件(Transaction Log File)是用来记录数据库更新情况的文件,扩展名为ldf。当出现以下情况时,就会报“事务日志已满”的错误:

日志文件没有设置了自动增长,当记录超过初始大小;

日志文件设置了自动增长,“最大文件大小”设置了具体的大小(如2000M),当文件达到设置的大小时。

解决SQL Server数据库事务日志已满的方法
要解决事务日志已满的问题,可以采用以下三种方法,截断日志、收缩日志文件以及修改数据库恢复模式.

修改数据库恢复模式
将数据库恢复模式从“完整模式”或“大容量日志恢复模式”更改为“简单模式”可以解决SQL Server数据库事务日志已满问题。但是,请注意这种方法可能会导致数据丢失。以下是修改数据库恢复模式的步骤:

1. 在 SQL Server Management Studio 中,右键单击数据库,选择“属性”。

 

2. 在“选项”中,将“恢复模式”设置为“简单”,然后点击“确定”

 

3. 在 SQL Server Management Studio 中,右键单击数据库,选择“任务”->“备份”。

 

4. 在“备份类型”中,选择“日志”,点击“确定”。

 

截断日志
截断日志是解决SQL Server数据库事务日志已满问题的较简单方法。通过截断日志,可以清除日志文件中的旧数据,从而释放空间。

在对象资源管理器中,连接到 SQL Server 数据库引擎的实例,然后展开该实例。
展开“数据库”,再右键单击要截断日志的数据库。
指向“任务”,指向“收缩”,然后选择“文件”。
选择文件的文件类型。可用的选项包括“数据”和“日志”文件。默认选项为“数据”。
在与以上所选的“文件类型”相关联的文件组列表中选择文件组。
从所选文件组和文件类型的可用文件列表中选择文件。
选中“释放未使用的空间”选项,将为操作系统释放文件中所有未用空间,并尝试将行重新定位到未分配页。
根据需要,输入在收缩数据库后数据库文件中要保留的最大可用空间百分比。值可以介于 0 和 99 之间。
请注意,在收缩日志文件之前,需要将数据库的恢复模式更改为简单模式。此外,收缩日志文件的步骤与截断日志文件的步骤类似,但是收缩日志文件会将日志文件的大小缩小到指定的大小,而截断日志文件只是删除不活动的虚拟日志文件以释放空间。

总之,使用 SQL Server Management Studio 截断日志的方法包括连接到 SQL Server 数据库引擎的实例,展开“数据库”,右键单击要截断日志的数据库,指向“任务”,指向“收缩”,然后选择“文件”。请注意,在执行截断操作之前,应该备份数据库以防止数据丢失。

收缩日志文件
收缩日志文件是另一种解决SQL Server数据库事务日志已满问题的方法。通过收缩日志文件,可以压缩日志文件的大小,从而释放空间。

在 SQL Server 中,可以使用 SQL Server Management Studio 或 Transact-SQL 来收缩数据或日志文件。以下是使用 SQL Server Management Studio 收缩日志文件的步骤:

在对象资源管理器中,连接到 SQL Server 数据库引擎的实例,然后展开该实例。

展开“数据库”,再右键单击要收缩的数据库。

指向“任务”,指向“收缩”,然后选择“文件”。

 

选择文件的文件类型。可用的选项包括“数据”和“日志”文件。默认选项为“数据”。

在与以上所选的“文件类型”相关联的文件组列表中选择文件组。

从所选文件组和文件类型的可用文件列表中选择文件。

选中“释放未使用的空间”选项,将为操作系统释放文件中所有未用空间,并尝试将行重新定位到未分配页。

根据需要,输入在收缩数据库后数据库文件中要保留的最大可用空间百分比。值可以介于 0 和 99 之间。

请注意,收缩日志文件的步骤与收缩数据文件的步骤略有不同。在收缩日志文件之前,需要将数据库的恢复模式更改为简单模式。以下是使用 Transact-SQL 收缩日志文件的步骤:

将数据库的恢复模式更改为简单模式。
截断事务日志。
收缩日志文件。
具体的 Transact-SQL 命令如下:

— 将数据库的恢复模式更改为简单模式
ALTER DATABASE database_name SET RECOVERY SIMPLE;
— 截断事务日志
BACKUP LOG database_name WITH TRUNCATE_ONLY;
— 收缩日志文件
DBCC SHRINKFILE (file_name, target_size);

其中,file_name 是要收缩的日志文件的逻辑名称,target_size 是要收缩到的目标大小。

总之,收缩日志文件的步骤包括将数据库的恢复模式更改为简单模式、截断事务日志、收缩日志文件。请注意,在执行收缩操作之前,应该备份数据库以防止数据丢失。

使用傲梅企业备份网络版软件备份 SQL Server 数据库并解决事务日志已满问题
如果您的 SQL Server 数据库事务日志已满,并且您正在使用 SSMS 解决该问题,您也可以考虑使用傲梅企业备份网络版软件来备份数据库。傲梅企业备份网络版提供了以下功能:

◉ 提供系统/磁盘/分区/文件备份,助您创建集中备份对于 LAN 内的所有客户端。它还提供 SQL Server 备份,用于在一台 PC/服务器上备份多个实例。
◉ 它使您能够使用计划功能创建自动备份任务。有四种可用的计划模式:一次、每日、每周和每月。
◉ 支持SQL Server 2019/2017/2016/2014/2012/2008(R2)/2005数据库备份。
◉ 它可以安装在Windows Server(Windows Server 2019/2016/2012/2011/2008/2003等)和Windows PC(Windows 10/8.1/8/7/Vista/XP)上。

使用傲梅企业备份网络版软件备份 SQL Server 数据库可以帮助您解决事务日志已满的问题。下面是使用傲梅企业备份网络版备份 SQL Server 数据库的步骤:

1. 在局域网内的其中一台计算机上安装傲梅企业备份网络版作为中央管理计算机。

2.安装客户端程序

启动傲梅企业备份网络版 并转到 “计算机” > “未控制的计算机” > “安装客户端”。您将看到如下两个选项:

客户端手动安装:点击“下一步”即可得到客户端程序安装文件。将安装文件复制到装有 SQL Server 的计算机上,并以管理员身份运行它以安装傲梅企业备份网络版 Agent。

远程客户端安装:点击“下一步”,您将拥有局域网内所有可用的计算机。选择装有SQL Server 的计算机,输入它的用户名和密码,然后单击“安装”。

 

3.请求控制

3.1. 如果您手动安装了客户端程序,客户端计算机将列在 “计算机” > “未控制的计算机”下。勾选装有SQL Server的电脑,点击 “请求控制” 获取控制权限。 提供了两种方法:

输入账号:输入客户端的用户名和密码,点击“确定”。

通过发送消息:程序将向客户端计算机发送消息。在客户端计算机上单击“同意”以授权访问。

 

3.2. 如果您远程安装了客户端程序,客户端计算机将列在 “计算机” > “已控制的计算机”下。在这种情况下,您无需请求控制权。

现在您可以通过 傲梅企业备份网络版每天执行SQL Server自动备份,步骤如下:

1. 转到 “任务” 选项卡,单击 “新建任务” 并选择 “SQL Server 备份”。

 

2. 在弹出窗口中,根据需要编辑任务名称。然后, 在“第一步”栏中点击 “添加计算机” ,选择带有SQL Server数据库的受控计算机。

 

3. 单击“步骤 2”列,然后单击“添加”。该程序将检测计算机上的所有 SQL Server 实例。选择要备份的实例和数据库,然后单击“确定”。

 

4. 单击“第 3 步”列,然后单击“添加存储”。键入网络共享或 NAS 路径以添加目标位置以存储备份文件。

 

5. 单击左下角的“计划并选择您要为其创建计划的计算机”。在“日程设置”窗口的下拉列表中选择“每天” ,完成相应的设置。您还可以通过单击“高级”选择运行完整/差异备份。

 

6. 确认操作,点击 “开始备份”。您可以在此处选择“仅创建任务”或“创建并执行任务”。

 

结论
以上是解决 SQL Server数据库事务日志已满问题的多种方法。截断日志和收缩日志文件是较为简单的方法,但可能会导致数据丢失。修改数据库恢复模式可以解决问题,但也可能会导致数据丢失。使用傲梅企业备份网络版软件备份 SQL Server 数据库是最安全的方法,可以保证数据的完整性。
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_41497074/article/details/131675312

解除对svchost.exe的疑惑_termsvcs-CSDN博客

mikel阅读(51)

来源: 解除对svchost.exe的疑惑_termsvcs-CSDN博客

Svchost.exe、lsass.exe、wdfmgr.exe,打开进程列表后你会发现一大堆不知用途的进程,究竟是系统进程还是木马病毒?如果打开系统文件夹,一大堆奇奇怪怪名称的文件,更是会把你弄得晕头转向。很多朋友因此而始终抱有一种未知的恐惧,认为木马、黑客无处不在,即使是高手,也不能把这些陌生的系统文件说个明明白白。为消除大家的疑惑,从这期开始为大家带来一档新的连载栏目——系统蓝色档案为大家曝光这些隐秘文件的秘密。两位主人公,现在就来认识一下。

主人公介绍

小菜:刚接触电脑不久的菜鸟,但对电脑知识有着非常浓厚的学习兴趣,常说的一句话是“菜鸟先飞”。

大嘴:乐于助人的老鸟,经常被别人冠以“大嘴高手”称号,不过这并不是指他嘴特别大,而是一谈到电脑知识就滔滔不绝。

一、紧急状况:系统发现严重病毒

小菜刚刚学习了进程的概念和知识,于是就打开“任务管理器”观察系统中的进程,这一看不要紧,还真发现了一个“病毒”——Svchost.exe,这家伙在系统进程列表中竟然有5个之多(见图1),于是小菜就逐个结束这些进程,没想到第二个进程结束后还会再生,而结束第四个进程时更离谱,系统提示“系统即将关机,离关机还有60秒”,进程再生、错误提示,这些典型的病毒“症状”更让小菜相信“Svchost.exe”是病毒无疑,但无法结束进程,又该怎么清除病毒呢?小菜只好请来了大嘴。

图1 数量众多的SVCHOST进程

大嘴过来后还没看电脑,就先告诉小菜,系统中的Svchost.exe进程是正常系统进程,不是病毒,不仅仅是你,其他朋友一看到系统中这么多的Svchost.exe进程,第一反应也感觉它是病毒,虽然系统中有多个Svchost.exe进程是正常的,但也不保证都是正常的。听起来似乎有些矛盾?这让小菜更有些迷糊,大嘴坐下后给小菜详细讲了起来。

二、松了口气:Svchost.exe是台“CD机”

1.服务装在“CD机”里

Svchost.exe是NT内核操作系统(Windows 2000/XP/2003都属于NT内核操作系统)独有的进程,“Svchost”其实就是“Service Host”(服务宿主)的缩写。微软官方对它的定义是:Svchost.exe是从动态链接库(DLL)中运行的服务的通用主机进程名称,通俗讲,它就是一个服务装载器。大家可以把每个服务想象成一张音乐CD,而Svchost.exe就是用来播放这种CD的CD机。

2.为什么用“CD机”装服务

由于Windows 2000/XP系统服务越来越多,以EXE单独进程的形式启动所有服务会大大增加系统负担,为节省系统资源,微软将一些系统服务以动态链接库(DLL)形式实现,而Svchost.exe就是用来装载这些DLL文件以启动系统服务的程序。没有人会为了发行一张CD而制作一台专用播放此CD的CD机,微软也一样。

3.系统里有几台这样的“CD机”

那为什么系统进程列表中的Svchost.exe会有多个呢?微软为了让系统能更好地进行服务控制,就允许多个Svchost.exe进程同时运行,每个Svchost.exe进程可以包含一组服务,想像一下可以同时容纳3张甚至更多CD的多碟CD机。打开注册表[HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/CurrentVersion/Svchost]主键,在窗口右侧可以看到许多键值,这里的每个键值都代表一组服务,键值数据则包含了该组服务下面运行的服务名称列表,每组服务启动时都会通过单独的Svchost.exe进程来装载。Windows XP中默认共有六组服务(见图2),其中imgsvc、NetworkService、rpcss、termsvcs四个组,它们都只有一个服务运行,这些服务启动后的Svchost.exe进程用户名为“SYSTEM”。而LocalService和netsvcs组都启动了多个服务,它们的Svchost.exe进程用户名分别为“LOCAL SERVICE”和“NETWORD SERVICE”,从图1中可以看到这种区别。

图2 众多svchost进程的区别

当然了,这六组服务通常并不都是启动状态的,根据系统启动的服务不同,反映在系统进程列表中的Svchost.exe进程数量也是不同的,Windows XP会有四个到六个Svchost.exe进程,而Windows 2000通常则会有两个Svchost.exe进程。

小提示:点击“开始→运行”,在运行框中输入“CMD”回车,然后在打开的命令行窗口中输入“Tasklist /svc”(不含引号)命令,可以更直观地看到每个Svchost.exe进程装载的服务名称列表(见图3)。

图3 查看svchost进程装载的服务名称

4.获取每张“CD”的详细信息

如果想更进一步了解Svchost.exe装载的这些服务都是什么功能,可以记下键值数据中的服务名称,例如“RpcSs”,接着打开注册表的[HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services],再打开下面的“RpcSs”子键,在右边的“Description”键值中就可以看到该服务的描述,而在“ImagePath”键值数据中则可以看到这个服务的运行命令正是“%SystemRoot%/system32/svchost -k rpcss”(见图4)。而在“RpcSs”子键下还有一个“Parameters”(参数)子键,其右边的“ServiceDll”键值数据“%SystemRoot%/system32/rpcss.dll”则表明了RpcSs服务启动时调用的是系统目录下的“Rpcss.dll”文件,这就好像你原来只知道CD中歌曲的歌名,现在又让你能够查到这首歌的演唱者。

图4 查看svchost的具体功能

如果觉得通过注册表查询服务名称了解其属性不太方便,也可以使用“全能助手用Windows服务管理专家”(以下简称“服务管理专家”)来查询,运行软件后单击“All Win32 Services”分支,在右侧服务列表中根据服务名称索引即可快速找到要查询的服务,单击服务名称,即可看到该服务的启动命令以及调用的DLL文件等相关信息(见图5)。同时软件还专门设计了Svchost Group分支,可以快速查询LocalService和netsvcs组中的服务详细信息。

图5 用工具查看svchost的情况

全能助手用Windows服务管理专家 小档案

软件名称:

全能助手用Windows服务管理专家

软件版本:1.02

软件大小:164KB

软件授权:免费

适用平台:Windows 2000/XP

下载地址:

三、危机仍在:小心病毒的骗局

由于Svchost.exe进程的特殊性,它隐藏了真正运行的程序的名称,在表面看到的只是Svchost.exe进程,这个特性同时也让许多病毒、木马有空可钻,企图以此迷惑用户。那么如何判断系统中的多个Svchost.exe进程是否正常呢?下面针对这类病毒常用的几种欺骗手法来进行分析。

骗局1:利用假冒Svchost.exe名称的病毒程序

火眼金睛:这种方式运行的病毒并没有直接利用真正的Svchost.exe进程,而是启动了另外一个名称同样是Svchost.exe的病毒进程,由于这个假冒的病毒进程并没有加载系统服务,它和真正的Svchost.exe进程是不同的,只需在命令行窗口中运行一下“Tasklist /svc”,如果看到哪个Svchost.exe进程后面提示的服务信息是“暂缺”(见图6),而不是一个具体的服务名,那么它就是病毒进程了,记下这个病毒进程对应的PID数值(进程标识符),即可在任务管理器的进程列表中找到它,结束进程后,在C盘搜索Svchost.exe文件,也可以用第三方进程工具直接查看该进程的路径,正常的Svchost.exe文件是位于%systemroot%/System32目录中的,而假冒的Svchost.exe病毒或木马文件则会在其他目录,例如“w32.welchina.worm”病毒假冒的Svchost.exe就隐藏在Windows/System32/Wins目录中,将其删除,并彻底清除病毒的其他数据即可。

图6 查看可疑svchost进程

骗局2:一些高级病毒则采用类似系统服务启动的方式,通过真正的Svchost.exe进程加载病毒程序,而Svchost.exe是通过注册表数据来决定要装载的服务列表的,所以病毒通常会在注册表中采用以下方法进行加载:

添加一个新的服务组,在组里添加病毒服务名
在现有的服务组里直接添加病毒服务名
修改现有服务组里的现有服务属性,修改其“ServiceDll”键值指向病毒程序

判断方法:病毒程序要通过真正的Svchost.exe进程加载,就必须要修改相关的注册表数据,可以打开[HKEY_LOCAL_MACHINE/Software/Microsoft/WindowsNT/CurrentVersion/Svchost],观察有没有增加新的服务组,同时要留意服务组中的服务列表,观察有没有可疑的服务名称,通常来说,病毒不会在只有一个服务名称的组中添加,往往会选择LocalService和netsvcs这两个加载服务较多的组,以干扰分析,还有通过修改服务属性指向病毒程序的,通过注册表判断起来都比较困难,这时可以利用前面介绍的服务管理专家,分别打开LocalService和netsvcs分支,逐个检查右边服务列表中的服务属性,尤其要注意服务描述信息全部为英文的,很可能是第三方安装的服务,同时要结合它的文件描述、版本、公司等相关信息,进行综合判断。例如这个名为PortLess BackDoor的木马程序,在服务列表中可以看到它的服务描述为“Intranet Services”,而它的文件版本、公司、描述信息更全部为空(见图7),如果是微软的系统服务程序是绝对不可能出现这种现象的。从启动信息“C:/WINDOWS/System32/svchost.exe -k netsvcs”中可以看出这是一款典型的利用Svchost.exe进程加载运行的木马,知道了其原理,清除方法也很简单了:先用服务管理专家停止该服务的运行,然后运行regedit.exe打开“注册表编辑器”,删除[HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/IPRIP]主键,重新启动计算机,再删除%systemroot%/System32目录中的木马源程序“svchostdll.dll”,通过按时间排序,又发现了时间完全相同的木马安装程序“PortlessInst.exe”,一并删除即可。

图7 利用多项信息进行综合判断

畅捷通T+ v17任意文件上传漏洞复现_/tplus/sm/setupaccount/upload.aspx?preload=1-CSDN博客

mikel阅读(93)

来源: 畅捷通T+ v17任意文件上传漏洞复现_/tplus/sm/setupaccount/upload.aspx?preload=1-CSDN博客

1.前言
8月29晚上就开始收到通知,让我们来排查一下是否有使用畅捷通的系统,说是疑似0day导致很多用户被植入勒索病毒,一时间风头十足。第二天很多平台都更新的防护策略,本次漏洞是任意文件上传漏洞,如果网站前端存在waf等安全设备,应该是可以被正常拦截的,所以也无需过于担心。

2.漏洞复现
2.1 漏洞信息:
适用版本:<=v17.0
漏洞类型:任意文件上传
漏洞危害:可实现RCE获取主机权限
涉及接口:/tplus/SM/SetupAccount/Upload.aspx?preload=1
2.2 漏洞分析
这是一个上传漏洞,所以我们需要构造一个post的上传请求,请求接口即为/tplus/SM/SetupAccount/Upload.aspx?preload=1,不难看出,这是一个上传用户个人头像的接口。
通过源码分析可知:

上传过程中只检测了Content-Type这一个参数,攻击者可以随意构造filename的参数从而 上传任意文件,这就导致了漏洞的产生。

不难看出上传路径为当前目录下的images目录,即为/tplus/SM/SetupAccount/images/目录。
到这里漏洞的产生原因就很清楚了,算是一个比较常见的上传漏洞,接下来就是常规的文件上传了。

2.3 漏洞利用
我们可以构造如下参数的上传包(出于和谐考虑就不贴完整的上传包了):

Content-Type: multipart/form-data; boundary=—————————33007515338361897914262830846

—————————–33007515338361897914262830846
Content-Disposition: form-data; name=”File1″; filename=”test.html”
Content-Type: image/jpeg

test
—————————–33007515338361897914262830846–

上传之后,如果对方在漏洞利用范围就会成功返回200
此时我们访问一下/tplus/SM/SetupAccount/images/1.html即可访问对应文件,至此这个漏洞的基本复现就完成了。

3.深度利用
注:非授权测试是违法行为,请大家不要恶意攻击他人的业务系统!
漏洞到复现程度在上文就已经实现了,但是实际测试中如果你想要进一步利用就会出现一些问题。

你会发现aspx的文件并不能正常解析,这是由于根目录下的PrecompiledApp.config 中的updatable值设置成了false。导致后面上传的文件无法进行编译。aspx程序无法正常执行。
当然,遇到这种情况,部分环境是可以尝试asp文件进行getshell的。因为asp文件并非.Net处理。这个就只能看运气了绝大多数环境可能并不支持执行asp文件。
但是这种情况并非无法解决问题,我们可以通过手动编译的方式上传编译后的dll文件来提供aspx文件的运行环境。具体操作在这里就不具体分析了,等风头过了之后再考虑补全一下操作方案。
有想复现的白帽子可以参考
https://www.buaq.net/go-53733.html

4.修复方案
官方补丁, https://www.chanjetvip.com/product/goods/goods-detail?id=53aaa40295d458e44f5d3ce5
WAF拦截,由于这是一个常规的上传漏洞,很多waf都是有默认的拦截能力的,需要的话也可以将/tplus/SM/SetupAccount/Upload.aspx路径进行主动拦截。
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/xiayu729100940/article/details/126646035

C#中使用log4net记录本地日志的方法和日志工具YALV使用_c# .net 4.0 本地日志-CSDN博客

mikel阅读(63)

来源: C#中使用log4net记录本地日志的方法和日志工具YALV使用_c# .net 4.0 本地日志-CSDN博客

使用log4net记录本地日志,大大方便程序调试,和异常分析

第一步,首先从Visual Studio中的Nuget包管理中搜索下载 Log4Net dll文件 如下图:

 

 

打开配置文件WinFrom或Wpf就是App.config

Web就是web.config,通过推荐配置可以使用日志工具进行日志查看,非常fashion

日志工具下载https://lukepet.github.io/YALV/

 

 

第一种配置

<?xml version=”1.0″?>
<configuration>
<startup>
<supportedRuntime version=”v4.0″ sku=”.NETFramework,Version=v4.0″/>
</startup>
<configSections>
<section name=”log4net” type=”log4net.Config.Log4NetConfigurationSectionHandler, log4net”/>
</configSections>

<log4net>
<!– 定义输出到文件中 –>
<appender name=”RollingLogFileAppender” type=”log4net.Appender.RollingFileAppender”>
<!–定义文件存放位置–>
<file value=”log\\”/>
<!–日志名称–>
<file value=”errorLog.txt”/>
<appendToFile value=”true”/>
<rollingStyle value=”Date”/>
<datePattern value=”yyyy\\yyyyMM\\yyyyMMdd’.txt'”/>
<staticLogFileName value=”false”/>

<!–日志最大可备份数–>
<maxSizeRollBackups value=”10″/>
<!–日志文件大小–>
<maximumFileSize value=”1024KB”/>
<layout type=”log4net.Layout.PatternLayout”>
<!–每条日志末尾的文字说明–>
<!–输出格式–>
<!–样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] – info–>
<conversionPattern value=”%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n出错类:%logger property: [%property{NDC}] – %n错误描述:%message%newline %n”/>
</layout>
</appender>
<root>
<level value=”ERROR”/>
<!–文件形式记录日志–>
<appender-ref ref=”RollingLogFileAppender”/>
</root>
</log4net>
</configuration>

第二种配置

<log4net>
<logger name=”logerror”>
<level value=”ERROR” />
<appender-ref ref=”ErrorAppender” />
</logger>
<logger name=”loginfo”>
<level value=”INFO” />
<appender-ref ref=”InfoAppender” />
</logger>
<appender name=”ErrorAppender” type=”log4net.Appender.RollingFileAppender”>
<param name=”File” value=”Log\\LogError\\” />
<param name=”AppendToFile” value=”true” />
<param name=”MaxSizeRollBackups” value=”100″ />
<param name=”MaxFileSize” value=”10240″ />
<param name=”StaticLogFileName” value=”false” />
<param name=”DatePattern” value=”yyyyMMdd&quot;.txt&quot;” />
<param name=”RollingStyle” value=”Date” />
<layout type=”log4net.Layout.PatternLayout”>
<param name=”ConversionPattern” value=”%n异常时间:%d %n异常级别:%-5p%n异常内容:%m%n” />
</layout> <!–&lt; &gt; = <> %n = 回车–>
</appender>
<appender name=”InfoAppender” type=”log4net.Appender.RollingFileAppender”>
<param name=”File” value=”Log\\LogInfo\\” />
<param name=”AppendToFile” value=”true” />
<param name=”MaxFileSize” value=”10240″ />
<param name=”MaxSizeRollBackups” value=”100″ />
<param name=”StaticLogFileName” value=”false” />
<param name=”DatePattern” value=”yyyyMMdd&quot;.txt&quot;” />
<param name=”RollingStyle” value=”Date” />
<layout type=”log4net.Layout.PatternLayout”>
<param name=”ConversionPattern” value=”日志时间:%d %n日志级别:%-5p %n日志内容:%m%n%n” />
</layout>
</appender>
</log4net>

第三种配置

<configSections>
<section name=”log4net” type=”log4net.Config.Log4NetConfigurationSectionHandler, log4net” />
</configSections>
<log4net>
<logger name=”SysRFLogger”>
<level value=”Debug” />
<appender-ref ref=”SysRFAppender” />
</logger>
<logger name=”DebugRFLogger”>
<level value=”DEBUG” />
<appender-ref ref=”DebugAppender” />
</logger>
<logger name=”MsgLogger”>
<level value=”DEBUG” />
<appender-ref ref=”MsgAppender” />
</logger>
<logger name=”OperInfoLogger”>
<level value=”DEBUG” />
<appender-ref ref=”OperInfoAppender” />
</logger>
<appender name=”SysRFAppender” type=”log4net.Appender.RollingFileAppender”>
<file value=”Logs\syslog.log” />
<appendToFile value=”true” />
<rollingStyle value=”Date” />
<preserveLogFileNameExtension value=”true” />
<datePattern value=”yyyyMMdd” />
<layout type=”log4net.Layout.PatternLayout”>
<conversionPattern value=”%date [%thread] %-5level %logger [%property{NDC}] – %message%newline” />
</layout>
</appender>
<appender name=”DebugAppender” type=”log4net.Appender.RollingFileAppender”>
<file value=”Logs\sysDebuglog.log” />
<appendToFile value=”true” />
<rollingStyle value=”Date” />
<preserveLogFileNameExtension value=”true” />
<datePattern value=”yyyyMMdd” />
<layout type=”log4net.Layout.PatternLayout”>
<conversionPattern value=”%date [%thread] %-5level %logger [%property{NDC}] – %message%newline” />
</layout>
</appender>
<appender name=”MsgAppender” type=”log4net.Appender.RollingFileAppender”>
<file value=”Logs\Messagelog.log” />
<appendToFile value=”true” />
<rollingStyle value=”Date” />
<preserveLogFileNameExtension value=”true” />
<datePattern value=”yyyyMMdd” />
<layout type=”log4net.Layout.PatternLayout”>
<conversionPattern value=”%date [%thread] %-5level %logger [%property{NDC}] – %message%newline” />
</layout>
</appender>
<appender name=”OperInfoAppender” type=”log4net.Appender.AdoNetAppender”>
<bufferSize value=”1″ />
<connectionType value=”System.Data.SQLClient.SQLConnection, System.Data, Version=4.0.30319.18020, Culture=neutral, PublicKeyToken=b77a5c561934e089″ />
<commandText value=”INSERT INTO LOG_USEROPERLOG ([ID],[Date],[User],[Flag],[OperInfo],[OperFlag],[OperResult],[Message]) VALUES (@Id,@log_date, @user, @flag, @operinfo,@operflag, @operresult, @message)” />
<parameter>
<parameterName value=”@Id” />
<dbType value=”String” />
<size value=”36″ />
<layout type=”NT.MultithreadingTaskService.Log.Layout.UserOperLayOut,NT.MultithreadingTaskService.Log”>
<param name=”ConversionPattern” value=”%property{ID}” />
</layout>
</parameter>
<parameter>
<parameterName value=”@log_date” />
<dbType value=”DateTime” />
<layout type=”log4net.Layout.RawTimeStampLayout” />
</parameter>
<parameter>
<parameterName value=”@user” />
<dbType value=”String” />
<size value=”64″ />
<layout type=”NT.MultithreadingTaskService.Log.Layout.UserOperLayOut,NT.MultithreadingTaskService.Log”>
<param name=”ConversionPattern” value=”%property{User}” />
</layout>
</parameter>
<parameter>
<parameterName value=”@flag” />
<dbType value=”Int32″ />
<layout type=”NT.MultithreadingTaskService.Log.Layout.UserOperLayOut,NT.MultithreadingTaskService.Log”>
<param name=”ConversionPattern” value=”%property{Flag}” />
</layout>
</parameter>
<parameter>
<parameterName value=”@operinfo” />
<dbType value=”String” />
<size value=”255″ />
<layout type=”NT.MultithreadingTaskService.Log.Layout.UserOperLayOut,NT.MultithreadingTaskService.Log”>
<param name=”ConversionPattern” value=”%property{OperInfo}” />
</layout>
</parameter>
<parameter>
<parameterName value=”@operflag” />
<dbType value=”String” />
<size value=”32″ />
<layout type=”NT.MultithreadingTaskService.Log.Layout.UserOperLayOut,NT.MultithreadingTaskService.Log”>
<param name=”ConversionPattern” value=”%property{OperFlag}” />
</layout>
</parameter>
<parameter>
<parameterName value=”@operresult” />
<dbType value=”String” />
<size value=”255″ />
<layout type=”NT.MultithreadingTaskService.Log.Layout.UserOperLayOut,NT.MultithreadingTaskService.Log”>
<param name=”ConversionPattern” value=”%property{OperResult}” />
</layout>
</parameter>
<parameter>
<parameterName value=”@message” />
<dbType value=”String” />
<size value=”4000″ />
<layout type=”NT.MultithreadingTaskService.Log.Layout.UserOperLayOut,NT.MultithreadingTaskService.Log”>
<param name=”ConversionPattern” value=”%property{Message}” />
</layout>
</parameter>
</appender>
<root>
<level value=”DEBUG” />
<appender-ref ref=”SysRFAppender” />
</root>
</log4net>

第四种配置也是我最喜欢的

<?xml version=”1.0″ encoding=”utf-8″ ?>

<configuration>
<configSections>
<section name=”log4net” type=”log4net.Config.Log4NetConfigurationSectionHandler, log4net”/>
</configSections>

<log4net>

<!–定义输出到文件中–>
<appender name=”RollingLogFileAppender” type=”log4net.Appender.RollingFileAppender”>
<!–定义文件存放位置–>
<file value=”log\\”/>
<appendToFile value=”true”/>
<rollingStyle value=”Date”/>
<datePattern value=”yyyy\\yyyyMM\\yyyyMMdd-HH’.xml'”/>
<staticLogFileName value=”false”/>
<param name=”MaxSizeRollBackups” value=”100″/>
<Encoding value=”UTF-8″/>
<layout type=”log4net.Layout.XmlLayoutSchemaLog4j”>
<locationInfo value=”true”/>
</layout>
</appender>
<root>
<level value=”Debug”/>
<!–文件形式记录日志–>
<appender-ref ref=”RollingLogFileAppender”/>
</root>

</log4net>

</configuration>

XML要放在configuration节点下

使用方法

private ILog _log = LogManager.GetLogger(“”);
一般常用以下几个方法:
_log.Error();
_log.Debug();
_log.Info();

————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/g313105910/article/details/115796506