蜗牛的壳

蜗牛的壳

我行依我素 | 苦苦咸咸就是我 | Snailium的个人网站

浏览模式: 标准 | 列表
分类:[原创]网站架设

Mod: 自制 WD My Book World Edition 服务管理页面


一直苦于无法远程开启/终止 My Book World Edition 上的服务,有时候在公司发现 Transmission 崩溃却无法重启。终于昨晚忍无可忍,自行在管理后台加了一个服务管理标签。

值得一提的是,Western Digital 的后台做得实在不怎么样,很难扩展。为了做这个 mod,改动近 10 个文件,添加 5 个文件。而且需要重启 lighttped 才能生效。

目前只做了 Transmission 一项。本来想加上 TwonkyMedia,但是想想远程并不需要管理 Twonky。

大小: 100.29 K 尺寸: 400 x 232 浏览: 12 次点击打开新窗口浏览全图

大小: 107.29 K 尺寸: 400 x 232 浏览: 7 次点击打开新窗口浏览全图

给自己的Blog加上自定义错误页面


闲来无事,研究了一下 Sablog 模板和 .htaccess,顺便给自己的网站加上了自定义错误页面。参见以下链接:

http://www.snailium.net/error-400.html
http://www.snailium.net/error-401.html
http://www.snailium.net/error-403.html
http://www.snailium.net/error-404.html
http://www.snailium.net/error-500.html

HTTP/1.1 状态代码


100 系列(信息)
100 Continue(客户端可以继续发送未发完的请求)
101 Switch Protocals(服务端/客户端所使用的协议不一致)
200 系列(成功)
200 OK(成功)
201 Created(已按请求创建新资源)
202 Accepted(请求已被接受)
203 Non-Authoritative Information(从第三方获取的信息)
204 No Content(服务端没有可返回的数据)
205 Reset Content(客户端需重置请求内容)
206 Partial Content(服务端返回部分数据)
300 系列(重定向)
300 Multiple Choices(多个资源可用)
301 Moved Permanently(资源已被移动)
302 Found(临时在其他地址找到相应资源)
303 See Other(在其他地址找到相应资源)
304 Not Modified
305 Use Proxy
306 (Unused)
307 Temporary Redirect
400 系列(错误)
400 Bad Request
401 Unauthorized
402 Payment Required
403 Forbidden
404 Not Found
405 Method Not Allowed
406 Not Acceptable
407 Proxy Authentication Required
408 Request Timeout
409 Conflict
410 Gone
411 Length Required
412 Precondition Failed
413 Request Entity Too Large
414 Request-URI Too Long
415 Unsupported Media Type
416 Requested Range Not Satisfiable
417 Expectation Failed
500 系列(服务器错误)
500 Server Internal Error
501 Not Implemented
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
505 HTTP Version Not Supported

参考资料:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

Perl CGI 初体验


开始还满怀信心的打算拿 Perl 写一个文件上传管理程序,可是在写完了登陆部分之后就泄气了。原因很简单,服务器不支持 CGI::Session,而我又不想花时间去研究 Perl Cookie。

login.cgi
  1. #!/usr/bin/perl -w
  2. # ***********************************************
  3. # *  Handle User Login                          *
  4. # ***********************************************
  5. use strict;
  6.  
  7. use DBI;
  8. #use CGI::Session;
  9. use CGI;
  10. use Digest::MD5 qw(md5_hex);
  11.  
  12. # Get the CGI form data
  13. my $cgi = new CGI;
  14. # Fetch login username and password
  15. my $user_name = $cgi->param('username');
  16. my $user_pass = $cgi->param('password');
  17. $user_name =~ s/(?:\012\015|\012|\015)//g;
  18. $user_pass =~ s/(?:\012\015|\012|\015)//g;
  19. $user_pass = md5_hex($user_pass);
  20. my $user_login = 0
  21.  
  22. require "config.pm"
  23.  
  24. # Import Database configuration
  25. our $db_host;
  26. our $db_use;
  27. our $db_user;
  28. our $db_pass;
  29. our $db_table;
  30.  
  31. # Connect to database
  32. my $db_conn = DBI->connect("DBI:mysql:database=$db_use;host=$db_host","$db_user","$db_pass", {'RaiseError' => 1});
  33. print "Location: /error-503\n\n" unless $db_conn;
  34.  
  35. # Check if we have such password in database
  36. my $sql = $db_conn->prepare("SELECT username FROM `$db_table` WHERE user_password='$user_pass'");
  37. $sql->execute() or print "Location: /error-503\n\n";
  38.  
  39. # Process query result
  40. while(my @result = $sql->fetchrow_array()) {
  41.   if($user_name eq $result[0]) {
  42.     # Here we go. A user is found with the same username and password.
  43.     $user_login = 1
  44.     last;
  45.   }
  46. }
  47.  
  48. # Disconnect from database
  49. $db_conn->disconnect();
  50.  
  51. # Not pass user check? Kick it out!
  52. print "Location: /error-401\n\n" unless $user_login;
  53.  
  54. # User check successful! Log it in!
  55. print "Content-type: text/plain\n\nYes !";
  56.  
  57. exit(0);

其中登陆部分采用了《突发奇想,小改动解决安全问题》其中的方法。

看来要重操 PHP 旧业了……

突发奇想,小改动解决安全问题


这几天一直在琢磨用 Perl CGI 架设网站,正好在网上看到了一篇关于 CGI 安全的文章,里面提到了数据库注入和远程执行等等安全问题。也就是说,比较安全的方法是屏蔽一系列特殊字符(比如说,管道“|”、引号“" '”、斜线“/”等等)。今天偶然间突发奇想,如果换一种思路,不需要过滤特殊字符也能做到脚本安全。

具体方法如下。(假设:用户名与密码存在 user 表中,密码用 md5 加密)

Pseudo-code
  1. $username = http_get("username"); // Get username from browser
  2. $password = http_get("password"); // Get password from browser
  3.  
  4. $password = md5($password);       // Make md5 hash for password
  5.  
  6. $mysql->connect();                // Connect to database
  7. // Get all users that have this password
  8. $rows = $mysql->query("SELECT username FROM `user` WHERE password='$password'");
  9.  
  10. // If no one match, must be username/password problem
  11. while($r = $rows->next()) {
  12.   if($r->username == $username) login_success();
  13. }
  14. die("Username/password incorrect!");

由于 md5 hash 不包括任何特殊字符,所以这段脚本对数据库无害。

优点总结:由于传递给数据库的字符串当中不包括任何特殊字符,因此没有任何注入危险。

缺点总结:一般来说,用户数据表都是拿用户名做索引,所以按密码查询效率相对低一些。但是考虑到用户登录的频繁程度,这个缺点就无所谓了。

[Discuz! 5.5]在帖子中加入eMule链接


本文介绍了如何在Discuz! 5.5论坛系统中加入eMule下载功能。具体实例参考VeryCD。

架设UTF-8网站需要注意的BOM


最近在折腾自己的网站DV站,打算装个相册上去。

终于找到相册程序了,但都是GB2312编码的。鉴于网站都是UTF-8的,只好用UltraEdit手工转码。

但是,转成UTF-8的程序上传到服务器之后却频频白屏。setcookie和header均出错。这肯定是在header之前有数据输出。

用IE查看源代码,一无所获。用FireFox查看源代码,发现有6个无法显示的空字符。这才想起来是不是编码的问题。

Google了一下,UTF-8用BOM(Byte Order Mark,字节顺序标记)标记字节顺序。BOM一般加在文件头,长度三字节(EF BB BF)。如果程序发现BOM,则自动按照UTF-8处理。

问题就出在BOM上面。PHP是不支持BOM的,所以PHP在处理文件的时候会把BOM直接输出,也就导致了header之前存在输出,从而setcookie和header不起作用。

知道问题,解决起来也不难了。用UltraEdit将文件保存为“UTF-8 无 BOM”就行了。





« 2010年03月 »
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

标签

用户


链接


归档


信息

  • 分类数量: 13
  • 文章数量: 208
  • 评论数量: 78
  • 标签数量: 387
  • 附件数量: 318
  • 引用数量: 2
  • 注册用户: 9
  • 今日访问: 241
  • 总访问量: 495307
  • 程序版本: 1.6