/**
* Begin class defination XPager : 分页逻辑类
*/
var XPager = Base.extend({
// 参考groovy biz.db.Pager
constructor : function(cp, npp, total){
this.currentPage = cp;
this.numPerPage = npp;
this.rowCount = total;
},
currentPage : 1,
numPerPage : 20,
rowCount : 0,
pagiStyle : 'digg',
ll: null,
// changeCp
callbackFun : '',
getPageNum : function() {
var r = this.rowCount % this.numPerPage;
var r2 = this.rowCount / this.numPerPage;
var result = r == 0 ? r2 : r2 + 1;
return Math.floor(result);
},
getStart : function(){
return (this.currentPage - 1) * this.numPerPage;
},
getEnd : function(){
if(this.rowCount < this.numPerPage || this.currentPage == this.getPageNum())
return this.rowCount;
else
return this.currentPage * this.numPerPage;
},
hasNext : function(){
return this.currentPage < this.getPageNum();
},
hasPre : function(){
return this.currentPage > 1 && this.getPageNum() > 1;
},
lang : {
pageNum: '总页数:',
currentPage: '当前页:',
totalCount: '总记录:'
},
// use mollio pagination template
genHtml : function(){
var tpl = '<p>' +
'{3}' +
'<span><strong>{2}</strong></span>' +
'</p><h4>{1} / {0}</h4>';
var tpl2 = '<a href="javascript:void();" onclick="{1}">{0}</a>';
var param0 = this.lang.pageNum + this.getPageNum();
var param1 = this.lang.currentPage + this.currentPage;
var param2 = this.lang.totalCount + this.rowCount;
var param3 = '';
var i = 1;
for (; i <= this.getPageNum(); i++){
param3 += tpl2.format(i, "XPager.changeCp('" + this.callbackFun + "', '" + i + "');");
}
tpl = tpl.format(param0, param1, param2, param3);
return tpl;
},
// use yahoo pagination template
getHtml2 : function(){
var tpl = '<div class="' + this.pagiStyle + '">' +
'<span style="font-size: 11px; color: silver;">' + this.lang.pageNum + '{0}</span>' +
'{1}' +
'<span style="font-size: 11px; color: silver;">' + this.lang.totalCount + '<font color="red">{2}</font></span>' +
'</div>';
var param0 = this.getPageNum();
var param2 = this.rowCount;
var param1 = '';
var tplLink = '<a href="javascript:void();" onclick="{1}">{0}</a>';
var i = 1;
for (; i <= this.getPageNum(); i++){
if(i == this.currentPage)
param1 += '<span class="current">{0}</span>'.format(i);
else
param1 += tplLink.format(i, "XPager.changeCp('" + this.callbackFun + "', '" + i + "');");
}
tpl = tpl.format(param0, param1, param2);
return tpl;
},
dump : '' // 避免,结尾,在IE浏览器中语义错误
},{
changeCp: function(callbackFunName, pageNo){
var jsStr = callbackFunName + '(' + pageNo + ')';
eval(jsStr);
},
dump : '' // 避免,结尾,在IE浏览器中语义错误
});
/**
* Begin class defination XDB : Web sql辅助方法
*/
var XDB = {
db: null,
init: function(dbName, version, dbDisplayName, size){
if(window.openDatabase)
this.db = openDatabase(dbName, version, dbDisplayName, size);
},
exe: function(sql, args, callback){
if(!this.db){
X.log('Web sql not support!');
return;
}
this.db.transaction(function(tx){
tx.executeSql(sql, args, function(tx, results){
if(callback)
callback(results);
}, function(tx, err){
// SQLError
X.log('Web sql execute error: ' + err.message);
});
});
},
trans: function(fn){
if(!this.db){
X.log('Web sql not support!');
return;
}
this.db.transaction(fn);
},
// crud
add: function(data, table){
var keys = _.keys(data);
var str1 = keys.join(',');
var str2 = _.map(keys, function(it){return '?';}).join(',');
var sql = 'insert into {0} ({1}) values ({2})';
sql = sql.format(table, str1, str2);
var args = _.values(data);
this.exe(sql, args)
},
del: function(data, table){
var keys = _.keys(data);
var strClause = _.map(keys, function(it){
return it + ' = ?';
}).join(' and ');
var sql = 'delete from {0} where {1}';
sql = sql.format(table, strClause);
var args = _.values(data);
this.exe(sql, args)
},
update: function(data, dataClause, table){
var strSet = _.map(_.keys(data), function(it){
return it + ' = ?';
}).join(', ');
var argsSet = _.values(data);
var strClause = _.map(_.keys(dataClause), function(it){
return it + ' = ?';
}).join(' and ');
var argsClause = _.values(dataClause);
var sql = 'update {0} set {1} where {2}';
sql = sql.format(table, strSet, strClause);
this.exe(sql, argsSet.merge(argsClause))
},
query: function(sql, args, callback){
this.exe(sql, args, function(results){
if(callback)
callback(results.rows);
});
},
pi: function(sql, args, cp, npp, callback){
var pager = new XPager(cp, npp, 0);
var countSql = 'select count(1) as rowCount from ({0})'.format(sql);
var subSql = 'select * from ({0}) limit {1}, {2}'.format(sql, pager.getStart(), npp);
var _this = this;
this.query(countSql, args, function(rows){
pager.rowCount = rows.item(0)['rowCount'];
_this.query(subSql, args, function(rows){
if(callback)
callback(pager, rows);
});
});
},
dump : ''
};
下面是测试代码
$(function(){
appendLi('*** *** *** *** *** *** *** *** *** *** *** *** XDB');
appendLi('*** *** *** *** *** *** *** *** *** *** *** *** XDB');
runTest('XDB all', true, function(){
XDB.init('test', '0.1', 'TestDB', 1024 * 10);
XDB.exe('create table if not exists x(name varchar(30))');
XDB.trans(function(tx){
tx.executeSql('delete from x');
var i = 0;
for(; i < 10; i++){
var sql = "insert into x(name) values(?)";
tx.executeSql(sql, ['Kerry' + i]);
}
});
XDB.query('select * from x', null, function(rows){
var len = rows.length;
var i = 0;
for(; i < len; i++){
X.log(rows.item(i)['name']);
}
});
XDB.pi('select * from x', null, 3, 20, function(pi, rows){
X.log(pi.rowCount);
var len = rows.length;
var i = 0;
for(; i < len; i++){
X.log(rows.item(i)['name']);
}
});
XDB.update({name: 'XXX0'}, {name: 'Kerry0'}, 'x');
XDB.query('select * from x where name = ?', ['XXX100'], function(rows){
X.log(rows.length);
});
XDB.del({name: 'XXX0'}, 'x');
return true;
});
});
分享到:
相关推荐
SQL注入漏洞通常是由于Web应用程序未能对用户输入的数据进行充分验证和转义,导致这些数据被当作SQL命令的一部分直接执行。攻击者可以通过提交恶意SQL代码,使数据库执行非预期的操作,如读取、修改或删除敏感信息。...
综上所述,".NET6WebAPI使用Sqlserver+JWT增删改查"项目涵盖了现代Web开发的多个重要方面,包括API设计、数据库交互、身份验证和安全实践,是学习和实践.NET6开发的宝贵资源。通过这个项目,开发者不仅可以掌握ASP...
根据攻击的目的和方法,SQL 注入可以分为以下几种类型: * Blind SQL Injection:攻击者不知道服务器的数据库结构和数据,但可以通过提交特殊的 SQL 语句来获取信息。 * Error-based SQL Injection:攻击者可以通过...
### SQL数据库使用方法 #### 1. 配置文件路径 在使用SQL数据库时,通常需要通过配置文件来指定数据库的连接参数和其他设置。以下是一些常见的配置文件路径示例: - **`D:\Tomcat6\webapps\DownServer\WEB-INF\...
### Web测试流程与测试用例编写方法详解 #### 一、引言 随着互联网技术的飞速发展,Web应用已成为日常生活中不可或缺的一部分。基于Web的应用系统不仅需要具备强大的功能,还需要确保良好的用户体验、高可靠性和...
### Web安全性测试SQL注入高级篇知识点详解 #### 一、SQL Server高级注入技巧 ##### 1. 利用系统表和存储过程 - **利用`xp_cmdshell`存储过程** - **示例1**: `http://Site/url.asp?id=1;exec master..xp_cmd...
WEB安全测试是确保网站应用程序免受恶意攻击的关键环节。...综上所述,Web安全测试涵盖广泛的测试领域,每种测试方法都有其特定的防范措施。通过实施这些测试,可以有效增强Web应用的安全性,降低被攻击的风险。
5. 数据库测试:针对使用数据库的Web应用,需测试数据一致性(确保用户输入的正确性)和输出错误(如网络延迟导致的显示问题)。使用SQL进行查询和数据验证是必不可少的。 二、性能测试 1. 连接速度测试:模拟各种...
Web网站测试方法是确保Web系统质量的关键步骤,它涵盖了多个层面的验证,以确保系统能够稳定、安全且高效地运行。Web测试与传统软件测试的主要区别在于,它不仅需要验证功能是否符合设计要求,还需要考虑多用户环境...
Web测试是针对基于Web的应用程序进行的一系列验证过程,旨在确保系统的功能、性能、安全性和用户体验达到预期标准。...随着技术的发展,测试方法也在不断更新和完善,以应对更复杂、多变的Web环境。
2. 测试范围:确定测试的范围,包括测试的对象、测试的方法和测试的环境。 测试范围是指测试的对象、测试的方法和测试的环境。例如,测试的对象可能是Web应用程序的登录页面、注册页面或支付页面等。测试的方法可能...
SQL测试工具能够帮助我们评估和优化SQL语句的性能,确保数据查询的效率和系统的稳定性。本文将详细讲解如何使用这些工具以及它们的重要性。 首先,SQL测试工具的核心功能是对SQL语句进行性能分析。当开发人员编写或...
在测试和验证阶段,将所提出的防范思路和方法应用在实际的Web项目中。测试结果表明,所构建的防范模型在实用性和安全性方面都表现较高。通过模型验证,可以确保Web应用程序能够有效抵御SQL注入攻击,提升应用整体的...
【基于Web的系统测试方法】 随着互联网的飞速发展,Web技术已经成为商业、教育、政府等领域不可或缺的一部分。...随着Web技术的不断发展,测试方法也需要不断更新和优化,以适应快速变化的Web环境。
软件测试基础—Web测试方法和技巧 本资源概括了软件测试基础,其中着重介绍了Web测试方法和技巧。下面是从该资源中提取的知识点: Web应用场景 * 简单的Web应用场景:没有交互、静态的简单网站 * 复杂的Web应用...
在本项目中,"sql.zip_web sql_web登录" 提供了一个关于...以上就是围绕"sql.zip_web sql_web登录"这个主题所涵盖的一些主要知识点,它们构成了一个Web登录系统的核心要素,并涉及到了Web开发和数据库管理的多个方面。
标题《模型驱动的Web应用SQL注入渗透测试.pdf》和描述《模型驱动的Web应用SQL注入渗透测试.pdf》表明,本文是一篇专注于Web应用安全漏洞检测,特别是针对SQL注入漏洞进行渗透测试的研究论文。SQL注入攻击是Web应用中...