【发布时间】:2010-06-09 13:22:40
【问题描述】:
我有一个包含许多字段的表单...
动作设置为查询mysql的php页面...
我应该用mysql_real_escape_string 对每个变量进行消毒吗?
或者我可以忽略清理下拉列表和收音机吗?
另外,除了mysql_real_escape_string,我还应该做些什么来防止攻击?
谢谢
【问题讨论】:
标签: php sql mysql database security
我有一个包含许多字段的表单...
动作设置为查询mysql的php页面...
我应该用mysql_real_escape_string 对每个变量进行消毒吗?
或者我可以忽略清理下拉列表和收音机吗?
另外,除了mysql_real_escape_string,我还应该做些什么来防止攻击?
谢谢
【问题讨论】:
标签: php sql mysql database security
您还必须检查选择和单选按钮。任何人都可以创建自己的 HTML 表单并将其发布到您的脚本中。 Firefox 扩展 Web Developer Toolbar 甚至提供将选择转换为文本输入的选项。
您还可以检查发布的数据是否仅包含正确的值。例如,如果您有一个单选按钮,请确保发布的表单仅包含一个有效值。
你当然应该只对你要放入 MySQL 的变量运行 mysql_real_escape_string。如果保存到文件,在命令行或其他任何地方使用,还有更合适的功能和解决方案。
【讨论】:
一般来说,在浏览器之外形成一个 POST 请求并绕过下拉列表(例如)可能对可能值施加的任何限制是微不足道的。
因此,您应该始终将用户数据视为恶意且容易出错,并在服务器端尽可能多地进行验证和保护。
【讨论】:
又是一堆无知的答案。卡姆兰,你像磁铁一样吸引它。
您必须了解 mysql_real_escape_string 与表单和收音机无关,与检查和清理无关。
而且它不能防止攻击。
它只是一个字符串转义函数。它将要插入到 SQL 查询字符串中的数据作为字符串数据进行转义。
SQL 查询是一个小程序。使用它自己的语法。您必须遵循该语法,不是因为“攻击”,而是因为它只是一种语法。而且,当然,这些规则不依赖于数据来源!单选按钮、html 表单或浏览器 - 都无关紧要!
而且它只适用于字符串。不是数字也不是标识符。
这是我关于如何处理 SQL 查询的答案: In PHP when submitting strings to the database should I take care of illegal characters using htmlspecialchars() or use a regular expression?
【讨论】:
从客户端发送的任何变量都不能被认为是安全有效的。如果您在查询中使用它们,则应始终对其进行清理。
【讨论】:
在 SQL 语句中使用字符串之前,只需使用mysql_real_escape_string 进行转义,以防止 SQL 注入攻击。
此外,当从数据库中取出数据并以 HTML 格式写出时,您应该考虑使用htmlspecialchars 或strip_tags 来防止跨站点脚本攻击。
【讨论】:
您只需清理不希望攻击者劫持的字段。数据可以来自任何来源,而不仅仅是您的页面。 mysql_real_escape_string 适用于将连接到查询中的任何值,但我会“清理”所有内容。对我来说,“清理”不仅仅意味着处理注入攻击,它还包括任何字段验证(字符串长度、数字、有效日期、空等)。
【讨论】: