PHP / MYSQL安全问题在线订购表,管理门户

问题描述

|| 我正在编写一个由PHP和MySQL(将在WAMP服务器上运行)驱动的动态站点。我当前的担忧是关于网站的安全性,我有几个问题。昨天我对此有个疑问,得到了很多帮助!到目前为止,非常感谢大家!但是,由于某种原因,SO阻止了我编辑该帖子,因此我不得不重新制作一个... 1)我正在为该网站编写一个管理门户,以便它的所有者可以在网站上(通过使用HTTPS的登录HTML页面)以一种简单,用户友好的方式操作MySQL数据库。门户中的每个页面也将使用HTTPS。我在这里对安全性的关注是登录过程,该过程由登录页面和PHP登录脚本组成,然后在登录后在实际门户网站内的页面上对会话进行身份验证。首先,收集用户登录信息:
<form method=\"post\" action=\"admin/login.php\">
<table align=\"center\">
<tr><th>Admin Login Form</th></tr>
<tr><td>Name</td><td><input type=\"text\" name=\"Name\" size=\"30\" onKeyPress=\"return aJSFunctionToStopEnterKeyFromWorking(event)\"></td></tr>
<tr><td>Password</td><td><input type=\"password\" name=\"Password\" size=\"30\" onKeyPress=\"return aJSFunctionToStopEnterKeyFromWorking(event)\"></td></tr>
<tr><td></td><td><input type=\"reset\" value=\"Clear Form\"> <input type=\"submit\" value=\"Login\"></td></tr>
</table>
</form>
二,实际的登录脚本:
<?php
$inputusername = $_POST[\'Name\'];
$inputpassword = $_POST[\'Password\'];

$username = \"a username that is not obvious\";
$password = \"a password that is at least 10 characters long\";

if($username == $inputusername && $password == $inputpassword) {
    session_start();
    $_SESSION[\'valid\'] = TRUE;
    $_SESSION[\'IP\'] = $_SERVER[\"REMOTE_ADDR\"];
    $_SESSION[\'agent\'] = $_SERVER[\'HTTP_USER_AGENT\'];
    header(\'Location: portal.php\');
    exit;
}
else {echo  \"<center>Invalid username or password<br><a href=\'../admin.html\'>Try Again</a></center>\"; exit;}
?>
然后,在登录过程之后,门户的每个页面将在文件的开头包含以下脚本:
<?php
session_start();
if(!$_SESSION[\'valid\']) {header(\'Location: ../admin.html\'); exit;}
if($_SESSION[\'IP\'] != $_SERVER[\"REMOTE_ADDR\"]) {header(\'Location: ../admin.html\'); exit;}
if($_SESSION[\'agent\'] != $_SERVER[\'HTTP_USER_AGENT\']) {header(\'Location: ../admin.html\'); exit;}
?>
因此,每个门户页面将如下所示:
<?php include(\'session-authentication-script.php\'); ?>
*Actual page goes here*
我还制作了注销脚本:
<?php
include(\'session-authentication-script.php\');
$_SESSION[\'valid\'] = FALSE;
session_destroy();
header(\'Location: ../admin.html\');
exit;
?>
那么,现在所有这些看起来相对安全吗?还是我的安全性仍有漏洞? 2)有人提到我仍然容易受到XSS的影响,但是我不知道如何。有人可以向我解释这是什么意思:   就像echo \“ Requested article:\”。$ _ GET [\'id \'] \'这样的东西已经很容易受到攻击。 我尝试使用谷歌搜索技术来弄清楚这是什么意思,但找不到任何与安全性相关的信息。如果有人可以向我解释,我将不胜感激!发表评论的用户在没有任何实际上下文的情况下做到了这一点,所以我什至都不十分确定它适用于什么(我的最后一个线程也涵盖了SQL注入攻击...如果您想要更多的上下文,请访问旧线程的链接:动态网站安全问题(PHP + MySQL))。 3)我也有一些脚本将通过用户输入的HTML表单通过电子邮件发送敏感数据(信用卡号)。如何确保该数据受到适当保护?表单和脚本都将设置为使用HTTPS。基本上,这是一个简短的示例:
<form name=\"Order\" method=\"post\" action=\"incl/email_Order.php\">
<table>
<tr><td>Name</td><td><input type=\"text\" name=\"Name\" size=\"30\" onKeyPress=\"return aJSFunctionToStopEnterKeyFromWorking(event)\" ></td></tr>

*gather up a bunch more form data in the same fashion*

<tr><td></td><td><input type=\"reset\" value=\"Clear Form\"> <input type=\"submit\" value=\"Submit Order\" ></td></tr></table>
然后,这是电子邮件脚本:
$to = \"sales@company.com\";
$subject = \"Online Order\";
$message = \"Name: \" . $_REQUEST[\'Name\'] . \"\\r\\n\" .

*and here is a bunch of other stuff being concatenated to $message in the same fashion*

$headers = \'From: sales@company.com\' . \"\\r\\n\" .
       \'Reply-To: \' . $_REQUEST[\'Email\'] . \"\\r\\n\";

if(mail($to,$subject,$message,$headers)) {print \"Thank you for your order!\";}
else {print \"We encountered an error sending your order. Please attempt again.\";}
exit;
那么HTTPS是否足以确保此安全?这里是否有缺陷使它敞开? 4)我应该了解/考虑的其他安全问题吗? 我真的很感谢我为此提供的任何帮助!     

解决方法

2)
echo \"Requested article: \".$_GET[\'id\'];
如果有人提供该怎么办
\'<script src=\"bad_script_from_bad_server.js\"></script>\'
作为ID? 您需要先验证$ _GET [\'id \'],然后再使用它。 一种方法是使用filter_input() 假设id为整数:
echo \"Requested article: \".filter_input ( INPUT_GET,\'id\',FILTER_VALIDATE_INT);
    ,登录-在您的示例中,您未对数据库进行任何身份验证,而是在比较变量的两个值。没有一种机制可以阻止任何人创建一个试图强行登录脚本的脚本,这意味着反复输入值,直到找到合适的脚本为止。 通常,人们允许从单个IP地址进行一定数量的登录,以阻止脚本小子试图强行强制管理员登录。 是的,如果您回显\“具有ID的商品\”。 $ _GET [\'id \']。\“未找到\”-阻止攻击者将JS从其站点注入到您的计算机并以某种方式获得对该网站的控制权。这是推测性的,但是可能有人登录到您的网站(例如,您),并且如果攻击者向您提供了诸如““ /admin.php?id = \”之类的链接-您将要加载HIS javascript ,这意味着他可以在您的会话中进行恶意操作-例如劫持您的会话,并获得实际的管理访问权限,以便他可以删除您的数据。 这是可能发生的“灾难性”事件之一,但它们曾经发生过,并且今天正在发生-如果可以避免的话,请这样做。始终清除输入-粘贴intval($ _ GET [\'id \'])不会造成伤害,并使您收到的变量具有正确的类型。 通过电子邮件发送信用卡详细信息-这不是一个大问题。处理信用卡等高度机密信息必须采用不同的方式-通常,如果您与第三方软件(某种付款网关)进行交互,则在交换数据之前首先要建立加密连接。同样,通过电子邮件发送信用卡信息意味着在目标计算机上具有足够特权的人可以阅读该电子邮件。您不能保证目标人员(或服务)阅读该电子邮件,如果您以这种方式使用电子邮件,则不能保证其他人。 另一方面,除了通过借记或贷记帐户进行的某种服务外,没有人应该知道某人的信用卡详细信息,这意味着除信用卡所有者之外,没有人可以访问这些详细信息。所有的支付网关都以这种方式工作。另外,如果您尝试存储信用卡信息以进行重复计费或类似操作-我想您知道用户首先必须同意这一点,并且必须对要保存的数据进行加密。 关于在线应用程序的安全性,有很多事情,特别是用PHP创建的应用程序。您的网站是否采用共享托管计划?如果是,则将会话存储在哪里?它们存储在/ tmp文件夹中吗?如果是,则意味着您可以创建一个脚本,该脚本读取/ tmp中保存的所有文件并基本上获取其他网站的数据。同样,您可以修改现有会话,从而使您的安全计划无法在条款1)中记录用户。这只是我想起的一件事,想象一下一个果断的饼干如果他/她想把您的网站拆下来怎么办。     ,HTTPS(尝试)保证三件事: 您的用户访问的站点是您真正的站点,并且可靠的第三方(证书颁发者)信任您(即没有网络钓鱼) 在离开客户端和进入安全服务器之间,数据是安全的 离开客户端的数据与到达服务器的数据相同。 您还必须自行设置。例如,代码中的密码仅与服务器一样安全。如果有人可以看到该源代码,他们将拥有密码。 更安全的选择可能是... 数据库中的密码,因此可以轻松更改;保护数据库,设置约束,因此密码必须足够复杂。 检查用户不太可能是机器人(验证码) 检查是否快速重复尝试从一台计算机登录,这可能是蛮力攻击的迹象 如果所有站点用户的密码都相同(这就是您的代码所执行的操作),请确保您的用户意识到了风险。个人登录更安全。 如果您确实使用了密码数据库,请防止它受到SQL注入(http://xkcd.com/327/)     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...