域名注册信息查询: Whois在线查询目标网络信息DNS和IP,nslookup
在线漏洞搜索引擎: fofa.info,shodan.io,zoomeyes.org(https://www.zoomeye.org/)
指纹识别:CMS识别工具(如:http://whatweb.bugscaner.com/batch.html),操作系统识别工具
综合扫描:Nmap,masscan
网站路径扫描:御剑,WWWSCAN,dirb
主机漏洞扫描:Nessus
WEB应用漏洞扫描:AWVS,AppScan, Xray
代码审计:RIPS,Fortify SCA
抓包分析:wireshark,科来, tcpdump
SQL注入:Sqlmap,XSS扫描:XSStrike 。。。。。
集成攻击平台:Burpsuite,Metasploit,Cobalt Strike
反编译调试工具:IDA PRO, Onlydbg,WinHex,jd-gui, Dcompile….
Shell连接工具:中国菜刀,蚁剑,冰蝎,哥斯拉
系统hash破解:pwdump,Shadow,LC5/JOHN,http://www.objectif-securite.ch在线破解
内网抓取hash:WCE,Mimikatz(抓取登录过主机的用户),Procdump+mimikatz,John,Getpass,MSF
网络已公开的各类成熟exp:strusts2工具集,Java反序列化工具,MS08-067等等等
WebShell:基于Web开发语言(如PHP、Java、Python、C#、Go、JavaScript等)制作的木马程序,大马,小马。
Shell Code:也属于一种木马程序,但是只有代码本身,非可执行程序,可以自已加工和编译。具备一定的免杀能力。
Payload:有效载荷(在通信协议中,抛开通信协议本身的规则字段,实际传输的数据本身),攻击载荷:具备攻击特征的数据,如GET请求的URL地址参数,或POST的请求正文,HTTP标头的攻击数据包。在渗透测试领域称为攻击载荷。
肉鸡:受攻击者远程控制的主机,以前的肉鸡更多是个人电脑,现在很多肉鸡是云服务器。
POC:Proof of Concept:概念验证,用于在发现漏洞后,编写程序或Payload进行验证,确认漏洞的存在。
EXP/Exploit:漏洞利用
CC:Challenge Collapsar, 挑战黑洞,攻击者通过代理服务器或者肉鸡向向受害主机不停地发大量数据包,造成对方服务器资源耗尽,一直到宕机崩溃。
C2:Command & Control,主要是指攻击者通过与恶意软件的交互,对被害者进行控制,从而实施恶意活动的含义。
FUZZ:模糊测试,用于基于规则或字典等进行快速的不精准的测试,进而发现可能存在漏洞的地方,
DDOS:Distributed Deny of Service:分布式,肉鸡,代理,云服务器
横向移动,内网渗透:获取到某一台主机权限后,继教在局域网漫游,扫描,进而实现对其他主机的入侵。
社工:社会工程学
社工库:一些正规或非正归渠道获取到的各类数据,身份信息,家庭信息,教育信息,支付购买、差旅出国等。
WAF:Web Application Firewall,进行Web渗透时,需要想办法绕开防火墙,免杀木马的设计等。
IDS:Intrusion Detection System:入侵检测系统,用于检测攻击威胁并进行预警
IPS:Intrusion Prevention System:在检测的基础上,增加了主动防御的功能
NGFW:Next Generation FireWall:下一代防火墙,传统防火墙+IDS+预警+IPS+态势感知+AI………(性能)
脆弱项:Weakness:可能存在一些安全风险
威胁:Threat:明确存在安全风险
攻击:Attack:直接利用了安全漏洞,形成了攻击,甚至获取了权限等
漏洞:Vulnerability
APT:Advanced Persistent Threat:高级可持续威胁(大型的,综合技术,商业或政治间谍),了解案例和组织
提权:将普通权限提升到高级权限
越权:张三拥有了李四的权限:
RCE:Remote Command/Code Execute 分为远程命令执行 / 远程代码执行
SRC:Security Response Center,安全应急响应中心, https://www.anquanke.com/post/id/84608,有时候也叫SRC漏洞(即公共平台的漏洞挖掘任务,是授权挖掘:https://blog.csdn.net/qq_33608000/article/details/122726675)
注意:有时候说源也叫src,是source的简写
SEIM:Security Event Information Management System:安全事件管理平台,态势感知(数据采集、数据分析展示)
安全左移:将安全提前到研发阶段(安全分析、安全设计、安全架构、安全编码、安全测试)
SDL:Security Development Lifecycle,Software Development Lifecycle。安全分析、安全设计、安全架构、安全编码、安全测试、渗透测试、安全防御、安全运营。
CVE:http://cve.mitre.org/cve/search_cve_list.html,了解一下MITRE:https://zhuanlan.zhihu.com/p/162799295
CWE:http://cwe.mitre.org/data/definitions/1337.html,https://blog.csdn.net/weixin_43500506/article/details/114656358
OWASP:https://blog.csdn.net/lxc408863575/article/details/120219572, https://owasp.org/www-project-top-ten/
CNVD:https://www.cnvd.org.cn/
CNNVD:http://www.cnnvd.org.cn/
漏洞盒子:https://www.vulbox.com/
补天:https://www.butian.net/
ExploitDB:https://www.exploit-db.com/
A01:2021-Broken Access Control moves up from the fifth position; 94% of applications were tested for some form of broken access control. The 34 Common Weakness Enumerations (CWEs) mapped to Broken Access Control had more occurrences in applications than any other category.
从第五位上升;94% 的应用程序都经过了某种形式的破坏访问控制的测试。映射到 Broken Access Control 的 34 个 CWE 在应用程序中出现的次数比任何其他类别都多。
**场景 #1:**应用程序在访问帐户信息的 SQL 调用中使用未经验证的数据:
pstmt.setString(1, request.getParameter("acct"));结果集结果 = pstmt.executeQuery();
攻击者只需修改浏览器的“acct”参数即可发送他们想要的任何帐号。如果没有正确验证,攻击者可以访问任何用户的帐户。
https://example.com/app/accountInfo?acct=notmyacct
**场景#2:**攻击者只是强制浏览到目标 URL。访问管理页面需要管理员权限。
https://example.com/app/getappInfo https://example.com/app/admin_getappInfo
如果未经身份验证的用户可以访问任一页面,则这是一个缺陷。如果非管理员可以访问管理页面,这是一个缺陷。
A02:2021-Cryptographic Failures shifts up one position to #2, previously known as Sensitive Data Exposure, which was broad symptom rather than a root cause. The renewed focus here is on failures related to cryptography which often leads to sensitive data exposure or system compromise.
上移一位至 #2,以前称为敏感数据泄露,这是广泛的症状而不是根本原因。此处重新关注与密码学相关的漏洞,这些漏洞通常会导致敏感数据泄露或系统受损。
场景#1:应用程序使用自动数据库加密对数据库中的信用卡号进行加密。但是,此数据在检索时会自动解密,从而允许 SQL 注入缺陷以明文形式检索信用卡号。
场景#2:站点不使用或对所有页面强制执行 TLS 或支持弱加密。攻击者监视网络流量(例如,在不安全的无线网络中),将连接从 HTTPS 降级为 HTTP,拦截请求并窃取用户的会话 cookie。然后攻击者重放这个 cookie 并劫持用户的(经过身份验证的)会话,访问或修改用户的私人数据。除了上述之外,他们还可以更改所有传输的数据,例如,汇款的接收者。
场景#3:密码数据库使用未加盐或简单的哈希来存储每个人的密码。文件上传缺陷允许攻击者检索密码数据库。所有未加盐的哈希值都可以通过预先计算的哈希值彩虹表公开。由简单或快速散列函数生成的散列可能会被 GPU 破解,即使它们被加盐。
A03:2021-Injection slides down to the third position. 94% of the applications were tested for some form of injection, and the 33 CWEs mapped into this category have the second most occurrences in applications. Cross-site Scripting is now part of this category in this edition.
下滑到第三位。94% 的应用程序都针对某种形式的注入进行了测试,映射到此类别的 33 个 CWE 在应用程序中的出现次数排名第二。跨站点脚本攻击现在是此版本中此类别的一部分。
不仅是SQL注入、还有命令注入、协议流注入、文件注入、代码注入等类别
**场景 #1:**应用程序在构建以下易受攻击的 SQL 调用时使用不受信任的数据:
String query = “SELECT * FROM accounts WHERE custID=’” + request.getParameter(“id”) + “‘“;
**场景#2:**类似地,应用程序对框架的盲目信任可能会导致查询仍然存在漏洞(例如,Hibernate 查询语言 (HQL)):
Query HQLQuery = session.createQuery(“FROM accounts WHERE custID=’” + request.getParameter(“id”) + “‘“);
在这两种情况下,攻击者都会修改浏览器中的 ‘id’ 参数值以发送:’ 或 ‘1’=’1。例如:
http://example.com/app/accountView?id=‘ 或 ‘1’=’1
这将更改两个查询的含义以返回帐户表中的所有记录。更危险的攻击可能会修改或删除数据,甚至调用存储过程。
A04:2021-Insecure Design is a new category for 2021, with a focus on risks related to design flaws. If we genuinely want to “move left” as an industry, it calls for more use of threat modeling, secure design patterns and principles, and reference architectures.
是2021 年的一个新类别,重点关注与设计缺陷相关的风险。如果我们真的想作为一个行业“安全左移”,就需要更多地使用威胁建模、安全设计模式和原则以及参考架构。
**场景 #1:**凭证恢复工作流程可能包括“问答”,这是 NIST 800-63b、OWASP ASVS 和 OWASP Top 10 所禁止的。不能将问答作为多个人身份的证据可以知道答案,这就是为什么它们被禁止。此类代码应删除并替换为更安全的设计。
**场景#2:**连锁影院允许团体预订折扣,并且在要求押金之前最多有 15 名参与者。攻击者可以对该流程进行威胁建模,并测试他们是否可以在几次请求中一次预订 600 个座位和所有电影院,从而造成巨大的收入损失。
**场景 #3:**零售连锁店的电子商务网站没有针对由黄牛运行的机器人提供保护,这些机器人购买高端显卡以转售拍卖网站。这对视频卡制造商和零售连锁店主造成了可怕的宣传,并与无法以任何价格获得这些卡的爱好者之间产生了仇恨。仔细的反机器人设计和域逻辑规则,例如在可用性的几秒钟内进行的购买,可能会识别出不真实的购买并拒绝此类交易。
A05:2021-Security Misconfiguration moves up from #6 in the previous edition; 90% of applications were tested for some form of misconfiguration. With more shifts into highly configurable software, it’s not surprising to see this category move up. The former category for XML External Entities (XXE) is now part of this category.
从上一版的第 6 位上升;90% 的应用程序都经过了某种形式的错误配置测试。随着更多定制性高度可配置的软件,看到这一类别上升也就不足为奇了。XML 外部实体 (XXE) 的前一个类别现在属于此类别。
**场景#1:**应用程序服务器带有未从生产服务器中删除的示例应用程序。这些示例应用程序具有攻击者用来破坏服务器的已知安全漏洞。假设这些应用程序之一是管理控制台,并且默认帐户未更改。在这种情况下,攻击者使用默认密码登录并接, 管。
**场景#2:**服务器上没有禁用目录列表。攻击者发现他们可以简单地列出目录。攻击者找到并下载已编译的 Java 类,对其进行反编译和逆向工程以查看代码。然后攻击者发现应用程序中存在严重的访问控制缺陷。
**场景#3:**应用服务器的配置允许将详细的错误消息(例如堆栈跟踪)返回给用户。这可能会暴露敏感信息或潜在缺陷,例如已知易受攻击的组件版本。
**场景#4:**云服务提供商拥有其他 CSP 用户对 Internet 开放的默认共享权限。这允许访问存储在云存储中的敏感数据。
A06:2021-Vulnerable and Outdated Components was previously titled Using Components with Known Vulnerabilities and is #2 in the Top 10 community survey, but also had enough data to make the Top 10 via data analysis. This category moves up from #9 in 2017 and is a known issue that we struggle to test and assess risk. It is the only category not to have any Common Vulnerability and Exposures (CVEs) mapped to the included CWEs, so a default exploit and impact weights of 5.0 are factored into their scores.
之前的标题是 使用具有已知漏洞的组件,在行业调查中排名第二,但也有足够的数据通过数据分析进入前 10 名。该类别从 2017 年的第 9 位上升,是我们难以测试和评估风险的已知问题。它是唯一没有任何 CVE 映射到包含的 CWE 的类别,因此默认的利用和影响权重 5.0 被计入他们的分数。
**场景#1:**组件通常以与应用程序本身相同的权限运行,因此任何组件中的缺陷都可能导致严重影响。此类缺陷可能是偶然的(例如,编码错误)或有意的(例如,组件中的后门)。发现的一些可利用组件漏洞的示例是:
有一些自动化工具可以帮助攻击者找到未打补丁或配置错误的系统。例如,Shodan IoT 搜索引擎可以帮助您找到仍然存在 2014 年 4 月修补的 Heartbleed 漏洞的设备。
A07:2021-Identification and Authentication Failures was previously Broken Authentication and is sliding down from the second position, and now includes CWEs that are more related to identification failures. This category is still an integral part of the Top 10, but the increased availability of standardized frameworks seems to be helping.
以前是 Broken Authentication 失效的身份认证并且从第二位下滑,现在包括与识别失败更多相关的 CWE。这个类别仍然是前 10 名的一个组成部分,但标准化框架的可用性增加似乎有所帮助。
**场景#1:**凭证填充(使用已知密码列表)是一种常见的攻击。假设应用程序没有实施自动化威胁或凭证填充保护。在这种情况下,应用程序可以用作密码预言机来确定凭证是否有效。
**场景#2:**大多数身份验证攻击是由于继续使用密码作为唯一因素而发生的。一经考虑,最佳实践、密码轮换和复杂性要求会鼓励用户使用和重复使用弱密码。建议组织按照 NIST 800-63 停止这些做法并使用多因素身份验证。
**场景 #3:**应用程序会话超时设置不正确。用户使用公共计算机访问应用程序。用户没有选择“注销”,而是简单地关闭浏览器选项卡并走开。攻击者在一个小时后使用同一个浏览器,而用户仍然通过身份验证。
A08:2021-Software and Data Integrity Failures is a new category for 2021, focusing on making assumptions related to software updates, critical data, and CI/CD pipelines without verifying integrity. One of the highest weighted impacts from Common Vulnerability and Exposures/Common Vulnerability Scoring System (CVE/CVSS) data mapped to the 10 CWEs in this category. Insecure Deserialization from 2017 is now a part of this larger category.
是 2021 年的一个新类别,专注于在不验证完整性的情况下做出与软件更新、关键数据和 CI/CD 管道相关的假设。CVE/CVSS 数据的最高加权影响之一映射到该类别中的 10 个 CWE。2017 年的不安全反序列化现在是这一更大类别的一部分。
场景 #1 不安全的反序列化: React 应用程序调用一组 Spring Boot 微服务。作为函数式程序员,他们试图确保他们的代码是不可变的。他们提出的解决方案是序列化用户状态并在每个请求中来回传递它。攻击者注意到“R00”Java 对象签名并使用 Java Serial Killer 工具在应用服务器上获取远程代码执行权。
**场景 #2 无需签名即可更新:**许多家用路由器、机顶盒、设备固件和其他固件不通过签名固件验证更新。未签名固件是攻击者越来越多的目标,预计只会变得更糟。这是一个主要问题,因为很多时候除了在未来版本中修复并等待以前的版本过时之外,没有任何补救机制。
场景#3 SolarWinds 恶意更新:众所周知,国家会攻击更新机制,最近的一次著名攻击是 SolarWinds Orion 攻击。开发该软件的公司拥有安全的构建和更新完整性流程。尽管如此,这些还是能够被破坏,并且在几个月的时间里,该公司向 18,000 多个组织分发了一个高度针对性的恶意更新,其中大约 100 个组织受到了影响。这是历史上此类性质最深远、最重大的违规行为之一。
A09:2021-Security Logging and Monitoring Failures was previously Insufficient Logging & Monitoring and is added from the industry survey (#3), moving up from #10 previously. This category is expanded to include more types of failures, is challenging to test for, and isn’t well represented in the CVE/CVSS data. However, failures in this category can directly impact visibility, incident alerting, and forensics.
以前是 日志记录和监控不足,是从行业调查 (#3) 中添加的,从之前的 #10 上升。此类别已扩展为包括更多类型的故障,难以测试,并且在 CVE/CVSS 数据中没有得到很好的体现。但是,此类故障会直接影响可见性、事件警报和取证。
**场景#1:**由于缺乏监控和日志记录,一家儿童健康计划提供商的网站运营商无法检测到违规行为。外部方通知健康计划提供者,攻击者访问并修改了超过 350 万儿童的数千份敏感健康记录。事后审查发现网站开发人员没有解决重大漏洞。由于没有对系统进行日志记录或监控,数据泄露可能自 2013 年以来一直在进行,时间超过七年。
**场景#2:**印度一家大型航空公司发生数据泄露事件,涉及数百万乘客超过十年的个人数据,包括护照和信用卡数据。数据泄露发生在第三方云托管服务提供商处,该提供商在一段时间后将泄露事件通知了航空公司。
**场景 #3:**一家主要的欧洲航空公司遭遇了 GDPR 可报告的违规行为。据报道,该漏洞是由攻击者利用的支付应用程序安全漏洞引起的,他们收集了超过 400,000 条客户支付记录。该航空公司因此被隐私监管机构罚款 2000 万英镑。
A10:2021-Server-Side Request Forgery is added from the Top 10 community survey (#1). The data shows a relatively low incidence rate with above average testing coverage, along with above-average ratings for Exploit and Impact potential. This category represents the scenario where the security community members are telling us this is important, even though it’s not illustrated in the data at this time.
是从行业调查 (#1) 中添加的。数据显示发生率相对较低,测试覆盖率高于平均水平,并且利用和影响潜力的评级高于平均水平。此类别代表行业专业人士告诉我们这很重要的场景,即使目前数据中没有说明。
**场景#1:**端口扫描内部服务器。如果网络架构是未分段的,攻击者可以绘制内部网络,并根据连接结果或连接或拒绝 SSRF 负载连接所用的时间来确定内部服务器上的端口是打开还是关闭。
**场景#2:**敏感数据暴露。攻击者可以访问本地文件,例如 或内部服务以获取敏感信息。
**场景#3:**访问云服务的元数据存储。大多数云提供商都有元数据存储,例如http://169.254.169.254/。攻击者可以读取元数据来获取敏感信息。
**场景#4:**破坏内部服务——攻击者可以滥用内部服务进行进一步的攻击,例如远程代码执行 (RCE) 或拒绝服务 (DoS)
1、在Linux主机上准备一套Xampp:模拟攻防
2、在VSCode利用Remote Development进行远程调试
3、在Lampp的htdos目录下创建security目录,用于编写服务器PHP代码
// 获取用户提交的登录请求数据
$username = $_POST['username'];
$password = $_POST['password'];
$vcode = $_POST['vcode'];
// 验证码的验证,OWASP-认证和授权失败
if($vcode !== '0000'){
die("vcode-error"); //向前端输出一条消息同时结束代码的运行
}
// 连接数据库
$conn = mysqli_connect('127.0.0.1','root','123456','learn') or die("数据库连接不成功!");
// 设置数据库的编码格式
mysqli_query($conn,"set names utf8;");
$sql = "select * from user where username ='$username' and password = '$password'";
$result = mysqli_query($conn,$sql); //$result称之为结果集
// 以下代码没用进行爆破的防护(OWASP-认证和授权失败)
if (mysqli_num_rows($result) == 1){
echo "login-pass
";
echo "";
}
else{
// echo "login-fail
";
echo "";
}
//关闭数据库
mysqli_close($conn)
?>
// OWASP-失效访问控制
// 修复方法:在显示文本之前,先进行SESSION变量的验证
include "common.php";
//isset() 函数用于检测变量是否已设置并且非 NULL。
if (!isset($_SESSION['islogin']) or $_SESSION['islogin'] != 'true'){
die ("请登录后再访问此页面");
}
echo '欢迎来到安全测试平台';
?>
在登录界面输入一个单引号[']作为用户名,Burp响应如下:
Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in /opt/lampp/htdocs/security/login.php
以上响应出现MySQL报错信息,上述报错信息存在两个漏洞:
1、单引号可以成功引起SQL语句报错,说明后台没有专门对单引号进行处理
select * from user where username ='$username' and password = '$password'
正常情况:select * from user where username ='root' and password = '$password'
攻击情况:select * from user where username =''' and password = '$password'
攻击Payload:
username:x' or userid=1#'
Post正文:
username=x' or+userid=1#'&password=111111&vcode=0000
select * from user where username ='x' or userid=1#'' and password = '$password'
2、在报错信息里泄露了敏感信息
/opt/lampp/htdocs/security/login.php(当前代码的绝对路径)
上述代码一共发现了6个漏洞
1、welcome.php页面谁都可以访问,没有进行登录判断(中)
2、在登录界面输入’作为用户名,报错信息存在login.php的绝对路径,暴露了系统后台的敏感信息(低)
3、保存用户信息的数据表中,密码字段是明文保存的,不够安全(中)
4、登录界面可以进行SQL注入,进而轻易实现登录(高)
5、login.php页面使用了万能验证码(中)
6、登录功能可以被爆破,没有进行爆破防护(中)
import requests
# 利用Python对PHP的登录界面进行Fuzz测试
def login_fuzz():
# 先使用单引号进行测试
url = 'http://192.168.72.148/security/login.php'
data = {'username': "'", 'password': '666666', 'vcode': '0000'}
resp = requests.post(url=url, data=data)
if 'Warning' in resp.text:
print("本登录功能可能存在SQL注入漏洞,可以尝试")
# 如果单引号存在利用嫌疑,则继续利用
payload_list = ["x' or id=1#", "x' or userid=1#", "x' or userid=2#"]
for username in payload_list:
data = {'username': username, 'password': '666666', 'vcode': '0000'}
resp = requests.post(url=url, data=data)
if "login-fail" not in resp.text:
print(f'登录成功,payload为:{data}')
else:
print('通过试探,发现后台界面对单引号不感兴趣;')
if __name__ == '__main__':
login_fuzz()
welcome.php页面谁都可以访问,没有进行登录判断,该页面是登录后才能访问,所以在该页面需要进行登录判断,代码修改为:
1、在common.php中添加session_start(),让其他页面引入,便于直接使用Session
session_start();
function create_connection(){
// 连接数据库
$conn = mysqli_connect('127.0.0.1','root','123456','learn') or die("数据库连接不成功!");
// 设置数据库的编码格式
mysqli_query($conn,"set names utf8;");
mysqli_set_charset($conn,'utf8');
return $conn;
}
?>
2、在welcome.php页面中,源代码修改为
// OWASP-失效访问控制
// 修复方法:在显示文本之前,先进行SESSION变量的验证
include "common.php";
//isset() 函数用于检测变量是否已设置并且非 NULL。
if (!isset($_SESSION['islogin']) or $_SESSION['islogin'] != 'true'){
die ("请登录后再访问此页面");
}
echo '欢迎来到安全测试平台';
?>
3、在login.php中,登录成功后添加以下代码
if (mysqli_num_rows($result) == 1){
echo "login-pass
";
// 登录成功后,记录SESSION变量
$_SESSION['username'] = $username;
$_SESSION['islogin'] = 'true';
echo "";
}
当在用户名输入单引号时,会引起后台报错,一方面说明后台没有对单引号进行转义处理,导致单引号可以被注入到SQL语句中,进而导致SQL语句中存在单独的一个单引号,SQL语句无法有效闭合,发生错误。同时,还将该代码的绝对路径暴露出来,属于敏感信息,应该将其屏蔽,修复代码如下:
$result = mysqli_query($conn,$sql) or die("SQL语句执行错误!") ;
$source = 'YikJiang';
echo md5($source);
//提示一:user表中password字段必须是32+位
//提示二:在用户注册时,必须使用md5函数将密码加密保存
从代码和SQL语句的逻辑层面进行考虑,不能轻易让密码对比失效
基于将用户输入的引号(单引号和双引号)进行转义处理的前提,可以使用PHP内置函数addslashes进行强制转义
修复后的代码如下:
$sql = "select * from user where username ='$username'";
$result = mysqli_query($conn,$sql) or die("SQL语句执行错误!") ; //$result称之为结果集
// 以下代码没用进行爆破的防护(OWASP-认证和授权失败)
//如果用户名真实存在,刚好找到一条,则再单独进行密码比较,即使用户名出现SQL注入漏洞,但是只要密码不正确,也无法登录
if (mysqli_num_rows($result) == 1){
// $row = mysqli_fetch_all($result,MYSQLI_ASSOC); //索引数组+下标数组
// $row = mysqli_fetch_row($result); //索引数组
$row = mysqli_fetch_assoc($result); //下标数组
// var_dump($row);
if ($password == $row['password']){
echo "login-pass
";
// 登录成功后,记录SESSION变量
$_SESSION['username'] = $username;
$_SESSION['islogin'] = 'true';
echo "";
}
else{
echo "login-fail";
}
}
else{
echo "login-fail
";
echo "";
}
addslashes函数可以将字符串中的单引号、双引号、反斜杠、NULL值自动添加转义符,从而防止SQL注入中对单引号和双引号的预防。
原始SQL语句如下:
select * from user where username ='$username' and password = '$password'
如果用户输入x' or userid=1#'
,则SQL语句变成:
select * from user where username ='x' or userid=1#'' and password = '$password'
如果使用addslashes
强制为用户输入添加转义符,则变成:
select * from user where username ='x\' or userid=1#\'' and password = '$password'
上述SQL语句的用户名为:x\’ or userid=1#\’
使用PHP自带的函数
// 面向过程的方式
function create_connection(){
// 连接数据库
$conn = mysqli_connect('127.0.0.1','root','123456','learn') or die("数据库连接不成功!");
// 设置数据库的编码格式
mysqli_query($conn,"set names utf8;");
mysqli_set_charset($conn,'utf8');
return $conn;
}
// 将数据库查询的结果集中的数据取出,保存到一个数组当中
$row = mysqli_fetch_assoc($result);
//mysqli_fetch_all默认使用索引数组,也可以设定参数强制使用关联数组
// $row = mysqli_fetch_all($result,MYSQLI_ASSOC);
// $row = mysqli_fetch_row($result); //索引数组
function create_connection_oop(){
$conn = new mysqli('127.0.0.1','root','123456','learn') or die("数据库连接不成功!");
// 两种方法设置字符集
// 1、$conn->query("set names utf8;")
// 2、
$conn->set_charset('utf8');
return $conn;
}
// 执行SQL语句
function test_mysqli_opp(){
$conn = create_connection_oop();
$sql = "select * from user where userid < 6";
$result = $conn->query($sql);
//获取结果集行数
echo $result->num_rows."";
// 获取结果集数组
// 使用关联数组
$rows = $result->fetch_all(MYSQLI_ASSOC);
// var_dump($rows);
// 遍历数组
foreach ($rows as $row){
echo "username:". $row['username'] . ",passwrod" . $row['password'] . "";
}
}
预处理的过程,就是先交给SQL数据库进行SQL语句的准备,准备好后再将SQL语句中的参数进行值的替换,引号会进行转义处理,将所有参数变成普通字符串,再进行第二次正式的SQL语句执行。MySQL的预处理既支持面向过程,也支持面向对象方式,但是我们后续直接使用面向对象的方式。
$conn = create_connection_oop();
$sql = "select userid,username,password,role from user where username= ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("s",$username); // 绑定查询参数
$stmt->bind_result($userid,$username2,$password2,$role); // 绑定结果参数
$stmt->execute(); // 执行
$stmt->store_result(); //调用结果
在MySQL数据库中运行以下语句,开启临时日志,将日志信息保存到表格mysql数据库的general_log表中。
#开启
use mysql;
set global log_output = 'TABLE';
set global general_log = 'ON';
#确认
show variables like "general_log";
MySQLi的预处理功能同样支持面向过程和面向对象
除了MySQLi用于处理数据库外,在PHP中还有最传统的MySQL和PDO两种方式
核心目的是确保是人在使用系统,图片验证码、拖动验证码、拼图验证码、问答验证码、计算验证码等。
添加源代码vcode.php,基于PHP绘制基础图片,生成验证码,然后将该验证码保存到Session变量
// 利用Session保存图片验证码
session_start();
getCode();
// 生成验证码图片
function getCode($vlen=4 , $width = 80 , $height = 25){
// 定义响应类型为PNG图片
header("content-type:image/png");
// 生成随机验证码字符串,并将其保存于Session中
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
$vcode =substr(str_shuffle($chars),0,$vlen);
$_SESSION['vcode'] = $vcode;
// 定义图片并设置背景色RGB为100,200,100
$image = imagecreate($width,$height); // 创建一个画布
$imageColor = imagecolorallocate($image,100,200,100);
// 以RGB=0,0,0,的颜色回值黑色的文字
$color = imagecolorallocate($image,0,0,0);
imagestring($image,5,20,5,$vcode,$color); // 5:字体大小 20:距离x轴的距离 5:距离y轴的距离
// 生成随机位置的干扰点
for($i=0;$i<50;$i++){
imagesetpixel($image,rand(0,$width),rand(0,$height),$color);
}
// 输出图片验证码,并将其在内存的数据销毁
imagepng($image);
imagedestroy($image);
}
?>
修改login.html
input[name='vcode']{
width: 200px;
}
YikJiang