因为Web安全PHP网站居多 所以找了一个PHP入门的教程 以这里为笔记根据地
纠正第二天的错误
第二天中 我们为了过滤用户输入的特殊字符,创建了一个这样的函数
function filter_str($value){
if(!get_magic_quotes_gpc()){
$value = addcslashes(trim($value));
return $value;
}
return $value;
}
但是昨天在提交的时候却报错了,因为 addcslashes() 函数需要两个参数
前面的参数是需要转义的值或者变量,后面为需要转义的内容,我们这里需要转义 ’ (单引号),所以加一个参数就可以了,这里因为是单引号,所以框起单引号时应当使用双引号
function filter_str($value){
if(!get_magic_quotes_gpc()){
$value = addcslashes(trim($value),"'");
return $value;
}
return $value;
}
使用Session进行用户身份验证
之前我们做好了登录的登录框,现在我们应该实现权限验证
这里使用的是Session进行用户验证,因为Cookie可以被伪造 而Session相对Cookie来说更加安全
session_start();
为开启session验证,通常需要在最前面进行声明
我们将它写在config.php文件的第一行
因为我们的init.php引用了config.php页面 而login.php引用了init.pjp页面 所以login.php相当于引用了config.php页面
我们在登录成功处将Session赋予一个值,这个值是$row变量中的username键的值
随后我们新建一个页面,作为登录之后的页面,在页面的开头判断$_SESSION的参数
我们直接进行登录,因为$_SESSION参数没有’username’,所以会提示我们身份验证失败
等我们登录成功,分配Session之后,再去访问main.php页面
可以看到登录成功之后,就给我们分配了Session值,这个时候我们再去访问main.php页面,就可以回显我们的username了
可以看到我们请求这个页面的时候会有Session值
随后我们再去网站的目录中去搜索我们的SESSID值
可以看到是事实存在的一个文件,我们打开查看一下
里面有一个字符串,所以我们也可以在其他的页面中随时调用这个文件,可以做权限验证,例如username不等于admin的话,就不允许登录后台管理页面
那么Session身份验证差不多就做完了
接下来我们就开始做我们的前端验证,因为我们login.php页面都是PHP的后端验证
例如我们判断提交的参数不能为空,或者限制提交的参数字符长度等等
我们给form表单给一个属性
<form method="post" onsubmit="return false">
onsubmit 如果返回的是 false 则这个表单不会提交,如果返回的是 true 就会提交
那么我们就可以使用Js创建一个函数来判断from的值是否选择提交该表单
<script>
function check(form){
}
</script>
<form method="post" onsubmit="return check(this)">
check(this) 中的this表示false的本身,然后在check函数获取false这个值,这个form随便命名,一般来说和form表单一样的名字
之后我们在JavaScript代码中以对象的方法获取 form 表单中 username 和 password 的值
<script>
function check(form){
var username = form.username.value;
var password = form.password.value;
}
</script>
然后我们进行判断
username.length 取出 username 的长度 如果等于0,那么就为空
alert() 为弹窗提示
form.username.focus() 自动把焦点切换到username的输入框
return false 返回错误,不提交表单数据
如果两个判断都通过的话 这个函数就返回 true
<script>
function check(form){
var username = form.username.value;
if(username.length == 0){
alert("用户名不能为空")
form.username.focus();
return false;
}
var password = form.password.value;
if(password.length == 0){
alert("密码不能为空")
form.password.focus();
return false;
}
return true;
}
</script>
前端的判断写完之后
登录成功还需要跳转
这里使用header()进行跳转
这样我们点击登录如果成功登录的话就跳转到了main.php页面
登录成功之后我们还可以把$conn的句柄关闭掉
<?php
include_once 'init.php';
if($_POST['sub']){
$username = filter_str($_POST['username']);
$password = md5(filter_str($_POST['password']));
$result = $conn->query("select * from users where username='$username' and password='$password'");
if ($result->num_rows > 0) {
$row=$result->fetch_assoc();
if($row['password']==$password){
$_SESSION['username'] = $row['username'];
header('Location:main.php');
$conn->close(); # 关闭句柄
}else{
echo "<script>alert('用户或密码错误')</script>";
}
} else {
echo "<script>alert('用户或密码错误')</script>";
}
}
?>
那么登录的话就基本完成了