清理$ _SERVER ['HTTP_USER_AGENT']&保存到DB之前$ _SERVER ['HTTP_REFERER']?

时间:2012-01-30 15:34:52

标签: php mysql security sql-injection

我有一个反馈表单,其中包含几个用户输入的字段以及PHP函数生成的一些字段,如'user-agent'和'referer'。

我的问题是输入前应该输入这些字符串吗?我意识到可以轻松地改变用户代理和引用页面,但是访问者是否可以添加类似字符串的SQL注入,这样当PHP提取此信息时它可能会破坏我的表单?

例如,如果用户更改了其用户代理或引用页面以包含字符串Robert'); DROP TABLE Students;--

4 个答案:

答案 0 :(得分:6)

“消毒”这个词很模糊甚至是欺骗性的 实际上,根本不需要“消毒”字符串。您只需要格式化它们。

因此,最好使用更准确的术语。

如果你在谈论逃避,答案很简单:
你必须逃避任何你要查询的字符串,尽管它的来源,内容或目的。
这不是因为孩子们从一些愚蠢的漫画中吓唬故事 它只是查询中字符串数据的正确格式:您必须将其括在引号中,从而转义可能存在于数据中的这些分隔符。

请参阅?与告诉您仅“清理”用户输入的所有其他答案不同,在现实世界中,您必须逃避每个字符串。不要自问“我是否应该消毒某些东西?”。你应该。周期。

注意 对于任何其他查询部分,例如数字或标识符,转义完全没用,并且会“清理”任何内容。

准备好的陈述也有同样的规则:
对于任何数据,请始终使用它,而不仅仅是“不受信任的用户输入”。

答案 1 :(得分:4)

简单的答案:验证/清理/转义一切(例如客户端数据),因为可以修改所有内容并且包含或包含的意外字符>可以打破您的查询(例如Col. Shrapnel explanained)。

为了最大限度地降低风险,您还应该使用prepared statements而不是自己构建sql-strings(注意:此意味着您可以省略检查)。

编辑:感谢您的评论,我已经改写了整个第一句,而不是越来越多地改进它。

答案 2 :(得分:0)

始终清理/过滤来自浏览器的 任何 输入。

假设所有用户都是邪恶的,你应该没事。

连接不一定来自浏览器 - anyone can write their own HTTP requests with a telnet client。也可能有专门的工具,它们并不难创建。

答案 3 :(得分:0)

首先关闭所有 - 我认为最好的做法是参数化查询中的所有内容,包括自生成值。对我来说,它不会使查询(几乎)无视,但它会创建更好,更可读的查询。 当您使用参数并在以后分配它们时,您在代码中使用更明确的逻辑,因此从长远来看它将更好地运行。

更长的解释可以在附件链接中找到:

How can I prevent SQL injection in PHP?