内容目录
为了提高用户体验,开发者一般都会在浏览器端通过JavaScript对用户提交的表单内容进行预校验,比如:标题是否非空、邮箱地址是否符合指定的格式、手机号码是否符合指定的格式、用户名是否符合指定的格式、输入的金额是否是保留两位以内的小数且在有效范围内……只有在浏览器端校验通过后的表单内容才能够提交到后端服务器。
正因为如此,很多Web后端的开发人员就想当然地认为:前台提交过来的请求参数都是已经通过校验的,服务器端无需再重复进行相同的校验。
可是,这种做法在Web安全领域可谓是大错特错!!
因为,只有普通用户才会老老实实地在浏览器端按照正常的交互操作去提交表单。但我们的服务器端是可以接收任何一个有效的HTTP请求的——并非只有通过浏览器端才能向我们的服务器端发送表单数据。
@Test
public void test() throws IOException {
List<NameValuePair> list = new ArrayList<>(3);
list.add(new BasicNameValuePair("phone", "我想写啥就写啥,绕过你的前端校验"));
list.add(new BasicNameValuePair("name", "实现一个亿的小目标"));
list.add(new BasicNameValuePair("money", "100000000"));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, StandardCharsets.UTF_8);
HttpPost request = new HttpPost("https://codeplayer.vip/path/to/post");
request.setEntity(entity);
HttpClient client = HttpClients.createDefault();
HttpResponse response = client.execute(request);
String respText = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
// TODO 处理响应内容
}
如上所示,我们可以使用 Java 中的 HttpClient 轻松伪造并发送一个表单请求,请求地址、请求头和请求的表单参数内容,我们都可以随心所欲地自行构造(其他语言也都与此类似)。
即使我们不使用 Java,我们打开浏览器的控制台,通过 JS 代码也可以很轻松地构造出一个自定义的表单内容,然后通过 AJAX API提交到后台。
我们可以看出,只要是一个有点编程经验的人,就可以轻松绕过我们在前端浏览器所设定的任何校验!
因此,作为Web应用的开发人员,当我们在接收到任何请求时,都不能够直接相信它的请求内容是合法的!
我们必须在服务器端对所有的业务表单请求参数再进行一次校验!
0 条评论
撰写评论