【问题标题】:How to secure a form?如何保护表格?
【发布时间】:2011-03-29 13:09:36
【问题描述】:

我正在阅读有关表单安全性的文章,因为我有一个用户可以在其中添加消息的表单。

我读到最好使用strip_tags()htmlspecialchars()nl2br()。据说在其他地方使用html_entity_decode()

我的页面中有这段代码,它接受用户输入

<?php 
    $topicmessage = check_input($_POST['message']); //protect against SQLinjection
    $topicmessage = strip_tags($topicmessage, "<p><a><span>");
    $topicmessage = htmlspecialchars($topicmessage);
    $topicmessage = nl2br($topicmessage);
?>

但是当我回显该消息时,它都在一行上,并且似乎strip_tags 删除了中断,nl2br() 没有放回。

对我来说,这样做是有道理的,因为如果中断已被删除,它如何知道将其放回(或这样做)的位置?

无论如何,我正在寻找一种方法来保护我的表单,以免我被用来尝试破解网站,就像在表单中使用 javascript 一样。

【问题讨论】:

    标签: php htmlspecialchars html-entities strip-tags


    【解决方案1】:

    你有两个选择:

    1. 绝对不允许 HTML。将strip_tags()NO 允许的标签一起使用,或使用htmlspecialchars() 转义其中可能存在的任何标签。

    2. 允许 HTML,但您需要清理 HTML。这是不能使用strip_tags 可以做的事情。使用库(如HTMLPurifier)...

    【讨论】:

      【解决方案2】:

      在打印表单内容之前只需要htmlspecialchars,在发布到SQL之前需要mysql_real_escape(打印之前不需要它),你应该很好。

      按照自己的方式添加标签是非常危险的,您需要具有有限属性的允许标签的简短列表 - 这不是您可以在 1 行中执行的操作。您可能想研究 HTML 规范化器,例如 Tidy。

      【讨论】:

      • 我真的认为使用 mysql_real_escape() 并没有什么坏处。你的说法有什么理由吗?
      • @marekventur 6 年后,但是是的,有一个原因,mysql_real_escape() 实际上并不一定是安全的,因为 sql 语句仍然会被连接。防止sql注入的唯一方法是使用参数化语句。就这样。任何依赖转义值和连接字符串的解决方案总有一天会被破解。
      • @FélixGagnon-Grenier 你现在完全正确。任何使用 2018 年已弃用的 mysql 接口的人都是在自找麻烦。
      【解决方案3】:
      • 使用 HTML Purifier 进行 html 输入并删除您不想要的所有内容 - 除了段落、所有锚点等之外的所有内容。

      无关但重要:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-21
        • 2015-09-26
        • 1970-01-01
        • 2015-04-04
        • 2011-06-10
        相关资源
        最近更新 更多