我主要是桌面编程背景。在我的业余时间,我涉足网络开发,从问题到解决方案的页面错误取得了一些成功。我已经达到了这一点,我需要允许站点登录并从用户社区收集一些数据(无论如何都是计划)。
所以,我意识到整个世界都有邪恶的用户,他们急切地等待一个不安全的网站来装饰,破坏和妥协。如果我真的很幸运,其中一些用户可能会进入我的网站。我想为他们做好充分的准备。
我有一个用于从登录用户收集信息的UI,其中一些信息会呈现为HTML页面。我的网站在后端用PHP / MySQL实现,前面有一些javascript的东西。我对如何处理以下任何问题的任何建议/建议感兴趣:
跨站点脚本:我希望这对我来说相当简单,因为我不支持标记向下输入,只是纯文本。我应该只是扫描[A-Za-z] *并扔掉其他所有东西吗?我对这里可以使用的攻击类型一无所知,所以我很乐意听取你的建议。
SQL注入:我在这里使用参数化查询(mysqli),所以我希望我能在这个部门工作。我是否应该对用户输入的数据进行额外验证以保护自己?
Trollish行为:我支持用户在Google地图上绘制的折线,所以(再次,如果我有幸得到一些流量)我希望看到一些手绘的阴茎在西欧潦草绘制。我打算实施一些用户驱动的审核(标记inaproriate SO样式),但我会对阻止这种行为的任何其他建议感兴趣。
登录:我的current login system是一个非常简单的网络表单,PHP中的MySQL查询,mp5编码的密码验证和存储的会话cookie。我希望系统足够简单,以确保安全,但我想知道他们是否是我在这里的漏洞我不知道?
我希望我在这里不太啰嗦,期待听到您的意见。
答案 0 :(得分:2)
您的第一个问题是您关注的是UI。一个简单的规则是,您永远不应该假设提交的数据来自您创建的UI。不要相信进入的数据,并清理出去的数据。使用PHP的strip_tags和/或htmlentities。
某些字符(<,>,“,”)可以搞砸你的HTML并允许注入,但应该被允许。特别是在密码中。使用htmlentities允许使用这些字符。只要想想会发生什么如果输出某些字符而没有“转义”。
基于Javascript的检查和验证仅应用于改善用户体验(即阻止页面重新加载)。除非作为绝对的最后手段,否则不要使用eval。
答案 1 :(得分:1)
对抗XSS htmlspecialchars已经足够了,用它来清除输出。 SQL注入:如果mysql在添加参数之前解析您的查询,则不能注入任何恶意内容。
答案 2 :(得分:1)
除了只允许[A-Za-z] *进入你的页面之外,我会研究其他的东西。仅仅因为你现在无意允许任何格式化标记并不意味着你不需要它就行了。就个人而言,我讨厌重写我没有设计的东西来适应未来的需求。
您可能希望将已接受标记的白名单放在一起,并根据需要添加/删除,或者查看对提交为纯文本的任何标记进行编码。
答案 3 :(得分:1)
跨站点脚本可以很容易地处理htmlentities,还有一个名为strip标签的功能可以从帖子中删除标签,你会注意到这允许你将某些标签列入白名单。如果您决定在将来允许使用特定标记,请记住,这些标记上的属性不会以任何方式清除,这可用于在页面中插入javascript(onClick等),并不是真正推荐的。如果您希望将来有格式化,我建议您实施一种格式化语言(如[b]粗体或类似的东西),以阻止用户直接在页面中输入HTML。
SQL注入也很容易处理,因为您可以准备语句,然后将用户数据作为参数传递给预准备语句。这将阻止任何用户输入修改sql语句。
CSRF(跨站请求伪造)是一个经常被忽视的漏洞,允许攻击者使用该表单从受害者帐户提交数据。这通常是通过为img src指定表单获取字符串来完成的(为受害者加载图像,获取加载和表单,但用户不知道)。此外,如果您使用帖子,攻击者可以使用javascript自动提交隐藏的表单来执行与上面相同的操作。要解决这个问题,您需要为每个表单生成一个键,在会话中保留一个键,在表单上保留一个键(作为隐藏输入)。提交表单时,您将输入中的密钥与会话中的密钥进行比较,只有匹配时才会继续。
某些安全公司还建议您在登录表单上使用“autocomplete =”off“'属性,以便不保存密码。