这篇写的东西年轻不懂事时其实有些曾踩到过,列在这提醒未来的自己不要再犯了
出於书本 Chapter 14. Web sites and Applications
类似於前一天讲的,基於 input
的验证缺陷,利用输入参数或是 script 来进行攻击。如果上网查的话,最常被拿出来讲的范例是 php
,比如说想透过 eval
debug ,debug 完之後又忘记移除这一行... [1]
<?php eval ("echo ".$_REQUEST["user_name"].";"); ?>
就有可能被恶意使用者,透过输入类似下面的 URL request,撷取出系统资讯
http://www.example.com/index.php?user_name=admin
http://www.example.com/index.php?user_name=admin;phpinfo();
http://www.example.com/index.php?user_name=admin;system('ls -l');
或是连带被攻击者透过这种方式实现 SQL injection。
透过清理输入来防止这种攻击,以 golang 来看的话,透过 ?
的方式引用 SQL Prepared Statement
的方式,先将参数在资料库编译完成後,再将其套用到 SQL 语句上执行。这是目前公定比较安全的处理方式,效能的表现也占有优势。
// 以下范例来自 golang 官方网站
// Correct format for executing an SQL statement with parameters.
rows, err := db.Query("SELECT * FROM user WHERE id = ?", id)
恶意攻击者透过在 URL request 里输入 SQL 语法,如 CONNECT
、 SELECT
或是 UNION
等尝试与程序後面的资料库做连线以窃取资讯。从 OWASP 捞两个常见的范例 [2]
假设有个简单的 SQL 语法像是
select id, firstname, lastname from authors
如果有个恶意使用者尝试在其中的 firstname
栏位里多输入一个单引号 '
,像是
select id, firstname, lastname from authors where firstname = 'malicious'ex' and lastname ='newman'
这样就会造成预期外的执行结果。
假如有个程序码要执行的 SQL 语法是使用串接字串的方式组合而成,像是下面的范例
string userName = getAuthenticatedUserName();
string query = "SELECT * FROM items WHERE owner = "'"
+ userName + "' AND itemname = '"
+ ItemName.Text + "'";
守规矩的情况不会发生什麽太大的问题
SELECT * FROM items WHERE owner = 'john' AND itemname = 'name';
但是如果在 WHERE
後面加上可以被执行的条件,效果就会等同於 SELECT * FROM items
SELECT * FROM items WHERE owner = 'john' AND itemname = 'name' OR 'a'='a';
而仅仅只是利用 itemname
後面加上 'name' OR 'a' = 'a'
更多 SQL injection 的范例可以参考 OWASP 的网站
注: Open Web Application Security Project (OWASP,开放网路应用程序安全计画)
[1] What is Code Injection and How to avoid it?
>>: Day 25:从头开始的 Scroll Behavior
display 这个属性实在是一个太重要的属性了,要在一个篇幅中讲完其实是不可能的事情,它可以说是目...
从出生的那一刻起,我们就一直不断向前,只能前进,直到终点。 2013.1.03 成为空服员的第一天...
在经历上一部函数与类别的摧残後,这两天就来教一些比较温和的程序吧~ 今天的影片内容为介绍常见的档案格...
Redis持久化 Redis持久化模式->RDB+AOF RDB+AOF两种模式整合在一起,可...
GitHub Repo https://github.com/b2etw/Spring-Kotlin...