Php 正在处理$\u POST[]和$\u GET[]变量
目前我使用的策略是: 提交HTML表单或使用jQuery的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'])
$.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变量进行白名单筛选
- 对查询使用准备好的语句/以确保正确转义
- 使用
- 如果启用了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-好