Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在论坛中逃避输入的正确/最安全的方法是什么?_Php_Javascript_Mysql_Security - Fatal编程技术网

Php 在论坛中逃避输入的正确/最安全的方法是什么?

Php 在论坛中逃避输入的正确/最安全的方法是什么?,php,javascript,mysql,security,Php,Javascript,Mysql,Security,我正在创建一个使用php和mysql后端的论坛软件,我想知道什么是最安全的方法来避免论坛帖子的用户输入 我知道htmlentities()和strip_tags()、htmlspecialchars()和mysql_real_escape_string(),甚至知道javascript的escape(),但我不知道该使用哪个,在哪里 处理这三种不同类型的输入(我指的是获取、保存在数据库中和显示),最安全的方法是什么 一篇文章的标题(这也是URL permalink的基础) 论坛帖子的内容仅限于基

我正在创建一个使用php和mysql后端的论坛软件,我想知道什么是最安全的方法来避免论坛帖子的用户输入

我知道htmlentities()和strip_tags()、htmlspecialchars()和mysql_real_escape_string(),甚至知道javascript的escape(),但我不知道该使用哪个,在哪里

处理这三种不同类型的输入(我指的是获取、保存在数据库中和显示),最安全的方法是什么

  • 一篇文章的标题(这也是URL permalink的基础)
  • 论坛帖子的内容仅限于基本文本输入
  • 允许html的论坛帖子的内容
  • 如果能给我一个答案,告诉我这些转义函数中有多少需要组合使用,以及为什么要组合使用,我将不胜感激。
    谢谢

    mysql\u real\u escape\u string()
    将转义您需要放入mysql数据库中的所有内容。但是您应该使用prepared语句(在mysqli中),因为它们更干净,可以自动进行任何转义


    使用htmlspecialchars()可以从输入中删除HTML,使用urlencode()可以将内容转换为URL的格式。

    生成HTLM输出时(例如,当有人试图编辑帖子时,您将数据输入表单的字段,或者由于用户忘记了一个字段而需要重新显示表单时),可以执行任何其他操作,您可能会使用:它将转义
    ,以及
    &
    ——这取决于您给它的选项

    strip_标签
    将删除用户输入的标签,而您通常不希望用户输入的内容消失;-)
    至少,不适用于“内容”字段:-)


    一旦您获得了用户在表单中输入的内容(即,当表单提交时),您需要在将其发送到DB之前对其进行转义。
    这就是像
    mysqli\u real\u escape\u string
    这样的函数变得有用的地方:它们为SQL转义数据

    您可能还想看看准备好的语句,这可能会对您有所帮助;-)
    -及

    您不应该使用类似于
    addslashes
    :它的转义不依赖于数据库引擎;更好/更安全的方法是使用适合您正在使用的引擎(MySQL、PostGreSQL等)的函数:它将确切地知道转义什么以及如何转义


    最后,要在页面内显示数据,请执行以下操作:

    • 对于不能包含HTML的字段,您应该使用:如果用户确实输入了HTML标记,则这些标记将按原样显示,而不是作为HTML注入
    • 对于可以包含HTML的字段…这有点棘手:您可能只希望允许几个标记,而(可以这样做)实际上并不符合任务的要求(它将允许允许允许的标记的属性)
      • 您可能想看看一个名为的工具:它允许您指定应该允许哪些标记和属性——并且它生成有效的HTML,这总是很好的^^
      • 这可能需要一些时间来计算,并且您可能不想每次都重新生成必须显示的HTML;因此您可以考虑将其存储在数据库中(要么只保留干净的HTML,要么将它和不干净的HTML都保留在两个单独的字段中,这可能有助于允许人们编辑他们的帖子?)

    这些只是几点建议…希望它们能帮助你:-)
    如果你有更精确的问题,不要犹豫!答案是好的


    基本上,使用界面参数化查询比手动转义输入安全得多,也不容易出错。

    我倾向于同时转义页面显示、Javascript和SQL中可能出现问题的所有字符。它使其在web和HTML电子邮件中可读,同时删除代码有任何问题。 vb.NET代码行将是: SafeComment=替换(_ 替换_ 替换_ 替换_ 替换_ HttpUtility.HtmlEncode(Trim(strInput))_ “:”、“:;”、“-”、“-;”、“|”、“|;”、_ “`、“`;”、(“、”(;”、“);”、“);”、_ “%”、“%;”、“^”、“^;”、“、”、“";”、_ “/”、“&”x2F;“*”、“&”x2A;“\”、“&”x5C;”_ “'”、“';”)


    您必须防御两种完全不同的攻击类型:

    • SQL注入:试图操纵数据库的输入。
      mysql\u real\u escape\u string()
      addslashes()
      旨在防止这种情况。前者更好,但参数化查询更好
    • 跨站点脚本(XSS):输入内容,当显示在页面上时,会尝试在访问者的浏览器中执行JavaScript以执行各种操作(例如窃取用户的帐户数据)。
      htmlspecialchars()
      是防止这种情况的明确方法

    允许“一些HTML”同时避免XSS攻击是非常非常困难的。这是因为将JavaScript走私到HTML中的可能性是无穷的。如果您决定这样做,安全的方法是使用BBCode或Markdown,即一组有限的非HTML标记,然后将其转换为HTML,同时使用
    htmlspecialchars删除所有真实的HTML()
    。即使这样,你也必须小心不要在链接中使用
    javascript:
    URL。实际上,只有在允许用户输入HTML的情况下,你才应该这样做。然后你应该花大量时间确保你完全理解HTML、javascript和CSS。

    首先,一般建议:不要逐字转义变量有很多解决方案可以让你使用预先准备好的语句 SafeComment = Replace( _ Replace(Replace(Replace( _ Replace(Replace(Replace( _ Replace(Replace(Replace( _ Replace(Replace(Replace( _ HttpUtility.HtmlEncode(Trim(strInput)), _ ":", ":"), "-", "-"), "|", "|"), _ "`", "`"), "(", "("), ")", ")"), _ "%", "%"), "^", "^"), """", """), _ "/", "/"), "*", "*"), "\", "\"), _ "'", "'")