2012-05-22 71 views
2

目前我使用这个策略:

提交使用发送HTML格式或数据后jQuery的$.get()$.post()我需要知道什么来,然后在应用逻辑的基础。

想,我有$_POST['username'],$_POST['password']$_POST['login_submit_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. 
} 

我知道这一切的逻辑是错误的或有严重的问题,所以我想一个更安全和完美的解决方案,而不是这个。我欢迎在我的策略中找出漏洞和严重的安全漏洞。如果答案更具说明性,这个问题也可以帮助其他人,这可以是信息丰富的社区维基。

+0

检查'的strlen($ _ POST [ '用户名'])> 0'是更有效,因为你不会有检查是否存在价值或不再是。 – Pieter888

+0

或尝试'&&(!empty($ _ POST ['username']))&& ...' – Neograph734

+0

与!empty($ _ POST ['username'])一样。如果没有设置$ _POST ['username'],将会发出通知(对于emtpy和strln函数,但是我猜你不会在你的项目在线时显示通知错误) – Mohammer

回答

3

有没有办法使通用超级“安全”功能。

mysql_real_escape_string

你不应该在所有使用。它使用旧的mysql API,并假定你将手动将字符串砸成一起来制作SQL。不要这样做。使用PDO或mysqli和一个处理准备查询和绑定参数的函数。

stripslashes

这是一种解药魔术引号。如果没有魔术引号,它会破坏数据。不要使用它。改为关闭魔术引号。

trim

这破坏数据。除非你真的想在字符串的开始和结尾删除空格,否则不要使用它。


将数据插入到该语言之前立即目标语言逃亡数据。

对于SQL,use bound arguments and prepared queries

对于HTML,请使用htmlspecialchars或使用模板语言(例如小胡子)进行转义。

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

对于JSON,使用encode_json

+0

+1彻底解答。 –

+0

@JasonMcCreary - 好。谢谢。 – Quentin

+0

非常轻巧,智能涵盖了我想知道的一切!我想成为使用PDO,而不是老的过时的mysql_ *函数,一个好的和彻底解释的PDO教程可能会有所帮助。谢谢你的回答。 – Vishal

1
  • 你只需要,如果你有magic_quotes的启用(使用get_magic_quotes_gpc检查)来的stripslashes
  • 你应该白名单过滤您的POST变量使用filter_varctype_*preg_match(以及检查的约束条件,如长度和存在)
  • 使用预处理语句/ PDO为您查询,以确保适当逃逸
  • 逃生任何HTML输出与htmlentities

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

+0

嗯,我默认关闭了magic_quotes,但是我没有使用'stripslashes'。你的第2点值得注意,我会更详细地研究你的建议以过滤POST变量。谢谢。 – Vishal