Php 正在处理$\u POST[]和$\u GET[]变量

Php 正在处理$\u POST[]和$\u GET[]变量,php,mysql,security,Php,Mysql,Security,目前我使用的策略是: 提交HTML表单或使用jQuery的$.get()或$.post()发送的数据后,我需要知道结果,然后在此基础上应用逻辑 假设我有$\u POST['username']、$\u POST['password']和$\u POST['login\u submit\u button']。 在我的处理脚本文件中,我如下所示: if(isset($_POST['login_submit_button']) && isset($_POST['username'])

目前我使用的策略是:

提交HTML表单或使用jQuery的
$.get()
$.post()
发送的数据后,我需要知道结果,然后在此基础上应用逻辑

假设我有
$\u POST['username']、
$\u POST['password']
$\u POST['login\u submit\u button']
。 在我的处理脚本文件中,我如下所示:

if(isset($_POST['login_submit_button']) && isset($_POST['username']) && $_POST['username'] != "" && isset($_POST['password']) && $_POST['password'] != "") {
  // calling a common function safe_vars() which does
  // mysql_real_escape_string(stripslashes(trim($any_variable_need_to_become_safe)))
  // and now using the above variables for different purposes like
  // calculation, insertion/updating old values in database etc.
}
我知道所有这些逻辑都是错误的,或者有严重的问题,所以我想要一个非常安全和完美的解决方案,而不是这个。我欢迎在我的策略中找出漏洞和严重的安全漏洞。这个问题也可以帮助其他人,如果答案更具解释性,这可以是信息丰富的社区wiki。

  • 如果启用了magic_quotes(用于检查),则只需要删除斜杠
  • 您应该使用or或(以及检查绑定条件,如长度和存在性)对POST变量进行白名单筛选
  • 对查询使用准备好的语句/以确保正确转义
  • 使用
没有什么是防弹的,但是以上是避免SQL注入/XSS的良好实践。

  • 如果启用了magic_quotes(用于检查),则只需要删除斜杠
  • 您应该使用or或(以及检查绑定条件,如长度和存在性)对POST变量进行白名单筛选
  • 对查询使用准备好的语句/以确保正确转义
  • 使用

没有什么是防弹的,但是上面这些都是避免SQL注入/XSS的良好实践。

没有办法生成通用的超级“确保安全”函数

mysql\u real\u escape\u string

你根本不应该用这个。它使用旧的mysql API,并假设您将手动将字符串粉碎在一起以生成SQL。不要那样做。使用PDO或mysqli以及处理准备好的查询和绑定参数的函数

stripsalashes

这是一种神奇引语的解药。如果没有魔法引号,它将破坏数据。不要用它。禁用“魔法引号”

trim

这会破坏数据。除非确实要删除字符串开头和结尾的空白,否则不要使用它


在将数据插入目标语言之前立即转义该语言的数据

对于SQL

对于HTML,请使用
htmlspecialchars
或为您进行转义的模板语言,如Mustach

或者,(如果您希望允许HTML)解析它,生成DOM,使用白名单过滤它,然后将其序列化回HTML

对于JSON,使用
encode\u JSON


等等。

没有办法实现通用的超级“确保安全”功能

mysql\u real\u escape\u string

你根本不应该用这个。它使用旧的mysql API,并假设您将手动将字符串粉碎在一起以生成SQL。不要那样做。使用PDO或mysqli以及处理准备好的查询和绑定参数的函数

stripsalashes

这是一种神奇引语的解药。如果没有魔法引号,它将破坏数据。不要用它。禁用“魔法引号”

trim

这会破坏数据。除非确实要删除字符串开头和结尾的空白,否则不要使用它


在将数据插入目标语言之前立即转义该语言的数据

对于SQL

对于HTML,请使用
htmlspecialchars
或为您进行转义的模板语言,如Mustach

或者,(如果您希望允许HTML)解析它,生成DOM,使用白名单过滤它,然后将其序列化回HTML

对于JSON,使用
encode\u JSON


等等。

检查strlen($\u POST['username'])>0效率更高,因为您不必再检查该值是否存在。或者尝试
&(!empty($\u POST['username'])&&……
与此相同!空($\u POST['username'])。如果未设置$_POST['username'](对于emtpy和strln函数都是如此。但我想当项目联机时,您不会显示通知错误)@Pieter888:Yep,这似乎比我用空白字符串检查它的方式好。@Neograph734,@Mohammer:Hmm,实际上很多时候,
isset()
并没有像我预期的那样工作。我会试试你的建议。谢谢。检查strlen($\u POST['username'])>0效率更高,因为您不必再检查该值是否存在。或者尝试
&(!empty($\u POST['username'])&&&……
与此相同!空($\u POST['username'])。如果未设置$_POST['username'](对于emtpy和strln函数都是如此。但我想当项目联机时,您不会显示通知错误)@Pieter888:Yep,这似乎比我用空白字符串检查它的方式好。@Neograph734,@Mohammer:Hmm,实际上很多时候,
isset()
并没有像我预期的那样工作。我会试试你的建议。谢谢你。@JasonMcCreary-接得好。谢谢。非常轻巧,聪明地涵盖了我想知道的一切!我想使用PDO来代替陈旧过时的mysql_*函数,一个好的、详细解释过的PDO教程可能会有所帮助。谢谢你的回答。@Quentin:但我很好奇,你提到的所有建议都足够值得关注,或者还有更多?当你开始考虑旧IE中的UTF-7错误,或者如果你使用
而不是
来分隔属性值,或者如果您在文档中插入URL而未检查它是否是可接受的URL(而不是
javascript:
URL)。我没有提到的语言需要用适合该语言的东西来逃避。@JasonMcCreary-好