注册,登录,会话和张贴安全措施(Registration, login, session and p

2019-10-21 11:20发布

这将是我第一次问一个问题,任何人对于网络的发展。 为什么我决定要问这个问题,被别人问过尽管有许多类似的问题,究其原因是因为,在过去接受别人的答案排在大量和主观性,所以我变得迷茫和怀疑为如何处理它。

我意识到有不同的方式来处理这一点,这就是为什么我的问题可能会引起一些讨论,但我想每个人都记得我的问题的细节,应该任何讨论就出来了:那我不要求什么是最安全的做法,但我的做法是否安全可言,或没有; 我的目标流行的论坛,没有大公司的网站,如亚马逊或贝宝,金钱交易发生的安全级别。

我用的是什么:

  • PHP 5.5 password_hash
  • PDO W /预处理语句

注册

所有输入进行清洁如下:

  • 修剪
  • 的stripslashes
  • 用htmlspecialchars

他们必须通过的preg_match。

用户必须选择一个帐户名和昵称。 帐户名称使用登录,而昵称使用与他人在论坛上进行交流。 这两个名字不能与彼此相同,也不能已经存在于数据库中。

用户被要求随机问题,以检查是否是人为因素还是不行。

登录

所有输入进行清洁如下:

  • 修剪
  • 的stripslashes
  • 用htmlspecialchars

他们必须通过的preg_match。

一个IP地址只能尝试登录每分钟一次,总共每小时3次,然后用户将不得不等待24小时才能再次尝试登录。

如果没有找到帐户名或密码错误,他们接受,要么可能是错的同样的信息。

成功登录后调用一个函数,它创建一个随机的32个字符长的字符串,使用字符之间不等“0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ $ -_。”。 该函数将循环这个字符串通过在数据库中的所有用户行,直到不能再找到相同的字符串,然后把这个字符串,并将其放置在该帐户的名字(SID1下),同样的函数被再次调用之前,另一32字符长的串(下SID2)放置。

每当用户登录时,一组新的字符串的制成。

SESSION

不使用$ _SESSION(在session_start)。 $ _COOKIE是(对于 “记住我”)。 所以,我很抱歉,如果我使用了错误的术语参照它作为一个会话或作为SID。

放置在数据库中,这两个32个字符长的字符串进行合并,并以相同的名称放在一个cookie。 这64个字符的长字符串是从此识别用户的唯一标准。 每当用户需要权限做一些事情,如查看特定的论坛,或编辑自己的帐户设置,这两个32个字符长的唯一ID(爆炸)用于调用数据库,并返回用户的排名。 换句话说,用户ID和帐户名从不用来调用用户的cookie是与数据库中,只有唯一的ID。 之前,这些字符串用来标识用户,但是,它必须经过的preg_match,以防万一有从cookie与输入篡改的任何不可预见的方式(我不知道是否有或没有,这是为什么我决定采取预防措施)。

设置cookie在4周内摧毁,除非用户没有设置“记住我”在登录时。

每当用户注销时,cookie将被通过将其设置为-1年销毁。

POSTING

允许用户上传他们想要的任何UTF-8字符,而这一次输入只有通过ヶ辆它存储在数据库之前。 通过脚本似乎并没有这样的工作方式。 他们可以写<script>alert('hello');<script>它就会出现这样的职位,但该脚本将无法运行。 但是,如果我试图清理,而不是输入输出,将运行该脚本。 虽然,我可能不知道所有通过脚本的方式。 所以,开导我,如果你能想到的任何,也许我就必须找出艰辛的道路。

我做了它,这样如果用户在他们的帖子写的URL网址被自动放入“A HREF”。 同样,图像被放入“IMG”,和YouTube视频放入“IFRAME”。 下一步是只允许一个图像,每个岗位一个YouTube视频,但我想我将不得不找出缓存是如何工作的,因为我的网站的响应时间为0.25秒钟一旦信息中包含外部图像去3秒/视频。 我可能要检查外部图像是否真的图像或不以避免恶意代码隐藏在图像中,但我还没有确定如何工作的; 也许是最好的办法,找出URL是否是一个图像或不就是检查它是否是一个图像,所以我可能会不得不重写它的全部。

除了SSL,我不太确定我可以做,以确保我的网站还有什么,或者我的登录/注册/会话/张贴的做法是否以任何方式不够好。

请让我知道如果我错过了一些东西。

Answer 1:

我不接受你采取的保安措施十分之一的一半,但我拿一个你不提。 你似乎不使用SSL,所以你的ID /密码,经过管可读取状态在登录时。 这意味着他们可以听了(不知道我怎么能不自己做,但它们实际上可以)。

小易招我用对抗:
-我的登录表单由PHP脚本,它设置一个JavaScript变量(构建var salt )为随机值(可以说SHA1(当前时间戳的))
-这个值是通过一个会话变量存储服务器端(或者在您的配置一个cookie) -当用户提交登录表单,javascript函数(可以说crypt_pw()被调用
-此crypt_pw()函数执行级联到先前描述的密码(1)的SHA1的SHA1 salt实际上submiting之前
- 服务器收到此SHA1(SHA1(密码)+盐),并将其与SHA1((分贝存储的密码).salt)进行比较。
(1)存储在DB密码已散列,使得它不是直接可读的。
就像是:

$query="select count(*) from user_table where login='$login'
and sha1(concat(password,'salt'))='$jsCryptedBeforeSendPassword'"

整个事情更容易比解释做的,它确保了没有人可以做任何“嗅”密码什么:从任何其他计算机发送,会话变量将不存在服务器端,让比较密码。 即使是从很同一台计算机上非常相同的客户端,但在不同的时间,登录表单将PHP与另一种盐的值,因此嗅探加密的密码不能被重新使用构成。

顺便说一句,我现在不能检查代码,也许我盐 - & - 散列值登录过,不仅密码之一。 如果你是HTTPS连接,当然这一切都是无用的。



文章来源: Registration, login, session and posting security measures