网络编程是基础,安全是底线
你写的程序能连上网络,不等于它就安全。很多开发者一开始只关心功能能不能通,比如做个登录接口,发个请求拿数据,跑通了就收工。可问题往往出在这儿——功能通了,黑客也能“通”进来。
网络编程中埋下的安全隐患
比如用 Socket 写个服务端,监听某个端口接收数据。代码可能简单粗暴地把收到的内容直接拼进数据库查询语句里:
String query = "SELECT * FROM users WHERE name = '" + username + "'";
看着没啥问题,但只要用户输入一个带单引号的字符串,比如 admin' OR '1'='1,你的数据库就可能被拖走整张表。这就是典型的 SQL 注入,根源不在网络本身,而在处理网络数据时没设防。
安全不是附加功能,而是编程习惯
做 Web 开发,很多人一开始不知道 HTTP 头里的 Referer、Origin 能被伪造,以为靠这个就能防爬虫或跨站请求。结果别人用个 curl 或 Postman,换个头就绕过去了。
再比如上传文件,只在前端用 JavaScript 判断后缀名,后端直接保存。黑客改个包,传个 .php 文件上去,服务器立马变肉鸡。真正的防护得在后端重新校验类型、重命名文件、隔离执行环境。
加密传输不能靠“我觉得安全”
有些老系统还在用 HTTP 明文传密码,抓个包就能看到用户名。就算加了个 base64,也只是换了个姿势裸奔。真正的解决办法是 HTTPS,用 TLS 加密整个通信链路。这不只是配个证书的事,还得在编程时指定正确的协议版本,禁用老旧的加密套件。
比如在 Java 里创建连接时,得明确指定使用 TLSv1.2 以上:
SSLContext context = SSLContext.getInstance("TLSv1.2");
context.init(keyManagers, trustManagers, null);
SSLSocketFactory factory = context.getSocketFactory();
输入输出都要当“陌生人”防
只要是来自网络的数据,不管是 GET 参数、POST 体、Header 还是 Cookie,都得当成潜在攻击源。过滤、转义、验证一个都不能少。比如用户提交一段文本要展示在页面上,不做 HTML 转义,就可能被塞进一个 <script> 标签,变成 XSS 攻击。
正确做法是输出时转义特殊字符:
String safeOutput = userContent
.replace("&", "&")
.replace("<", "<")
.replace(">", ">");
权限控制不能写在客户端
有人图省事,前端隐藏一个管理按钮,以为用户就访问不了对应接口。其实只要抓个包,照着原来的格式重放请求,照样能操作。真正的权限必须在服务端验证,每次请求都检查用户身份和角色,不能依赖“你看不见”来保障安全。
网络编程决定了系统怎么通,网络安全决定了它能不能扛住恶意流量。两者从一开始就该绑在一起,而不是等出了事再去补洞。