【发布时间】:2014-05-13 21:07:02
【问题描述】:
我刚刚有了“preSecure”来自 $_post 和 $_get 的所有用户输入数据的想法。但我想知道这是否是一种好的做法,并希望对此有所了解。这是我想出的:
function clean_str($str){
return preg_replace('#[^a-z_ 0-9@.-]#i', '', $str);
}
if ($_POST){
foreach ($_POST AS $key => $val){
$_POST[$key] = clean_str($val);
}
}
if ($_GET){
foreach ($_GET AS $key => $val){
$_GET[$key] = clean_str($val);
}
}
这个 sn-p 将简单地在每个 http 请求的开头运行。可以开发 clean_str 函数以允许其他字符和替换字符等(这只是一个示例)。但我认为第一个目标是简单地防止 sql 注入。我现在用这种方法看到的唯一不好的事情是你的“插件”是否需要从用户输入发送 sql 命令。上面的方法当然可以包装在一个函数中,并在需要时被调用。 Post 和 Get 是全局变量,所以这不是问题。
我实际上正在编写我自己的框架(还有很多工作),如果我能够完成它,我将发布它。问题是我经常看到新手开发人员在数据库查询中添加 $_POST['userinput'] 。上面的代码应该可以做到这一点。嗯,这就是我所做的一些背景以及我提出这个问题的原因。
我很高兴听到您的想法。对于 Stack Overflow 来说,这可能不是最好的问题,我想我想就这种方法展开更多讨论,以分享想法和意见。但是,要对此提出我的问题,它应该符合:是否有任何其他方法比这更快或更可扩展,或者等于这个,或者另一个函数可以补充这种方法?这种方法是好的做法吗?是否可以覆盖 post 的全局变量并获取上述数据?
我知道上面的代码不是面向对象的,但它是关于在运行检查之前自动清理用户输入数据的方法。我认为这将节省大量代码和头痛。
请与我分享您的想法。由于 cmets 在 Stack Overflow 上受到限制,如果您给这个表格带来新的想法,如果您回复为答案,我将不胜感激。评论是对这种情况下的具体想法/答案进行评论。
【问题讨论】:
-
如果您想让 Thomas O'Leary 先生在表格中输入他的姓名,或者让某人输入网址,这没什么用处
-
我从来没有看到这一点。你需要知道你期待什么数据。如果您排除几乎所有内容,则很难在 SO 上发布代码。
-
取决于您如何制作 clean_str 函数。你可以在那个函数中使用 mysql_real_escape_string 并且你很好。
-
您应该将
clean_str重命名为corrupt_str。绝对不需要删除preventing SQL injections 的any 字符。使用经过验证的技术,如准备好的语句,一切都很好。 -
原则上,这不是一个可怕的想法。然而,在现实世界中,您会遇到不想以这种方式“清理”字符串的情况。您确实需要根据具体情况处理字符串“清理”。
标签: php security post get sql-injection