Saturday, December 12, 2009
email address
http://www.fastmail.fm/
* Server: mail.messagingengine.com
* Port: 143 (or SSL IMAP port 993)
* Username: your FastMail.FM username/login name/email address (must include @fastmail.fm part)
* Password: your FastMail.FM password
* Root folder/path: INBOX
* Folder separator: . (period)
no pop,no IMAP access
http://secure.zapak.com/mail/zapakmail.php
Monday, December 7, 2009
C#调用其他的应用程序
//最小化方式启动
Info.WindowStyle = System.Diagnostics.ProcessWindowStyle.Minimized;
Saturday, December 5, 2009
c# 窗体最小化到托盘
c# winform最小化到托盘,也就是最小化到右下角,其实很简单,winform中有专门的控件。
下面是完整的代码,没太多需要解释的。
先在winform中添加notifyIcon控件,然后激活相应事件,添加代码。因为屏蔽了关闭窗体事件,可以设定一个全局变量bool变量来分辨是哪里引起的close事件。
注意添加Form的SizeChanged事件和NotifyIcon控件的DoubleClick事件
//全家变量bool closeTag = true;
//最小化
private void form1_Resize(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized)
{
NormalToMinimized();
}
}
//close时最小化
private void form1_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
NormalToMinimized();
}
//单击显示窗体
private void notifyIcon_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
this.MinimizedToNormal();
}
}
private void MinimizedToNormal()
{
this.Visible = true;
this.WindowState = FormWindowState.Normal;
notifyIcon.Visible = false;
}
private void NormalToMinimized()
{
this.WindowState = FormWindowState.Minimized;
this.Visible = false;
this.notifyIcon.Visible = true;
}
private void frmMain_FormClosing(object sender, FormClosingEventHandler e)
{
if (closeTag)
{
e.Cancel = true;
NormalToMinimized();
}
}
//托盘右键关闭事件
private void 退出XToolStripMenuItem_Click(object sender, EventArgs e)
{
closeTag = false;
Application.Exit();
}
怎样保证一个窗体始终是处在最顶层的
public bool TopMost {get; set;}
属性值
如果为 true,则将窗体显示为最顶层窗体;否则,为 false。默认为 false。
TopMost只是设置窗口为本程序的最顶层窗口。
而不是系统的,要设置系统的,可以用API:setwindowspos:
[DllImport("user32.dll")]
private static extern int SetWindowPos (int hwnd, int hWndInsertAfter, int x, int y, int cx, int cy, int wFlags);
//int x:窗口新的x坐标。如hwnd是一个子窗口,则x用父窗口的客户区坐标表示
//int y:窗口新的y坐标。如hwnd是一个子窗口,则y用父窗口的客户区坐标表示
//int cx:指定新的窗口宽度
//int cy:指定新的窗口高度
private const int HWND_TOPMOST = -1;
private const int SWP_SHOWWINDOW = 0x40;
SetWindowPos(this.Handle, HWND_TOPMOST, 0, 0, 500, 500, 0x40);
Form in corner of screen
Screen.PrimaryScreen.WorkingArea.Bottom - Height);
Tuesday, December 1, 2009
C#连接MySQL数据库方法
1、用MySQLDriverCS连接MySQL数据库
先下载和安装MySQLDriverCS,地址:
http://sourceforge.net/projects/mysqldrivercs
在安装文件夹下面找到MySQLDriver.dll,然后将MySQLDriver.dll添加引用到项目中
注:我下载的是版本是 MySQLDriverCS-n-EasyQueryTools-4.0.1-DotNet2.0.exe
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Odbc;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MySQLDriverCS;
namespace mysql
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
MySQLConnection conn = null;
conn = new MySQLConnection(new MySQLConnectionString("localhost", "inv", "root", "831025").AsString);
conn.Open();
MySQLCommand commn = new MySQLCommand("set names gb2312", conn);
commn.ExecuteNonQuery();
string sql = "select * from exchange ";
MySQLDataAdapter mda = new MySQLDataAdapter(sql, conn);
DataSet ds = new DataSet();
mda.Fill(ds, "table1");
this.dataGrid1.DataSource = ds.Tables["table1"];
conn.Close();
}
}
}
2、通过ODBC访问mysql数据库:
参考:http://www.microsoft.com/china/community/Column/63.mspx
1. 安装Microsoft ODBC.net:我安装的是mysql-connector-odbc-3.51.22-win32.msi
2. 安装MDAC 2.7或者更高版本:我安装的是mdac_typ.exe 2.7简体中文版
3. 安装MySQL的ODBC驱动程序:我安装的是 odbc_net.msi
4. 管理工具 -> 数据源ODBC –>配置DSN…
5. 解决方案管理中添加引用 Microsoft.Data.Odbc.dll(1.0.3300)
6. 代码中增加引用 using Microsoft.Data.Odbc;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq; //vs2005好像没有这个命名空间,在c#2008下测试自动生成的
using System.Text;
using System.Windows.Forms;
using Microsoft.Data.Odbc;
namespace mysql
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
string MyConString = "DRIVER={MySQL ODBC 3.51 Driver};" +
"SERVER=localhost;" +
"DATABASE=inv;" +
"UID=root;" +
"PASSWORD=831025;" +
"OPTION=3";
OdbcConnection MyConnection = new OdbcConnection(MyConString);
MyConnection.Open();
Console.WriteLine("\n success, connected successfully !\n");
string query = "insert into test values( 'hello', 'lucas', 'liu')";
OdbcCommand cmd = new OdbcCommand(query, MyConnection);
//处理异常:插入重复记录有异常
try{
cmd.ExecuteNonQuery();
}
catch(Exception ex){
Console.WriteLine("record duplicate.");
}finally{
cmd.Dispose();
}
//***********************用read方法读数据到textbox**********************
string tmp1 = null;
string tmp2 = null;
string tmp3 = null;
query = "select * from test ";
OdbcCommand cmd2 = new OdbcCommand(query, MyConnection);
OdbcDataReader reader = cmd2.ExecuteReader();
while (reader.Read())
{
tmp1 = reader[0].ToString();
tmp2 = reader[1].ToString();
tmp3 = reader[2].ToString();
}
this.textBox1.Text = tmp1 + " " + tmp2 + " " + tmp3;
*/
//************************用datagridview控件显示数据表**************************
string MyConString = "DRIVER={MySQL ODBC 3.51 Driver};" +
"SERVER=localhost;" +
"DATABASE=inv;" +
"UID=root;" +
"PASSWORD=831025;" +
"OPTION=3";
OdbcConnection MyConnection = new OdbcConnection(MyConString);
OdbcDataAdapter oda = new OdbcDataAdapter("select * from customer ", MyConnection);
DataSet ds = new DataSet();
oda.Fill(ds, "employee");
this.dataGridView1.DataSource = ds.Tables["employee"];
*/
MyConnection.Close();
}
}
}
Changing the User Agent in IE (.NET WebBrowser Control) Via C#
I’ve read a lot about this topic over the last couple hours, and all information I found seemed to be going about it the wrong way. Many people suggest changing the registry, but from what I tried it seemed to only allow you to change certain parts of the user agent, instead of the whole string. If you’re interested in this, you’ll want to change:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\5.0\User Agent
Changing part of the User Agent wasn’t the goal though. The next idea I came across was that the WebBrowser.Navigate method took a headers string option that let you inject your own user agent into it. This would be useful if I was using the Navigate method instead of allowing users to click links and submit forms on pages. Luckily I ran into a COM method that lets you intercept all navigations, by form submits, link clicks, or anything else. Using this method, we can cancel the current navigation before it happens, edit the headers, and start the navigation again. I have extended the WebBrowser class so it allows simply setting of the UserAgent property to allow this.
public class ExtendedWebBrowser : WebBrowser
{
bool renavigating = false;
public string UserAgent { get; set; }
public ExtendedWebBrowser()
{
DocumentCompleted += SetupBrowser;
//this will cause SetupBrowser to run (we need a document object)
Navigate("about:blank");
}
void SetupBrowser(object sender, WebBrowserDocumentCompletedEventArgs e)
{
DocumentCompleted -= SetupBrowser;
SHDocVw.WebBrowser xBrowser = (SHDocVw.WebBrowser)ActiveXInstance;
xBrowser.BeforeNavigate2 += BeforeNavigate;
DocumentCompleted += PageLoaded;
}
void PageLoaded(object sender, WebBrowserDocumentCompletedEventArgs e)
{
}
void BeforeNavigate(object pDisp, ref object url, ref object flags, ref object targetFrameName,
ref object postData, ref object headers, ref bool cancel)
{
if (!string.IsNullOrEmpty(UserAgent))
{
if (!renavigating)
{
headers += string.Format("User-Agent: {0}\r\n", UserAgent);
renavigating = true;
cancel = true;
Navigate((string)url, (string)targetFrameName, (byte[])postData, (string)headers);
}
else
{
renavigating = false;
}
}
}
}
Note: To use the method above you’ll need to add a COM reference to “Microsoft Internet Controls”.
I also stumbled across a PInvoke method that had a simpler solution. The following code shows how to change the user agent for the WebBrowser control to GoogleBot’s user agent.
[DllImport("urlmon.dll", CharSet = CharSet.Ansi)]
private static extern int UrlMkSetSessionOption(int dwOption, string pBuffer, int dwBufferLength, int dwReserved);
const int URLMON_OPTION_USERAGENT = 0x10000001;
public void ChangeUserAgent()
{
string ua = "Googlebot/2.1 (+http://www.google.com/bot.html)";
UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, ua, ua.Length, 0);
}
After calling that method, you can just use your WebBrowser as normal. All pages it navigates to will use the user agent you specified. For more information, you can check out the documentation on UrlMkSetSessionOption . The only problem with this method is that the WebBrowser control seems to cache this user agent string, so it will not change the user agent without restarting the process.
Sunday, January 11, 2009
八个有用的WordPress的SQL语句
在过去的十年中,MySQL已经成为广受欢迎的数据库,而WordPress博客使用的是MySQL数据库,虽然使用插件可以解决一些问题,但是实 现某些特殊任务的时候,在phpMyAdmin中执行SQL语句是最简洁的方法,这里就总结八个有用的WordPress系统的SQL语句,用于解决一些 实际碰到的问题。
1、创建备份数据库
备份数据库是首先要做的事情,只需要通过以下方法就可以简单备份数据库:
登录phpMyAdmin后。选择你的WordPress数据库,然后点击“导出”按钮,选择一种压缩方式(可以使用gzip)并单击“执行”按钮,当浏览器提示是否下载的时候,点“是”,将数据库文件下载到本地。
2、批量删除文章修订
WordPress2.6以后的版本增加了一个Post revisions功能,虽然有点用,但文章修订增加了你数据库的大小,我们可以选择批量删除。
登录phpMyAdmin后执行下面的SQL语句即可批量删除。
3、批量删除垃圾评论
一个真实的故事是,我的一个朋友在网上建立了一个博客,有次他花了几天时间外出度假,没有上网,当他回来的时候,登录自己的博客,看到有5000多条评论等待审核,当然,大多数都是垃圾评论,要手动删除这些评论要花大量时间,因此我们可以使用以下办法。
登录phpMyAdmin后执行下面的SQL语句。
要小心,虽然这种解决方案对于处理数百万的垃圾平邮非常有用,但是也会清除未经批准的评论,因此最好还是安装使用Akismet来对付垃圾评论。
4、修改文章属性
你安装WordPress后,admin账户就创建了,不少人都错误的使用这个帐号来写博客,直到他们认识到,这并不是个人帐号。
解决的方法,每篇文章修改作者属性需要大量的时间,下面的这个SQL语句可以帮你快速完成这个功能。
首先你要找到你正确的用户名,使用下面的SQL语句可以找到你的用户ID号。
假设这个ID为NEW_AUTHOR_ID,而管理员admin的ID为OLD_AUTHOR_ID,接着,运行下面的SQL语句。
5、手动重设密码
很多人为了保护自己的博客不被人黑掉,使用了很复杂的密码,这虽然是一件好事,但也经常会发生遗忘管理员密码的事情。
当然,通过电子邮件可以发送给你WordPress重设密码的链接,但如果你无法访问你的邮件地址,那么就只好使用下面的SQL语句来重设你的密码了。
MD5是MySQL内置的哈希函数,用于将密码转换为散列值。
6、更改WordPress的域名
你可能有时候会想要更改你博客的域名,但是WordPress会将你的域名存储在数据库中,因此你要使用下面的SQL语句来修改。
接着,你还要使用下面的SQL将文章的GUID也进行修改。
最后,使用下面的语句将文章里所有旧域名替换为新域名。
7、显示SQL查询数量
在你有话博客性能的时候,了解到查询数据库的数量是非常重要的,为了减少数据库查询,我们需要知道在一个页面上到底有多少个查询。
这一次,不需要登录phpMyAdmin了,你只需要修改footer.php文件,在文件结尾增加下面几行代码即可。
queries in seconds.
8、恢复你的WordPress数据库
当你的数据库因为某些原因(黑客或者升级错误)被损坏或者丢失了,如果你有备份的话,那可以恢复你的WordPress数据库。
登录phpMyAdmin,选择你的WordPress数据库,点“导入”按钮,点“浏览”按钮,然后从你的硬盘选择备份文件,点“执行”按钮就可以将数据库导入。
如果顺利的话,你的WordPress功能将会恢复正常。
十大WordPress安全设置技巧
WordPress是目前世界上使用广泛的博客软件,比较容易受到各种攻击,因此WordPress安全性也是非常重要的,以下有10个安全技巧,可以帮助你轻松的解决WordPress安全性问题,以免你在WordPress的安全性上走更多的弯路。
1、升级WordPress到最新版本
一般来说,新版本的WordPress安全性都会比老版本要好一些,并且解决了已知的各种安全性问题,特别当遇到重大的版本升级时,新版本可能会解决更 多的关键性问题。(例如老版本WordPress有remv.php重大漏洞,可能会导致遭受DDoS攻击,升级到最新2.7版本可解决这个问题)
2、隐藏WordPress版本
编辑你的header.php模板,将里面关于WordPress的版本信息都删除,这样黑客就无法通过查看源代码的防治得知你的WordPress有没有升级到最新版本。
3、更改WordPress用户名
每个黑客都知道WordPress的管理员用户是admin,具有管理员权限,会攻击这个用户,那么你需要创建一个新用户,将其设置为管理员权限,然后删除老的admin帐号,这就能避免黑客猜测管理员的用户名。
4、更改WordPress用户密码
安装好WordPress后,系统会发送一个随机密码到你的信箱,修改这个密码,因为这个密码的长度只有6个字符,你要将密码修改为10个字符以上的复杂密码,并尽量使用字母、数字、符号相混合的密码。
5、防止WordPress目录显示
WordPress会默认安装插件到/wp-content/plugins/目录下,通常情况下直接浏览这个目录会列出所有安装的插件名,这很糟糕, 因为黑客可以利用已知插件的漏洞进行攻击,因此可以创建一个空的index.html文件放到这个目录下,当然,修改Apache的.htaccess文 件也可以起到相同的作用。
6、保护wp-admin文件夹
你可以通过限定IP地 址访问WordPress管理员文件夹来进行保护,所有其他IP地址访问都返回禁止访问的信息,不过你也只能从一两个地方进行博客管理。另外,你需要放一 个新的.htaccess文件到wp-admin目录下,防止根目录下的.htaccess文件被替换。
7、针对搜索引擎的保护
很多WordPress系统文件不需要被搜索引擎索引,因此,修改你的robots.txt文件,增加一行Disallow: /wp-*
8、安装Login Lockdown插件
这个插件可以记录失败的登录尝试的IP地址和时间,如果来自某一个IP地址的这种失败登录超过一定条件,那么系统将禁止这一IP地址继续尝试登录。
9、WordPress数据库安全
数据表最好不要使用默认的wp_开头,安装数据库备份插件,无论做了多少保护,你还是应该定期备份你的数据库,使用WordPress Database Backup等插件可以实现数据库的定期备份。
10、安装Wordpress Security Scan插件
这个插件会自动按照以上的安全建议对你的WordPress进行扫描,查找存在的问题,使用较为简单。
WordPress 三个必须的安全措施
1 确保/wp-admin/文件夹的安全
您或许已经知道,WordPress的很多重要信息都放在/wp-admin/文件夹里面。WordPress允许这个文件夹公开,因此,别人如果掌握这个文件夹里的文件,他或她就可以访问这些文件。
Matt建议在/wp-admin/文件夹里面建立一个.htaccess文件,从而阻止除了您自己以外的所有IP的访问。</p>
以下是.htaccess中需要包括的代码:
AuthUserFile /dev/null
AuthGroupFile /dev/null
AuthName “Example Access Control”
AuthType Basic
order deny,allow
deny from all
allow from xx.xx.xx.xx(填写您自己的IP——精博注)
allow from xx.xx.xxx.xx(填写您自己的IP——精博注)
2 隐藏您的插件
许多WordPress插件都存在缺陷和漏洞,这些缺陷和漏洞如果给人利用,就会破坏您的网站,所以,您最不想发生的就是被别人知道您装了什么插件。
如果您访问大多数博客的/wp-content/plugins/文件夹,您将可以看到这些博客使用的所有插件。为了隐藏您的插件,您只需要在/wp-content/plugins/文件夹里建立一个index.html的空白文件。
3 坚持安装补丁和更新
许多博客或许都已经这样做了。保持WordPress的更新就会相安无事。Matt建议我们订阅WordPress开发博客。
最后的附加措施是,去掉网页标头(header)的WordPress版本的元标识(Meta tag)。
您还知道WordPress需要哪些安全措施吗?
更新:冲浪的时候,我发现一个叫做Login LockDown的WordPress插件,这个插件主要的功能是跟踪网站登录次数。如果同一个IP地址在短时间内的登录次数太频繁,这个插件就会禁止那个IP的登录。这对避免密码被强行破解很有用。
精博寄语:
1 原文:3 Must Apply Security Tips for WordPress
2 原文作者:每日博客技巧的Daniel。
3 关于第一点,Matt是这样写的:
AuthUserFile /dev/null
AuthGroupFile /dev/null
AuthName “Access Control”
AuthType Basic
order deny,allow
deny from all
# whitelist home IP address
allow from 64.233.169.99
# whitelist work IP address
allow from 69.147.114.210
allow from 199.239.136.200
# IP while in Kentucky; delete when back
allow from 128.163.2.27
4 关于附加措施,Matt原文是说把下面代码删掉:
” />
或者至少删掉。
5 可见,每日博客技巧的转载也有一套。
6 如果您经常在不同的地方使用WordPress,IP有好几个,那么,第一点应用起来就有点麻烦。
使用 .htaccess 提高 WordPress 的安全性和可用性
尽管 .htaccess 只是一个文件,但是它能改变你服务器上的设置和允许你做很多不同的东东,如最受欢迎的是它能让你定制化 404 错误页面。.htaccess 其实并不难,你可以认为它只是由一些简单命令或者用法说明组成的文本文件,不过他却能极大的提高你站点的安全性,所以没有借口不去用它。
创建 .htaccess 文件时可能给你带来一些问题。写入内容到这个文件是非常容易的,你只需输入合适的代码到文本编辑器中(如记事本)。但是你可能在保存文件的时候碰到问题。 因为 .htaccess 是一个非常奇怪的文件名(这个文件没有名字而只有一个8字符的扩展名)。这个可能在特定的系统中不能被接受(如 Windows 95)。在绝大多数的操作系统中,你可以尝试在保存文件的时候输入以下文件名:”.htaccess”(包括引号)。如果这不起作用,你可能需要先把它命 名为别的名字(如 htaccess.txt),然后上传到服务器。上传之后,在 FTP 工具中重命名它。
尽管通过 .htaccess 可以做很多事情,但是这篇日志主要关注的是如何提高 WordPress 的安全性和可用性。
- 保护 .htaccess 自身的安全性。阻止用户通过读取和写入 .htaceess 来更改安全性的设置。
order allow,deny
deny from all - 隐藏服务器的数字签名。隐藏服务器的数字签名之后,入侵者将很难找到有机会找到安全漏洞,因为他们不知道背后的服务器是什么。
ServerSignature Off - 限制上传文件的大小。这个能够帮助阻止 DoS 攻击(用户通过上传巨大的文件来冲垮服务器)并且能够节约带宽。
LimitRequestBody 10240000
# limit file uploads to 10mb - 停止 mod_security 过滤器。这是一个可选的设置并且要小心处理。这些指令告诉服务器不要使用 mod_security 过滤器,因为 mod_security 过滤器不允许用户发表含有这些单词 “curl”,“lynx” 或者 “wget” 等等单词的文章。这个看起来有点琐碎,但是这个让一些站点头痛,因为这些单词几乎那些站点每天都会用到。
SecFilterInheritance Off - 保护 wp-config.php 文件。我们可以通过 .htaccess 文件阻止用户读取和写入 WordPress 的主配置文件。这个指令假设 WordPress 是安装在站带你的根目录。
order allow,deny
deny from all - 指定自定义错误文档。这条指令做的更多是站点的可用性而不是安全性。它们指定了哪个页面将被显示,一旦服务器错误,如页面找不到(代码 404) 禁止访问(代码 403)等等。
ErrorDocument 404 /notfound.php
ErrorDocument 403 /forbidden.php
ErrorDocument 500 /error.php - 禁止浏览目录。这将阻止服务器在没有找到 index 文件(如 index.html,index.php 等等)的情况下显示文件夹目录内容。这能阻止用户看到文件夹的内容使得更难对网站发动攻击。
# disable directory browsing
Options All -Indexes - 防止图片盗链。这个能够阻止其他网站盗链本网站的图片,迫使他们 要么指向整个页面,或者其他存储图像的地方。这个保存了宝贵的带宽并且能够增加流量(虽然只是一点点)。下面的代码将会显示 stealingisbad.gif 这张图片,当有人试着热链到到你的网站来显示图片
#disable hotlinking of images
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?yourdomain.com/.*$ [NC]
#RewriteRule \.(gif|jpg|png)$ http://www.yourdomain.com/stealingisbad.gif [R,L] - 在你的站点给每个 URL 设置符合规定的或者“标准”的链接。这能够帮助提高网站的可用性和提高网站在搜索引擎中的排名。总之,它会把来自 http://yourdomain.com 的请求重定向到 http://www.yourdomain.com/.
# set the canonical url
RewriteEngine On
RewriteCond %{HTTP_HOST} ^yourdomain\.com$ [NC]
RewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L] - 保护博客免受垃圾留言的侵扰(和普通方式提交的垃圾留言)。最后的那条指令将会阻止用户直接从其他网站的留言提交框发表留言,虽然这不是一个包罗万象的反垃圾留言的方法,但是它确实能够帮助你。
# protect from spam comments
RewriteEngine On
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REQUEST_URI} .wp-comments-post\.php*
RewriteCond %{HTTP_REFERER} !.*yourdomain.com.* [OR]
RewriteCond %{HTTP_USER_AGENT} ^$
RewriteRule (.*) ^http://%{REMOTE_ADDR}/$ [R=301,L]
加入这些指令之后,你应该添加 WordPress 用于管理永久链接的代码。还有很多的指令和很多的方法可以提高网站的可用性和安全性,不过这里所列出的应该占了日常所需的大部分了。当你上传该文件到服务 器上之后,你应该一遍有一遍的测试直到你觉得所有的东西都工作正常,再测试一遍。检查下是否受保护的文件还能不能被访问,你依旧允许访问的文件和文件夹能 否还能访问。常规的经验可能是棘手的事情,它们可能导致看似随机的问题,所以在你发布你的网站之前务必完全的测试你的网站。
wordpress 安全保密
现使用使用WordPress系统的blogger在不断的日增,我发现国内基本上还没有多少的blogger关于WordPress的安全性问题,当然 WordPress是一个优秀的博客系统,安全性也算是比较高,但是无论怎么样,在功能性,舒适性之前,最先考虑的其实是安全性。尤其是在一个人成功的使 用WordPress获得成功(高知名度,高IP/PV等)时,也许会有心怀不轨的人想尽一切办法黑掉或者把数据破坏等非法的事情。下面我把 Noupe 提出的10条安全性建议翻译出来供大家参考:
1. 不允许任何人搜索到你的服务器信息
1).不要在Search.php文件中使用这些搜索代码 from WPDesigner.com
例如:
echo$_SERVER['PHP_SELF']; ?>
请使用下面的代码代替上面的代码:
bloginfo('home'); ?>
2).阻止搜索引擎(搜索爬虫)搜索以WP-为开头的文件夹里面的文件。最方面的阻止方法就是在博客根目录建立robots.txt文件,并在里面添加:
Disallow: /wp-*
2. 不要把目录以网页列表的形式暴露出来
WordPress有一个潜在性的问题可以使得其他用户查看你的博客的插件目录以及版本号。你可以尝试的在你的博客上后加上"/wp-content/plugins/"看看效果。例如,你的博客地址是:
http://www.icyleaf.com
加上之后就为:
http://www.icyleaf.com/wp-content/plugins/
是不是可以显示出来,同样的我测试了下,themes文件夹也可以显示的。
解决方案有2种,第一就是在plugins和themes文件夹下面分别建一个名为index.htm的空文件即可;第二是在.htaccess文件添加下面的参数即可:
Options All -Indexes
3. 把你的版本号从Meta标签中删除掉
一般来说,默认的WordPrss以及网友制作的主题的header.php文件都会有你使用的WordPress版本号的meta标签(下面)。这极易有可能你因没有及时升级因旧版本暴露的漏洞让黑客们利用。建议删除掉这个标签。这里还有 Matt Cutts 提出的不错建议。
<meta name="generator"content="WordPress <?php bloginfo('version'); ?>" />
翻译者按:为什么网友制作的主题也会添加这个标签呢,主要是默认版本的在这个标签的后面有一个注解:
4. 捍卫你的wp-admin文件夹
攻击者常常会使用一些暴力破解软件或者利用社会工程学来破解WordPress用户设置的弱口令(简单,常用的密码)。下面收集了防范的一些方法可以有效的阻止这种事情发生。
翻译者按:一个强而复杂的密码是就是非常强悍的防范措施了:)
1).通过限制IP地址访问wp-admin文件夹
此方法是用在.htaccess文件添加某些配置来限制某些具体的IP地址访问wp-admin文件夹
2).AskApache Password Protect
这是一个WordPress插件的名字,非常的简单好用,它可以为访问wp-admin文件夹的用户设置一个二级密码保护同时也把信息写在.htaccess文件中,只有输入正确的用户名和密码就才能访问后台。点击这里直接下载试用吧!
3).Login Lockdown plugin
同样也是一个WordPress插件,他的好处就在于,他可以记录每一次登陆失败时使用者的IP地址和登录时间。当达到你设定的失败次数,插件的特定函数会阻止此IP地址的使用者继续登录操作。
5. 注意保持及时更新
你最好需要保证你的插件,主题以及使用的WordPress的版本的不断更新,这里建议你订阅你使用的插件,主题作者的博客以保证及时获得最新的更新消息。
6. 定期备份博客的数据库
这是一个持久的事情,你需要经常性的或者定期性的备份你博客的数据库,对于数据库的备份我们可以使用 WordPress Database Backup 插件来完成定期备份。
翻译者按:我使用的是 WP-DBManager 插件(使用方法),同样也可以实现定期备份。
7. 升级你的WordPress为最新版本
也许这才是第一件要做的事情,呵呵(^___^)。在升级之前一定要备份好一些数据和你认为改备份的东西,至于升级可以使用 Instant Upgrade 插件 或者 Wordpress Automatic Upgrade插件来完成。
8. 使用SSH/Shell方式代替FTP登录操作
这里有一些很好的建议,点击这里查看。如果某人获得了你的FTP的登录信息(当然包括密码咯),他们就可以在登录后胡作非为的,这是很可怕的事情哦...而使用SSH/Shell你就大可放心,因为他们的任何传输都是通过加密的,保证安全性!
翻译者按:
其实像FlashFXP这类的软件其安全性很差的,很容易就能获得你保存的个人登录信息。点这里下载Putty客户端(里面我添加了一些常用的Shell命令的帮助信息)。其实它的操作一切按照Linux下面的命令:)
9.不要再担忧你的wp-config.php文件
通过在.htaccess文件添加下面的配置会使你的wp-config.php文件里面的配置信息(数据库地址,用户名和密码)更加安全可靠。
10. 为你的WordPress用户设置一个强悍的密码
翻译者按:这段我就不过多翻译了,因为我也写过这方面的文章(《黑客手册》某期,不好意思我忘记是哪期了),这里我就以我的思路给大家一些方法。
大家都知道一个强悍的密码应包括字母,数字和一些特殊符号组成,如果你设置了一个Sfd@#35,这个谁也记不着。其实一个强悍的密码看着复杂如果你知道了敲门其实一点也不难记忆,而且非常有规律,这里我举一个最简单的例子:
1+1=two
是不是很简单,1+1=2这是很简单的数学算式,小学一年级的都会的(现在的小学一年级有英语了吧,就算没有学前教育的父母也应该逼着他们学了吧)。这个密码完全符合一个强悍的密码的定义。再例如:
zxasqw12`
或许猛的一看,这个是什么呀,没什么规律嘛,其实你安装这个密码自己尝试下就明白了,这个方法我称之为键盘分布法。另外还有所问非所答法,例如:
1+1=one
1+2=twelve
1+1=ten
方法还有很多,发挥你的想象力,总会出现奇迹的!