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