月度归档: 2021 年 6 月

Android 测试环境噪音分贝

前言:

*近做工具类项目,手机上小工具各种,有一个测量环境噪音分贝值的,个人对机车码表式显示忠爱(有点机车情节),网上和Android APP market 转了一圈尽没发现让人心动了。所以只能自己动手,做图,做定义控件去实现。

具体实现如下:

素材准备:

%title插图%num

自定义控件 xml

<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:gravity=”center”
android:orientation=”vertical”>

<ImageView
android:id=”@+id/panel”
android:layout_width=”300dp”
android:layout_height=”300dp”
android:layout_centerHorizontal=”true”
android:layout_centerVertical=”true”
android:scaleType=”fitCenter”
android:src=”@drawable/panel__green” />

<ImageView
android:id=”@+id/pointer”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_centerHorizontal=”true”
android:layout_centerInParent=”true”
android:layout_gravity=”center_horizontal”
android:alpha=”0.8″
android:scaleType=”centerInside”
android:src=”@drawable/pointer” />

<LinearLayout
android:layout_centerHorizontal=”true”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:paddingTop=”50dp”
android:layout_centerVertical=”true”>

<TextView
android:id=”@+id/value”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_centerHorizontal=”true”
android:text=”welcome to use Nosy test !” />

<TextView
android:id=”@+id/maxvalue”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_centerHorizontal=”true”
android:paddingLeft=”20dp”
android:text=”MAX:” />
</LinearLayout>

</RelativeLayout>

自定义控件类:核心思路其实就是对ImageView 图片的旋转

public class PlateView extends RelativeLayout {
public void setmMaxValue(double mMaxValue) {
this.mMaxValue = mMaxValue;
}

private double mMaxValue =0;
private ImageView mPanel;
private ImageView mPointer;
private TextView textView;
private TextView maxTextView;
private Matrix matrix = new Matrix();
private Context mContext;
private double mLastValue = 50;

public double getValue() {
return value;
}

public void setValue(double value) {
mLastValue = this.value;
this.value = value;
if(Math.abs(mMaxValue)<Math.abs(this.value)){
mMaxValue = this.value;
}
show();
}

private double value = 50;

public PlateView(Context context) {
super(context);
}

public PlateView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
LayoutInflater layoutInflater = (LayoutInflater) context.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
layoutInflater.inflate(R.layout.plate, this);
mPanel = (ImageView) findViewById(R.id.panel);
mPointer = (ImageView) findViewById(R.id.pointer);
textView=(TextView) findViewById(R.id.value);
maxTextView=(TextView) findViewById(R.id.maxvalue);
show();
}

public void show() {

float rotate = (float) (getValue() – this.mLastValue);
if (Math.abs(rotate) > 0.1) {
mPointer.setScaleType(ImageView.ScaleType.MATRIX); //required
matrix.postRotate(rotate*8/5, mPointer.getWidth() / 2, mPointer.getHeight() / 2);
mPointer.setImageMatrix(matrix);
textView.setText(getValueText(getValue()));
maxTextView.setText(“MAX:”+getValueText(this.mMaxValue));
invalidate();
requestLayout();
}

}

private String getValueText(double value){
value+=0.0000001;
String sRes =value+””;
if(sRes.contains(“.”)){
sRes = sRes.substring(0,sRes.indexOf(“.”)+3);
}
return sRes;
}

public int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}

public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}

}

分贝测量类:
public class AudioRecordDemo {

private static final String TAG = “AudioRecord”;
static final int SAMPLE_RATE_IN_HZ = 8000;
static final int BUFFER_SIZE = AudioRecord.getMinBufferSize(SAMPLE_RATE_IN_HZ,
AudioFormat.CHANNEL_IN_DEFAULT, AudioFormat.ENCODING_PCM_16BIT);
AudioRecord mAudioRecord;
boolean isGetVoiceRun;
Object mLock;
private WeakReference<MainActivity> mActivity;

public AudioRecordDemo(MainActivity activity) {
mLock = new Object();
mActivity = new WeakReference<>(activity);
}

public void sotp() {
this.isGetVoiceRun = false;
}

public void getNoiseLevel() {
if (isGetVoiceRun) {
return;
}
mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
SAMPLE_RATE_IN_HZ, AudioFormat.CHANNEL_IN_DEFAULT,
AudioFormat.ENCODING_PCM_16BIT, BUFFER_SIZE);
if (mAudioRecord == null) {
}
isGetVoiceRun = true;

new Thread(new Runnable() {
@Override
public void run() {
mAudioRecord.startRecording();
short[] buffer = new short[BUFFER_SIZE];
final MainActivity activity = mActivity.get();
while (isGetVoiceRun) {
int r = mAudioRecord.read(buffer, 0, BUFFER_SIZE);
long v = 0;
for (int i = 0; i < buffer.length; i++) {
v += buffer[i] * buffer[i];
}
double mean = v / (double) r;
final double volume = 10 * Math.log10(mean);
Log.d(TAG, “db value:” + volume);
if (null != activity) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
activity.plateView.setValue(volume);
}
});
}
// 大概一秒十次
synchronized (mLock) {
try {
mLock.wait(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
mAudioRecord.stop();
mAudioRecord.release();
mAudioRecord = null;
if (null != activity) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
activity.plateView.setmMaxValue(0);
activity.plateView.setValue(1);
}
});
}
}
}).start();
}
}

记得加入Manifest 权限:
<uses-permission android:name=”android.permission.RECORD_AUDIO” />

Layout使用控件:
<com.asus.function.antitouch.sound.PlateView
android:id=”@+id/soundplate”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_below=”@+id/start”/>

Activity中代码:
audioRecordDemo = new AudioRecordDemo(this);
plateView = (PlateView) findViewById(R.id.soundplate);
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (start.getText().toString().equalsIgnoreCase(STOP)) {
audioRecordDemo.sotp();
start.setText(START);
} else {
audioRecordDemo.getNoiseLevel();
start.setText(STOP);
}
}
});
}

APP 效果图:

%title插图%num
结语:

图片素材质量差了些,但效果算达到预期,由于声音分贝值本身变化是线性的,所以即使这里我没有加入动画效果,指针的转动线性也是令人可以接受的。另外可惜没做好gif 图档上传。

————————————————

android获取音量分贝值

android获取音量分贝值

AudioRecordDemo.java

%title插图%num
package com.example.recording;

import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.util.Log;

public class AudioRecordDemo {
private static final String TAG = “AudioRecord”;
static final int SAMPLE_RATE_IN_HZ = 8000;
static final int BUFFER_SIZE = AudioRecord.getMinBufferSize(SAMPLE_RATE_IN_HZ,
AudioFormat.CHANNEL_IN_DEFAULT, AudioFormat.ENCODING_PCM_16BIT);
AudioRecord mAudioRecord;
boolean isGetVoiceRun;
Object mLock;

public AudioRecordDemo() {
mLock = new Object();
}

public void getNoiseLevel() {
if (isGetVoiceRun) {
Log.e(TAG, “还在录着呢”);
return;
}
mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
SAMPLE_RATE_IN_HZ, AudioFormat.CHANNEL_IN_DEFAULT,
AudioFormat.ENCODING_PCM_16BIT, BUFFER_SIZE);
if (mAudioRecord == null) {
Log.e(“sound”, “mAudioRecord初始化失败”);
}
isGetVoiceRun = true;

new Thread(new Runnable() {
@Override
public void run() {
mAudioRecord.startRecording();
short[] buffer = new short[BUFFER_SIZE];
while (isGetVoiceRun) {
//r是实际读取的数据长度,一般而言r会小于buffersize
int r = mAudioRecord.read(buffer, 0, BUFFER_SIZE);
long v = 0;
// 将 buffer 内容取出,进行平方和运算
for (int i = 0; i < buffer.length; i++) {
v += buffer[i] * buffer[i];
}
// 平方和除以数据总长度,得到音量大小。
double mean = v / (double) r;
double volume = 10 * Math.log10(mean);
Log.d(TAG, “分贝值:” + volume);
if(volume>80){
Log.d(TAG, “恭喜您获得一元优惠券”);
}

// 大概一秒十次
synchronized (mLock) {
try {
mLock.wait(100);

} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
mAudioRecord.stop();
mAudioRecord.release();
mAudioRecord = null;
}
}).start();
}
}
MediaRecorderDemo.java

package com.example.recording;

import java.io.File;
import java.io.IOException;

import android.media.MediaRecorder;
import android.os.Handler;
import android.util.Log;

public class MediaRecorderDemo {
private final String TAG = “MediaRecord”;
private MediaRecorder mMediaRecorder;
public static final int MAX_LENGTH = 1000 * 60 * 10;// *大录音时长1000*60*10;
private String filePath;

public MediaRecorderDemo(){
this.filePath = “/dev/null”;
}

public MediaRecorderDemo(File file) {
this.filePath = file.getAbsolutePath();
}

private long startTime;
private long endTime;

/**
* 开始录音 使用amr格式
*
* 录音文件
* @return
*/
public void startRecord() {
// 开始录音
/* ①Initial:实例化MediaRecorder对象 */
if (mMediaRecorder == null)
mMediaRecorder = new MediaRecorder();
try {
/* ②setAudioSource/setVedioSource */
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风
/* ②设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default 声音的(波形)的采样 */
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
/*
* ②设置输出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式
* ,H263视频/ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB)
*/
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

/* ③准备 */
mMediaRecorder.setOutputFile(filePath);
mMediaRecorder.setMaxDuration(MAX_LENGTH);
mMediaRecorder.prepare();
/* ④开始 */
mMediaRecorder.start();
// AudioRecord audioRecord.
/* 获取开始时间* */
startTime = System.currentTimeMillis();
updateMicStatus();
Log.i(“ACTION_START”, “startTime” + startTime);
} catch (IllegalStateException e) {
Log.i(TAG,
“call startAmr(File mRecAudioFile) failed!”
+ e.getMessage());
} catch (IOException e) {
Log.i(TAG,
“call startAmr(File mRecAudioFile) failed!”
+ e.getMessage());
}
}

/**
* 停止录音
*
*/
public long stopRecord() {
if (mMediaRecorder == null)
return 0L;
endTime = System.currentTimeMillis();
Log.i(“ACTION_END”, “endTime” + endTime);
mMediaRecorder.stop();
mMediaRecorder.reset();
mMediaRecorder.release();
mMediaRecorder = null;
Log.i(“ACTION_LENGTH”, “Time” + (endTime – startTime));
return endTime – startTime;
}

private final Handler mHandler = new Handler();
private Runnable mUpdateMicStatusTimer = new Runnable() {
public void run() {
updateMicStatus();
}
};

/**
* 更新话筒状态
*
*/
private int BASE = 1;
private int SPACE = 100;// 间隔取样时间

private void updateMicStatus() {
if (mMediaRecorder != null) {
double ratio = (double)mMediaRecorder.getMaxAmplitude() /BASE;
double db = 0;// 分贝
if (ratio > 1)
db = 20 * Math.log10(ratio);
Log.d(TAG,”分贝值:”+db);
mHandler.postDelayed(mUpdateMicStatusTimer, SPACE);
}
}
}
MainActivity.java

package com.example.recording;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new AudioRecordDemo().getNoiseLevel();

}

}
activity_main.xml

<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android”
xmlns:tools=”http://schemas.android.com/tools”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:paddingBottom=”@dimen/activity_vertical_margin”
android:paddingLeft=”@dimen/activity_horizontal_margin”
android:paddingRight=”@dimen/activity_horizontal_margin”
android:paddingTop=”@dimen/activity_vertical_margin”
tools:context=”.MainActivity” >

<TextView
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”@string/hello_world” />

</RelativeLayout>
*后别忘 了,在AndroidManifest.xml中配置
<uses-permission android:name=”android.permission.RECORD_AUDIO” />
————————————————

攻击DNS服务器

很显然DNS服务是非常容易受到FLOOD攻击的一种服务,由于DNS请求是UDP包,而且没有认证机制,任何
人都可以伪造大量的DNS请求后发送出去就可以不用管了,服务器收到这些请求后由于没法认证是否合法
,就必须全部处理。服务器处理DNS查询*差情况下需要搜索本地全部数据库,因此对DNS服务器的攻击
比SYN flood攻击都要有效得多,和CC攻击比较类似。

DNS服务器一般设计为都是带高速cache的,一个请求查询完会把结果放到cache中,下一次查就不用重新
搜索了,因此发送攻击包时域名不要相同,否则意义不大。

现在一些DNS服务器也有基本判断功能,如果一看这个域名就不象是真的,一般就不会去解析了,所以*
好的攻击方式是是向服务器发送大量的看似合法但实际又不存在的域名请求,如“www.abccba.com”,
DNS服务器本地查不到还只能向上级DNS服务器进行请求,自动形成了攻击泛滥。

DNS服务器对此攻击基本没有什么真正彻底的防御方法,除了高速缓存、域名检查外,基本只能限制一下
数据包流量了,*好的也就是限制到每个IP的访问流量了。

如何防止服务器被大流量攻击?

参考一下吧
由于DDoS攻击往往采取合法的数据请求技术,再加上傀儡机器,造成DDoS攻击成为目前*难防御的网络攻击之一。据美国*新的安全损失调查报告,DDoS攻击所造成的经济损失已经跃居*。传统的网络设备和周边安全技术,例如防火墙和IDSs(Intrusion Detection Systems), 速率限制,接入限制等均无法提供非常有效的针对DDoS攻击的保护,需要一个新的体系结构和技术来抵御复杂的DDoS拒*服务攻击。

DDoS攻击揭秘

DDoS攻击主要是利用了internet协议和internet基本优点——无偏差地从任何的源头传送数据包到任意目的地。

DDoS攻击分为两种:要么大数据,大流量来压垮网络设备和服务器,要么有意制造大量无法完成的不完全请求来快速耗尽服务器资源。有效防止DDoS攻击的关键困难是无法将攻击包从合法包中区分出来:IDS进行的典型“签名”模式匹配起不到有效的作用;许多攻击使用源IP地址欺骗来逃脱源识别,很难搜寻特定的攻击源头。

有两类*基本的DDoS攻击:

● 带宽攻击:这种攻击消耗网络带宽或使用大量数据包淹没一个或多个路由器、服务器和防火墙;带宽攻击的普遍形式是大量表面看合法的TCP、UDP或ICMP数据包被传送到特定目的地;为了使检测更加困难,这种攻击也常常使用源地址欺骗,并不停地变化。

● 应用攻击:利用TCP和HTTP等协议定义的行为来不断占用计算资源以阻止它们处理正常事务和请求。HTTP半开和HTTP错误就是应用攻击的两个典型例子。

DDoS威胁日益致命

DDoS攻击的一个致命趋势是使用复杂的欺骗技术和基本协议,如HTTP,Email等协议,而不是采用可被阻断的非基本协议或高端口协议,非常难识别和防御,通常采用的包过滤或限制速率的措施只是通过停止服务来简单停止攻击任务,但同时合法用户的请求也被拒*,造成业务的中断或服务质量的下降;DDoS事件的突发性,往往在很短的时间内,大量的DDoS攻击数据就可是网络资源和服务资源消耗殆尽。

现在的DDoS防御手段不够完善

不管哪种DDoS攻击,,当前的技术都不足以很好的抵御。现在流行的DDoS防御手段——例如黑洞技术和路由器过滤,限速等手段,不仅慢,消耗大,而且同时也阻断有效业务。如IDS入侵监测可以提供一些检测性能但不能缓解DDoS攻击,防火墙提供的保护也受到其技术弱点的限制。其它策略,例如大量部署服务器,冗余设备,保证足够的响应能力来提供攻击防护,代价过于高昂。

黑洞技术

黑洞技术描述了一个服务提供商将指向某一目标企业的包尽量阻截在上游的过程,将改向的包引进“黑洞”并丢弃,以保全运营商的基础网络和其它的客户业务。但是合法数据包和恶意攻击业务一起被丢弃,所以黑洞技术不能算是一种好的解决方案。被攻击者失去了所有的业务服务,攻击者因而获得胜利。

路由器

许多人运用路由器的过滤功能提供对DDoS攻击的防御,但对于现在复杂的DDoS攻击不能提供完善的防御。

路由器只能通过过滤非基本的不需要的协议来停止一些简单的DDoS攻击,例如ping攻击。这需要一个手动的反应措施,并且往往是在攻击致使服务失败之后。另外,现在的DDoS攻击使用互联网必要的有效协议,很难有效的滤除。路由器也能防止无效的或私有的IP地址空间,但DDoS攻击可以很容易的伪造成有效IP地址。

基于路由器的DDoS预防策略——在出口侧使用uRPF来停止IP地址欺骗攻击——这同样不能有效防御现在的DDoS攻击,因为uRPF的基本原理是如果IP地址不属于应该来自的子网网络阻断出口业务。然而,DDoS攻击能很容易伪造来自同一子网的IP地址,致使这种解决法案无效。

本质上,对于种类繁多的使用有效协议的欺骗攻击,路由器ACLs是无效的。包括:

● SYN、SYN-ACK、FIN等洪流。

● 服务代理。因为一个ACL不能辨别来自于同一源IP或代理的正当SYN和恶意SYN,所以会通过阻断受害者所有来自于某一源IP或代理的用户来尝试停止这一集中欺骗攻击。

● DNS或BGP。当发起这类随机欺骗DNS服务器或BGP路由器攻击时,ACLs——类似于SYN洪流——无法验证哪些地址是合法的,哪些是欺骗的。

ACLs在防御应用层(客户端)攻击时也是无效的,无论欺骗与否,ACLs理论上能阻断客户端攻击——例如HTTP错误和HTTP半开连接攻击,假如攻击和单独的非欺骗源能被精确的监测——将要求用户对每一受害者配置数百甚至数千ACLs,这其实是无法实际实施的。

防火墙

首先防火墙的位置处于数据路径下游远端,不能为从提供商到企业边缘路由器的访问链路提供足够的保护,从而将那些易受攻击的组件留给了DDoS 攻击。此外,因为防火墙总是串联的而成为潜在性能瓶颈,因为可以通过消耗它们的会话处理能力来对它们自身进行DDoS攻击。

其次是反常事件检测缺乏的限制,防火墙首要任务是要控制私有网络的访问。一种实现的方法是通过追踪从内侧向外侧服务发起的会话,然后只接收“不干净”一侧期望源头发来的特定响应。然而,这对于一些开放给公众来接收请求的服务是不起作用的,比如Web、DNS和其它服务,因为黑客可以使用“被认可的”协议(如HTTP)。

第三种限制,虽然防火墙能检测反常行为,但几乎没有反欺骗能力——其结构仍然是攻击者达到其目的。当一个DDoS攻击被检测到,防火墙能停止与攻击相联系的某一特定数据流,但它们无法逐个包检测,将好的或合法业务从恶意业务中分出,使得它们在事实上对IP地址欺骗攻击无效。

IDS入侵监测

IDS解决方案将不得不提供*的行为或基于反常事务的算法来检测现在的DDoS攻击。但是一些基于反常事务的性能要求有专家进行手动的调整,而且经常误报,并且不能识别特定的攻击流。同时IDS本身也很容易成为DDoS攻击的牺牲者。

作为DDoS防御平台的IDS*大的缺点是它只能检测到攻击,但对于缓和攻击的影响却毫无作为。IDS解决方案也许能托付给路由器和防火墙的过滤器,但正如前面叙述的,这对于缓解DDoS攻击效率很低,即便是用类似于静态过滤串联部署的IDS也做不到。

DDoS攻击的手动响应

作为DDoS防御一部份的手动处理太微小并且太缓慢。受害者对DDoS攻击的典型*反应是询问*近的上游连接提供者——ISP、宿主提供商或骨干网承载商——尝试识别该消息来源。对于地址欺骗的情况,尝试识别消息来源是一个长期和冗长的过程,需要许多提供商合作和追踪的过程。即使来源可被识别,但阻断它也意味同时阻断所有业务——好的和坏的。

其他策略

为了忍受DDoS攻击,可能考虑了这样的策略,例如过量供应,就是购买超量带宽或超量的网络设备来处理任何请求。这种方法成本效益比较低,尤其是因为它要求附加冗余接口和设备。不考虑*初的作用,攻击者仅仅通过增加攻击容量就可击败额外的硬件,互联网上上千万台的机器是他们取之不净的攻击容量资源。

有效抵御DDoS攻击

从事于DDoS攻击防御需要一种全新的方法,不仅能检测复杂性和欺骗性日益增加的攻击,而且要有效抵御攻击的影响。

完整的DDoS保护围绕四个关键主题建立:

1. 要缓解攻击,而不只是检测

2. 从恶意业务中精确辨认出好的业务,维持业务继续进行,而不只是检测攻击的存在

3. 内含性能和体系结构能对上游进行配置,保护所有易受损点

4. 维持可靠性和成本效益可升级性

建立在这些构想上的DDoS防御具有以下保护性质:

 通过完整的检测和阻断机制立即响应DDoS攻击,即使在攻击者的身份和轮廓不

断变化的情况下。

 与现有的静态路由过滤器或IDS签名相比,能提供更完整的验证性能。

 提供基于行为的反常事件识别来检测含有恶意意图的有效包。

 识别和阻断个别的欺骗包,保护合法商务交易。

 提供能处理大量DDoS攻击但不影响被保护资源的机制。

 攻击期间能按需求布署保护,不会引进故障点或增加串联策略的瓶颈点。

 内置智能只处理被感染的业务流,确保可靠性*大化和花销比例*小化。

 避免依赖网络设备或配置转换。

 所有通信使用标准协议,确保互操作性和可靠性*大化。

完整DDoS保护解决技术体系

基于检测、转移、验证和转发的基础上实施一个完整DDoS保护解决方案来提供完全保护,通过下列措施维持业务不间断进行:

1. 时实检测DDoS停止服务攻击攻击。

2. 转移指向目标设备的数据业务到特定的DDoS攻击防护设备进行处理。

3. 从好的数据包中分析和过滤出不好的数据包,阻止恶意业务影响性能,同时允许合法业务的处理。

4. 转发正常业务来维持商务持续进行。

Android实时获取音量(单位:分贝)

基础知识
度量声音强度,大家*熟悉的单位就是分贝(decibel,缩写为dB)。这是一个无纲量的相对单位,计算公式如下:

分子是测量值的声压,分母是参考值的声压(20微帕,人类所能听到的*小声压)。因此日常中说道声音强度是多少多少分贝时,都是默认了一个很小的参考值的。

而Android设备传感器可以提供的物理量是场的幅值(amplitude),常用下列公式计算分贝值:

从SDK中读取了某段音频数据的振幅后,取*大振幅或平均振幅(可以用平方和平均,或*对值的和平均),代入上述公式的A1。

现在问题是,作为参考值的振幅A0取多少呢?

博主查阅很多帖子、博文,这里是*一团浆糊的地方。有的博文取600,是基于它视噪音的振幅为600的假设,此时算出来的是相对背景噪音的分贝值,要是用户不对麦克风发出声音,算出的基本都是0分贝。而用户实际使用场景下的背景噪音大小千差万别,咱要是也照葫芦画瓢就不对了,尤其是对于那些制作*对分贝计的需求,应找出20微帕声压值对应的振幅(或者也可以拿一个标准分贝计做校准参考)。

博主比较懒,把A0定为1,即Android设备麦克风所能”听“到的*小声音振幅。这样拿到测量值振幅直接代入第二个公式的A1中,即可算出分贝值了。

Android API
使用麦克风需要在AndroidManifest.xml里申请相应权限:

<uses-permission android:name=”android.permission.RECORD_AUDIO” />
能够获得音源数据的类有两个:android.media. MediaRecorder 和android.media. AudioRecord 。
MediaRecorder:
这个类的对象初始化比较麻烦,因为它是被设计用来录制一段完整的音频并写入文件系统中的。但是初始化之后获得振幅却比较方便,我们直接用它的无参方法getMaxAmplitude即可获得一小段时间内音源数据中的*大振幅。不过取*大值的可能弊端是会受到*端数据的影响,使得后来计算的分贝值波动比较大。不过这个方法是很多录音应用计算音量等级所采用的办法。

该方法返回的是0到32767范围的16位整型,原理可能是对一段值域为-32768到32767的音源数据取其中*对值*大的值并返回。这个值与单位为帕斯卡的声压值是有线性函数关系的。另外需要注意的是*次调用这个方法取得的值是0,代入公式中算出的分贝值是负无穷大,故需要在代码中对这种情况做判断。可以算出,由于getMaxAmplitude返回的数值*大是32767,因此算出的*大分贝值是90.3。也就是说,博主令参考振幅值为1,计算出的分贝值正常值域为0 dB 到90.3 dB。

演示代码如下,基于hongfa.yy的代码改写:

package com.example.myapp;

import java.io.File;
import java.io.IOException;

import android.media.MediaRecorder;
import android.os.Handler;
import android.util.Log;

/**
* amr音频处理
*
* @author hongfa.yy
* @version 创建时间2012-11-21 下午4:33:28
*/
public class MediaRecorderDemo {
private final String TAG = “MediaRecord”;
private MediaRecorder mMediaRecorder;
public static final int MAX_LENGTH = 1000 * 60 * 10;// *大录音时长1000*60*10;
private String filePath;

public MediaRecorderDemo(){
this.filePath = “/dev/null”;
}

public MediaRecorderDemo(File file) {
this.filePath = file.getAbsolutePath();
}

private long startTime;
private long endTime;

/**
* 开始录音 使用amr格式
*
* 录音文件
* @return
*/
public void startRecord() {
// 开始录音
/* ①Initial:实例化MediaRecorder对象 */
if (mMediaRecorder == null)
mMediaRecorder = new MediaRecorder();
try {
/* ②setAudioSource/setVedioSource */
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风
/* ②设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default 声音的(波形)的采样 */
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
/*
* ②设置输出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式
* ,H263视频/ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB)
*/
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

/* ③准备 */
mMediaRecorder.setOutputFile(filePath);
mMediaRecorder.setMaxDuration(MAX_LENGTH);
mMediaRecorder.prepare();
/* ④开始 */
mMediaRecorder.start();
// AudioRecord audioRecord.
/* 获取开始时间* */
startTime = System.currentTimeMillis();
updateMicStatus();
Log.i(“ACTION_START”, “startTime” + startTime);
} catch (IllegalStateException e) {
Log.i(TAG,
“call startAmr(File mRecAudioFile) failed!”
+ e.getMessage());
} catch (IOException e) {
Log.i(TAG,
“call startAmr(File mRecAudioFile) failed!”
+ e.getMessage());
}
}

/**
* 停止录音
*
*/
public long stopRecord() {
if (mMediaRecorder == null)
return 0L;
endTime = System.currentTimeMillis();
Log.i(“ACTION_END”, “endTime” + endTime);
mMediaRecorder.stop();
mMediaRecorder.reset();
mMediaRecorder.release();
mMediaRecorder = null;
Log.i(“ACTION_LENGTH”, “Time” + (endTime – startTime));
return endTime – startTime;
}

private final Handler mHandler = new Handler();
private Runnable mUpdateMicStatusTimer = new Runnable() {
public void run() {
updateMicStatus();
}
};

/**
* 更新话筒状态
*
*/
private int BASE = 1;
private int SPACE = 100;// 间隔取样时间

private void updateMicStatus() {
if (mMediaRecorder != null) {
double ratio = (double)mMediaRecorder.getMaxAmplitude() /BASE;
double db = 0;// 分贝
if (ratio > 1)
db = 20 * Math.log10(ratio);
Log.d(TAG,”分贝值:”+db);
mHandler.postDelayed(mUpdateMicStatusTimer, SPACE);
}
}
}
AudioRecord:
这个类可以获得具体的音源数据值。将一段音源数据用read(byte[] audioData, int offsetInBytes, int sizeInBytes)方法从缓冲区读取到我们传入的字节数组audioData后,便可以对其进行操作,如求平方和或*对值的平均值。这样可以避免个别*端值的影响,使计算的结果更加稳定。求得平均值之后,如果是平方和则代入常数系数为10的公式中,如果是*对值的则代入常数系数为20的公式中,算出分贝值。

演示代码如下:

package com.example.myapp;

import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.util.Log;

/**
* Created by greatpresident on 2014/8/5.
*/
public class AudioRecordDemo {

private static final String TAG = “AudioRecord”;
static final int SAMPLE_RATE_IN_HZ = 8000;
static final int BUFFER_SIZE = AudioRecord.getMinBufferSize(SAMPLE_RATE_IN_HZ,
AudioFormat.CHANNEL_IN_DEFAULT, AudioFormat.ENCODING_PCM_16BIT);
AudioRecord mAudioRecord;
boolean isGetVoiceRun;
Object mLock;

public AudioRecordDemo() {
mLock = new Object();
}

public void getNoiseLevel() {
if (isGetVoiceRun) {
Log.e(TAG, “还在录着呢”);
return;
}
mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
SAMPLE_RATE_IN_HZ, AudioFormat.CHANNEL_IN_DEFAULT,
AudioFormat.ENCODING_PCM_16BIT, BUFFER_SIZE);
if (mAudioRecord == null) {
Log.e(“sound”, “mAudioRecord初始化失败”);
}
isGetVoiceRun = true;

new Thread(new Runnable() {
@Override
public void run() {
mAudioRecord.startRecording();
short[] buffer = new short[BUFFER_SIZE];
while (isGetVoiceRun) {
//r是实际读取的数据长度,一般而言r会小于buffersize
int r = mAudioRecord.read(buffer, 0, BUFFER_SIZE);
long v = 0;
// 将 buffer 内容取出,进行平方和运算
for (int i = 0; i < buffer.length; i++) {
v += buffer[i] * buffer[i];
}
// 平方和除以数据总长度,得到音量大小。
double mean = v / (double) r;
double volume = 10 * Math.log10(mean);
Log.d(TAG, “分贝值:” + volume);
// 大概一秒十次
synchronized (mLock) {
try {
mLock.wait(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
mAudioRecord.stop();
mAudioRecord.release();
mAudioRecord = null;
}
}).start();
}
}
实测结果(设备小米2S),MediaRecorderDemo波动很大,只要对麦克风一吹气,分贝值就能上90:

而AudioRecordDemo就很稳定了,很用力吹气也很难到88以上:

————————————————

HTTP 请求夹带(smuggling)攻击

什么是HTTP请求夹带(smuggling)攻击

HTTP请求走私是一种干扰网站处理从一个或多个用户接收的HTTP请求序列的方式的技术。

请求夹带漏洞危害,允许攻击者绕过安全控制,获取对敏感数据的未授权访问,并直接危及其他应用程序用户。

%title插图%num

 

 

 

HTTP请求夹带攻击是怎么发生的?

今天的Web应用程序经常在用户和*终应用程序逻辑之间使用HTTP服务器链。

用户将请求发送到前端服务器(有时称为负载平衡器或反向代理),此服务器将请求转发给一个或多个后端服务器。

在现代基于云的应用程序中,这种类型的体系结构越来越常见,并且在某些情况下是不可避免的。

当前端服务器将HTTP请求转发到后端服务器时,它通常通过相同的后端网络连接发送多个请求,因为这样做效率更高,性能更高。

协议非常简单:HTTP请求一个接一个地发送,接收服务器解析HTTP请求标头以确定一个请求结束的位置和下一个请求的开始:

%title插图%num

 

在这种情况下,前端和后端系统就请求之间的界限达成一致至关重要。否则,攻击者可能会发送一个模糊的请求,前端和后端系统会对其进行不同的解释:

%title插图%num

 

在这里,攻击者将后端服务器的部分前端请求解释为下一个请求的开始。它有效地预先附加到下一个请求,因此可能会干扰应用程序处理请求的方式。这是一次请求夹带攻击,它可能会造成严重的后果。

 

如何构造 HTTP 请求夹带漏洞

HTTP请求夹带漏洞出现的原因是因为HTTP规范提供了两种不同的方式来指定请求的结束位置:Content-Length标头和Transfer-Encoding标头。
Content-Length标头很简单,它以字节为单位指定消息体的长度。 例如:

  1. POST /search HTTP/1.1
  2. Host: normal-website.com
  3. Content-Type: application/x-www-form-urlencoded
  4. Content-Length: 11
  5. q=smuggling

 

Transfer-Encoding标头可用于指定消息体使用分块编码。
这意味着报文包含一个或多个数据块。 每个块包含以字节为单位的块大小(以十六进制表示),后跟换行符,后跟块内容。 消息以大小为零的块结束。 例如:

POST /search HTTP/1.1
Host: normal-website.com
Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked

b
q=smuggling
0

 

由于HTTP规范提供了两种不同的方法来指定HTTP消息的长度,因此单个消息可以同时使用这两种方法,这样它们就会相互冲突。

HTTP规范试图通过声明防止此问题,如果Content-Length和Transfer-Encoding标头都存在,则应忽略Content-Length标头。这可能足以避免在只有一台服务器正在运行时出现歧义,但在两台或多台服务器链接在一起时则不行。

在这种情况下,出现问题有两个原因:
1.某些服务器不支持请求中的Transfer-Encoding标头。
2.如果标头以某种方式进行模糊处理,则可能会导致某些支持Transfer-Encoding标头的服务器不处理它。

如果前端服务器和后端服务器与(可能模糊的)Transfer-Encoding标头的行为不同,那么他们可能不同意连续请求之间的边界,从而导致请求夹带漏洞。

如何执行HTTP请求夹带攻击

请求夹带攻击涉及将Content-Length头和Transfer-Encoding头放入单个HTTP请求并对其进行操作,以便前端和后端服务器以不同方式处理请求。完成此操作的确切方式取决于两台服务器的行为:

CL.TE:前端服务器使用Content-Length头,后端服务器使用Transfer-Encoding头。
TE.CL:前端服务器使用Transfer-Encoding标头,后端服务器使用Content-Length标头。
TE.TE:前端和后端服务器都支持Transfer-Encoding标头,但是可以通过以某种方式模糊标头来诱导其中一个服务器不处理它

CL.TE漏洞

这里前端服务器使用Content-Length头,后端服务器使用Transfer-Encoding头。我们可以执行简单的HTTP请求夹带攻击,如下所示:

POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 13
Transfer-Encoding: chunked

0

SMUGGLED

 

前端服务器处理Content-Length头并确定请求主体长度为13个字节,直到SMUGGLED结束。此请求将转发到后端服务器。

后端服务器处理Transfer-Encoding标头,因此将消息体视为使用分块编码。

它处理*个块,它被称为零长度,因此被视为终止请求。以下字节SMUGGLED未经处理,后端服务器将这些字节视为序列中下一个请求的开始。

 

TE.CL漏洞
这里,前端服务器使用Transfer-Encoding标头,后端服务器使用Content-Length标头。我们可以执行简单的HTTP请求夹带攻击,如下所示:

POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 3
Transfer-Encoding: chunked

8
SMUGGLED
0

 

注意:
要使用Burp Repeater发送此请求,您首先需要转到Repeater菜单,并确保未选中“Update Content-Length”选项。
您需要在*后的0之后包含尾随序列\r\n\r\n

前端服务器处理Transfer-Encoding标头,因此将消息体视为使用分块编码。它处理*个块,长度为8个字节,直到SMUGGLED之后的行的开头。它处理第二个块,它被称为零长度,因此被视为终止请求。此请求将转发到后端服务器。
后端服务器处理Content-Length标头并确定请求主体长度为3个字节,直到8之后的行的开头。以SMUGGLED开头的以下字节未经处理,后端服务器将这些视为序列中下一个请求的开头。

 

TE.TE行为:混淆TE头、

这里,前端和后端服务器都支持Transfer-Encoding标头,但是可以通过以某种方式模糊标头来诱导其中一个服务器不处理它。

有可能无休止地混淆Transfer-Encoding标头。例如:

Transfer-Encoding: xchunked

Transfer-Encoding : chunked

Transfer-Encoding: chunked
Transfer-Encoding: x

Transfer-Encoding:[tab]chunked

[space]Transfer-Encoding: chunked

X: X[\n]Transfer-Encoding: chunked

Transfer-Encoding
: chunked

 

这些技术中的每一种都涉及到与HTTP规范的细微偏离。实现协议规范的实际代码很少以*对精度遵守它,并且不同的实现通常容忍规范的不同变化。要发现TE.TE漏洞,有必要找到Transfer-Encoding标头的一些变体,以便只有一个前端或后端服务器处理它,而另一个服务器忽略它。

根据是否可以诱导不处理混淆的Transfer-Encoding标头的前端服务器或后端服务器,攻击的其余部分将采用与CL.TE或TE.CL漏洞相同的形式已经描述过。

 

如何防止HTTP请求夹带漏洞

在前端服务器通过同一网络连接将多个请求转发到后端服务器的情况下会出现HTTP请求走私漏洞,并且用于后端连接的协议存在两个服务器不同意关于两者之间边界的风险要求。防止HTTP请求走私漏洞的一些通用方法如下:

禁用后端连接的重用,以便通过单独的网络连接发送每个后端请求。
使用HTTP / 2进行后端连接,因为此协议可防止请求之间的边界模糊不清。
为前端和后端服务器使用完全相同的Web服务器软件,以便他们就请求之间的界限达成一致。
在某些情况下,可以通过使前端服务器规范化模糊请求或使后端服务器拒*模糊请求并关闭网络连接来避免漏洞。然而,这些方法可能比上面确定的通用缓解更容易出错。

 

web-security 练习
要解决实验问题,请将请求走私到后端服务器,以便后端服务器处理的下一个请求似乎使用GPOST方法。

针对WEB服务器的攻击途径和防范措施

对策:
1:停止运行不需要的软件
2:定期实施漏洞防范措施
3:对不需要对外公开的端口或者服务加以访问限制,
通过端口扫描确认各端口服务状态(工具:Nmap(windows版))
4:提高认证强度(https,实名认证,数据加的密码MD5加密)

一:关于弱口令
1:密码必段要有条件限制,如数字+字母+特殊字符
2:密码输入次数必须要有限制,如:输入3次不成功,禁N小时,输入5次不成功,禁一天
3:登陆之前要有图片验证码或者短信验证码,加强防止黑客攻击
二:关于上传文件
1:需要限制上传文件的格式
2:建议除了验证文件的后缀, 还要验证文件的头文件内容(以防黑客把一个病毒改成我们可以上传的后缀名上传到服务器)
三:建议使用HTTPS
四:需要升级strusts 2,修复安全漏洞

出现过的安全问题:
1:服务器被黑客攻击,导致防问网站很慢
2:注册短信被黑客随机用程序模拟攻击,导致短信发送完毕,注册程序无法正常打开
3:数据库的索引没有设置好,由于用户访问过多,每次都进行大量的查询,导致模拟炒股程序无法打开,mongo数据库和mysql数据库的压力很大
4:邮件服务器被攻击,导致邮件发送和接收不到
5:数据库被攻击
6:系统和程序的漏洞
7:钓鱼攻击

安全性测试方法
1:委托专家进行漏洞诊断
2:使用专业工具进行诊断
3:进行自我诊断

攻击方法:
1:SQL注入攻击
2:跨站脚本攻击(XSS)
3:在服务器上执行上传的脚本或文件进行攻击,诱使用户下载恶意文件
4:OS命令注入漏洞
(手段:调用sendmail命令发送邮件
产生原因:
1)使用了内部调用shell的函数,system,open等
2)将外界传入的参数传递给内部调用shell的函数
3)参数中shell的元字符没有被转义)
5:eval函数的使用方法不当(导致信息泄漏,篡改网站,执行非法操作,攻击其他网站)
6:共享资源漏洞

运维阶段的注意事项
1:对日志文件的监视
2:漏洞对策
3:对上次诊断之后新增加的页面或者功有进行诊断
4:检查新出现的攻击方法的对策

典型安全功能:
1:登陆力能
1)通过SQL注入攻击来跳过登陆功能
2)通过SQL注入攻击获取用户密码
3)在登陆页面进行暴力破解
4)通过社会化攻击得到用户密码(指通过欺骗用户得到重要信息)
5)通过钓鱼方法获取密码

攻击服务器的方式

网络攻击服务器时间常常都有发生,那是因为黑客通过攻击服务器可以截取到信息资料,从而获得一定的利益。
近些年,DDos等网络攻击范围覆盖了多个行业,其中游戏和金融行业收到受到的攻击*多。

那么,黑客有哪些常用来攻击云服务器的方式呢?

1、重新发送数据攻击

重新发送数据攻击简单的说就是黑客收集了特定的IP数据包之后篡改其种数据,然后将这些修改后的数据重新发送,欺骗接收数据的目标服务器,攻击破坏服务器的安全。

2、伪造信息进行攻击

伪造信息攻击黑客发送伪造路由器信息,构造源和目标服务器之间的虚假途径,从而截取数据包,获取敏感信息

3、数据驱动攻击

黑客发送或复制一些特殊程序给目标服务器,程序被执行时所发起的攻击。该攻击可以让黑客在目标服务器上修改与网络安全有关的文件,从而使黑客在下一次更容易入侵该服务器。数据驱动攻击的种类有很多包括缓冲区溢出攻击、格式化字符串攻击、输入验证攻击、同步漏洞攻击、信任漏洞攻击等。

4、对协议弱点攻击

在局域网中,IP地址的源路径选项允许IP数据包自己选择一条通往目标服务器的路径。黑客送出的请求报文中设置IP地址源路径选项,使得报文的某一个目的地址指向防火墙,但是*终地址却指向目标服务器。

当报文到达防火墙时被允许通过,防火墙的IP层处理该报文的源路径被改变,并发送到内部网上,报文就这样到达目标地,从而实现了针对信息协议弱点攻击。

几个有效防止服务器攻击的小妙招

互联网的高速增长,线上办公,线上娱乐越来越多,也带来巨大的经济收益,但有经济利益的地方,就有人想非法会去从中获利,*直接的方法就是去攻击这些网站的服务器了。
网络攻击方式多种多样,大概可以分成四类型:

1、人性式攻击,比如钓鱼式攻击;

2、中间人攻击,各式各样的网络攻击,几乎都是中间人攻击,比如ARP欺骗、DNS欺骗;

3、缺陷式攻击,如DDOS攻击;

4、漏洞式攻击,就是所谓的0day Hacker,这种攻击是*致命的。

对于大多站长来说,网站受到*多攻击方式就是DDOS攻击。

DDOS攻击(分布式拒*服务攻击)是目前常见的网络攻击方法。简单来说,多个DoS攻击源一起攻击某台服务器就形成了DDOS攻击。DDoS攻击的危害很大,而且很难防范,可以直接导致网站宕机、服务器瘫痪,数据流失等巨大损失,影响非常大。

以下有几个方法可以受到DDOS攻击的机会

1、持续更新系统

首先我们就是要确保服务器软件没有任何漏洞,防止攻击者入侵。一定要确定服务器是采用*新系统,并打上安全补丁。在服务器上删除未使用的服务,关闭未使用的端口。对于服务器上运行的网站,确保其打了*新的补丁,没有安全漏洞。因为,只有保证自身安全,才能让“敌人”没有可趁之机。

2、如果可以,*好隐藏服务器IP

可以选择将所有的域名以及子域名都使用CDN来解析,这样可以隐藏服务器的真实IP,从而也不容易让服务器被DDOS攻击。

3、发送邮件要小心

一般情况下,服务器对外传送信息会泄漏IP,因此,大家*好别用服务器来大量发送邮件。如果一定要发送邮件,可以通过第三方代理软件进行发送,这样显示出来的IP是代理IP,也不容易暴露服务器真实IP。另外,目前80%以上的网络攻击都是从一封钓鱼邮件开始的。因此,除了不要“明目张胆”的发送邮件外,对于,来历不明的邮件、文件以及链接也不要轻易的点击,以免惹来麻烦。

4、可以选择高防服务器

选择高防服务器或将服务器托管到高防的机房,可以抑制一部分DDOS攻击,从而降低服务器被打死的情况,配合以上几点,能使服务器更安全。

以上几点,比较容易达到的就是更新系统和选择高防服务器,平时各位站长也要提高安全意识,做好服务器的日常维护。

服务器如何防攻击?

服务器如何防攻击?

随着互联网安全的重要性,服务器作为数据运行的载体,尤其是服务器被攻击的影响非常大,不但会影响到网站的权重,严重的还会严重影响到业务的正常运行,做好服务器安全防护是每位站长必备的职责。

下面就给大家分享一下预防服务器的四种常见攻击?

一、DDOS攻击

DDOS攻击是服务器常见的一种攻击,它的攻击方式有很多,*常见的是通过服务请求来占用服务资源,从而导致用户无法得到服务响应。预防DDOS攻击的*有效的方法是选择设有机房硬防的机房,硬件防火墙能够有效预防DDOS攻击和黑客攻击。硬防虽然能够有效预防DDOS攻击,但对CC攻击的基本无效,CC攻击需要通过软件防火墙来防御。

二、漏洞

漏洞也是黑客*主要的入侵途径,黑客可以通过系统漏洞、程序漏洞等对服务器实行攻击。每个系统、程序或多或少会存在有一些漏洞,或系统本身就存在的漏洞,或系统管理员配置错误导致的漏洞,站长朋友应该及时给服务器系统打新补丁,及时升级程序新版本。

三、端口渗透

端口是病毒、木马入侵的*主要途径,所有端口都有可能是黑客的利用对象,通过端口对服务器实行攻击。具体怎么攻击这里就不细说了,主要讲一下怎么预防,想要预防黑客通过端口攻击服务器,*有效的方法是关闭不必要端口,修改重要端口。告诉大家对外少开放一个端口,黑客就少一个入侵途径,每开放一个服务就意味着对外多开放一个端口,在关闭端口的同时也要关闭一些不必要的服务。此外,修改一些重要端口可以加大黑客的扫描难度,这样也能有效地保护我们的服务器。

四、密码破解

黑客也有可能通过暴力破解的方法来破解超级管理员密码,从而对服务器实行攻击。要预防超级管理员密码被暴力破解,购买服务器后站长一定要修改超级管理员的默认密码,把密码修改成为一个复杂的英文加数字的组合密码,这样可以加大黑客破解密码的难度。再复杂的密码也有被破解的风险,所以建议密码定期修改一次。
同时以下上传的两张图片上的内容也是预防服务器预防攻击的方式方法。
*点:文件写入权限及时关闭
第二点:为了预防丢失源码以及数据,定期备份也是非常重要的
第三点:如果有时间要定期修改服务器管理员的账号以及密码,同时也要数据库要定期备份

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速