提示询问密码然后重定向
Prompt asking for password then redirecting
我是 PHP 和 JavaScript 的新手,我被卡住了。到目前为止,我花了整整 7 个小时试图解决这个问题,但我只是不知道该怎么做或如何去做。所以在我的应用程序中,当您尝试向我的 table 添加新行时,我有一个 html 表单来获取数据。当您在表单中输入数据并按提交时,它会提示输入密码,如果输入的密码正确,则会提交表单。它按我想要的方式工作,这就是我所拥有的:
<button onclick="password()" type="button">Create New Hero</button>
<div>
<a id="discl">*-Required Fields</a>
</div>
<script>
function password(){
var password = prompt("Please Enter the Admin Password");
if(password != "shaun"){
alert("Wrong Password");
}
else{
if(validation()){
document.getElementById("form_id").submit();
}
else{
alert("One or more required fields were left empty, or tried to use <script>");
}
}
}
function validation(){
var f = document.getElementById("f_name").value;
var l = document.getElementById("l_name").value;
var d = document.getElementById("dob").value;
var a = document.getElementById("alias").value;
if(f == "" || l == "" || d == "" || f.includes("<script>") || l.includes("<script>") || a.includes("<script>")){
return false;
}
else{
return true;
}
}
</script>
现在我的 table 也有一个编辑和删除。我的问题是,对于编辑和删除,它们位于带有 href 的标签中,而不是按钮。这是他们在不要求密码的情况下工作时最初的样子:
echo "<a href='./edit.php?id={$row['id']}'>edit</a>";
因此,根据 table 的哪一行,您点击编辑或删除的位置,根据数据库中行的 ID,它会编辑或删除 table。现在我的问题是我不知道如何正确设置该功能,因此它要求输入密码并重定向到右侧 url。这就是我现在拥有的:
foreach($results as $row){
echo "<tr>";
echo "<td>{$row['first_name']}</td>";
echo "<td>{$row['last_name']}</td>";
echo "<td>{$row['date_of_birth']}</td>";
echo "<td>{$row['alias']}</td>";
echo "<td>{$row['active']}</td>";
echo "<td>{$row['hero']}</td>";
echo "<td>";
echo "<a href='./edit.php?id={$row['id']}'>edit</a>";
echo " | ";
echo "<a href='javascript: password()'>delete</a>";
echo "</td>";
echo "</tr>";
}
?>
<script type="text/javascript">
function password(){
var password = prompt("Please Enter the Admin Password");
if(password != "shaun"){
alert("Wrong Password");
}
else{
window.location.replace("./delete.php?id=<?php echo $row['id']; ?>");
}
}
</script>
这个问题是无论我在 table 上点击哪个删除,它总是删除最后一个,因为它在 url 之后删除的 ID 是最后一个可用的我的数据库中的 ID。我不确定我是否只是遗漏了一些小东西,或者我完全走错了路,但任何帮助将不胜感激,因为我很迷茫。谢谢
不会在这里评论任何安全问题,只是逻辑。您需要在 PHP 循环期间将 $row['id']
传递给您之后要使用的 JS password()
函数:
<?php
foreach ($results as $row) {
echo "<tr>";
echo "<td>{$row['first_name']}</td>";
echo "<td>{$row['last_name']}</td>";
echo "<td>{$row['date_of_birth']}</td>";
echo "<td>{$row['alias']}</td>";
echo "<td>{$row['active']}</td>";
echo "<td>{$row['hero']}</td>";
echo "<td>";
echo "<a href='./edit.php?id={$row['id']}'>edit</a>";
echo " | ";
echo "<a href='javascript: password(".$row['id'].")'>delete</a>";
echo "</td>";
echo "</tr>";
}
?>
<script type="text/javascript">
function password(delId) {
var password = prompt("Please Enter the Admin Password");
if (password != "shaun") {
alert("Wrong Password");
} else {
window.location.replace("./delete.php?id="+delId);
}
}
</script>
忽略明显的安全问题,我建议这样做
<a href='#' class='edit' data-id='<?= $row['id'] ?>'>edit</a> |
<a href='#' class='delete' data-id='<?= $row['id'] ?>'>delete</a>
使用
window.addEventListerner('load',function() {
document.querySelector('table').addEventListerner('click',function(e) {
e.preventdefault(); // stop the link
const tgt = e.target, id = tgt.getAttribute("id");
if (tgt.classList.contains("edit") {
location = '/edit.php?id='+encodeURIComponent(id);
}
else if (tgt.classList.contains("delete") {
let password = prompt("Please Enter the Admin Password");
if (password === "shaun") {
location.replace('/delete.php?id='+encodeURIComponent(id)=;
}
else {
alert("Wrong Password");
}
}
})
})
这是目标请求,而不是需要身份验证的调用页面,否则任何人都可以调用 ./delete.php?...
url 并删除数据库中的一行。
这通常是通过维护一个会话来完成的,该会话会记住用户的登录。然后 delete.php
请求可以检查用户是否已经登录/是否具有管理员权限,或者在必要时要求输入密码。
我是 PHP 和 JavaScript 的新手,我被卡住了。到目前为止,我花了整整 7 个小时试图解决这个问题,但我只是不知道该怎么做或如何去做。所以在我的应用程序中,当您尝试向我的 table 添加新行时,我有一个 html 表单来获取数据。当您在表单中输入数据并按提交时,它会提示输入密码,如果输入的密码正确,则会提交表单。它按我想要的方式工作,这就是我所拥有的:
<button onclick="password()" type="button">Create New Hero</button>
<div>
<a id="discl">*-Required Fields</a>
</div>
<script>
function password(){
var password = prompt("Please Enter the Admin Password");
if(password != "shaun"){
alert("Wrong Password");
}
else{
if(validation()){
document.getElementById("form_id").submit();
}
else{
alert("One or more required fields were left empty, or tried to use <script>");
}
}
}
function validation(){
var f = document.getElementById("f_name").value;
var l = document.getElementById("l_name").value;
var d = document.getElementById("dob").value;
var a = document.getElementById("alias").value;
if(f == "" || l == "" || d == "" || f.includes("<script>") || l.includes("<script>") || a.includes("<script>")){
return false;
}
else{
return true;
}
}
</script>
现在我的 table 也有一个编辑和删除。我的问题是,对于编辑和删除,它们位于带有 href 的标签中,而不是按钮。这是他们在不要求密码的情况下工作时最初的样子:
echo "<a href='./edit.php?id={$row['id']}'>edit</a>";
因此,根据 table 的哪一行,您点击编辑或删除的位置,根据数据库中行的 ID,它会编辑或删除 table。现在我的问题是我不知道如何正确设置该功能,因此它要求输入密码并重定向到右侧 url。这就是我现在拥有的:
foreach($results as $row){
echo "<tr>";
echo "<td>{$row['first_name']}</td>";
echo "<td>{$row['last_name']}</td>";
echo "<td>{$row['date_of_birth']}</td>";
echo "<td>{$row['alias']}</td>";
echo "<td>{$row['active']}</td>";
echo "<td>{$row['hero']}</td>";
echo "<td>";
echo "<a href='./edit.php?id={$row['id']}'>edit</a>";
echo " | ";
echo "<a href='javascript: password()'>delete</a>";
echo "</td>";
echo "</tr>";
}
?>
<script type="text/javascript">
function password(){
var password = prompt("Please Enter the Admin Password");
if(password != "shaun"){
alert("Wrong Password");
}
else{
window.location.replace("./delete.php?id=<?php echo $row['id']; ?>");
}
}
</script>
这个问题是无论我在 table 上点击哪个删除,它总是删除最后一个,因为它在 url 之后删除的 ID 是最后一个可用的我的数据库中的 ID。我不确定我是否只是遗漏了一些小东西,或者我完全走错了路,但任何帮助将不胜感激,因为我很迷茫。谢谢
不会在这里评论任何安全问题,只是逻辑。您需要在 PHP 循环期间将 $row['id']
传递给您之后要使用的 JS password()
函数:
<?php
foreach ($results as $row) {
echo "<tr>";
echo "<td>{$row['first_name']}</td>";
echo "<td>{$row['last_name']}</td>";
echo "<td>{$row['date_of_birth']}</td>";
echo "<td>{$row['alias']}</td>";
echo "<td>{$row['active']}</td>";
echo "<td>{$row['hero']}</td>";
echo "<td>";
echo "<a href='./edit.php?id={$row['id']}'>edit</a>";
echo " | ";
echo "<a href='javascript: password(".$row['id'].")'>delete</a>";
echo "</td>";
echo "</tr>";
}
?>
<script type="text/javascript">
function password(delId) {
var password = prompt("Please Enter the Admin Password");
if (password != "shaun") {
alert("Wrong Password");
} else {
window.location.replace("./delete.php?id="+delId);
}
}
</script>
忽略明显的安全问题,我建议这样做
<a href='#' class='edit' data-id='<?= $row['id'] ?>'>edit</a> |
<a href='#' class='delete' data-id='<?= $row['id'] ?>'>delete</a>
使用
window.addEventListerner('load',function() {
document.querySelector('table').addEventListerner('click',function(e) {
e.preventdefault(); // stop the link
const tgt = e.target, id = tgt.getAttribute("id");
if (tgt.classList.contains("edit") {
location = '/edit.php?id='+encodeURIComponent(id);
}
else if (tgt.classList.contains("delete") {
let password = prompt("Please Enter the Admin Password");
if (password === "shaun") {
location.replace('/delete.php?id='+encodeURIComponent(id)=;
}
else {
alert("Wrong Password");
}
}
})
})
这是目标请求,而不是需要身份验证的调用页面,否则任何人都可以调用 ./delete.php?...
url 并删除数据库中的一行。
这通常是通过维护一个会话来完成的,该会话会记住用户的登录。然后 delete.php
请求可以检查用户是否已经登录/是否具有管理员权限,或者在必要时要求输入密码。