MySQL安全检查
晚上好 在我让我的网站上线之前,我显然想确保它的安全(或尽可能的安全) 我有一个搜索表单,一个用户上传条目到数据库的机会,我想就是这样 所以我只想看看我应该做些什么来保护这些东西。首先,我的数据库是由一个专用的用户帐户(不是admin或root)访问的,所以我想我已经锁定了那个部分 其次,在我所有的搜索查询中,我都采用这种格式:MySQL安全检查,mysql,security,Mysql,Security,晚上好 在我让我的网站上线之前,我显然想确保它的安全(或尽可能的安全) 我有一个搜索表单,一个用户上传条目到数据库的机会,我想就是这样 所以我只想看看我应该做些什么来保护这些东西。首先,我的数据库是由一个专用的用户帐户(不是admin或root)访问的,所以我想我已经锁定了那个部分 其次,在我所有的搜索查询中,我都采用这种格式: $result = mysql_query( "SELECT * FROM table WHERE fieldname = '" . mysql_real_escap
$result = mysql_query(
"SELECT *
FROM table
WHERE fieldname = '" . mysql_real_escape_string($country) . "'
AND county = '" . mysql_real_escape_string($county) . "'
ORDER BY unique_id DESC");
最后,在提交表单中的$_POST字段中,在将变量插入数据库之前,我使用以下方法处理变量:
$variable = mysql_real_escape_string($variable);
$result = mysql_query(
"INSERT INTO table (columnone)
VALUES ($variable)";
有人能告诉我我还应该考虑什么,或者这是否足够可以接受吗
像往常一样,提前谢谢你,
Dan从防止SQL注入的角度来看,您显示的所有内容都很好,除了
$variable = mysql_real_escape_string($variable);
$result = mysql_query(
"INSERT INTO table (columnone)
VALUES ($variable)";
这非常需要在
$variable
周围加引号,或者像@Dan指出的那样,检查它是否是一个数字,以确保安全mysql\u real\u escape\u string
仅对字符串数据进行清理-这意味着,任何试图打破由单引号或双引号分隔的字符串的行为。如果插入的值没有被引号括起来,它就不会提供任何保护。您显示的所有内容都可以防止SQL注入,除了
$variable = mysql_real_escape_string($variable);
$result = mysql_query(
"INSERT INTO table (columnone)
VALUES ($variable)";
这非常需要在
$variable
周围加引号,或者像@Dan指出的那样,检查它是否是一个数字,以确保安全mysql\u real\u escape\u string
仅对字符串数据进行清理-这意味着,任何试图打破由单引号或双引号分隔的字符串的行为。如果插入的值没有被引号括起来,它就不会提供任何保护。代码看起来不错,不过如果可能的话,您应该考虑使用PDO准备的语句
除此之外,确保PHP代码用于连接MySQL的任何帐户都具有绝对最小的权限。大多数面向web的脚本不需要alter/drop/create类型权限。大多数人只需要更新/插入/选择/删除,甚至更少。这样,即使您的代码级安全性出现严重问题,恶意用户也无法向您发送
”;drop table students--
类型查询(re:)代码看起来不错,不过如果可能的话,您应该考虑使用PDO准备的语句
除此之外,确保PHP代码用于连接MySQL的任何帐户都具有绝对最小的权限。大多数面向web的脚本不需要alter/drop/create类型权限。大多数人只需要更新/插入/选择/删除,甚至更少。这样,即使您的代码级安全性出现严重问题,恶意用户也无法向您发送
”;drop table students--
类型查询(re:)您是否考虑过在SQL中使用类似MYSQL的PDO和绑定参数
我的理解是,这比使用mysql\u real\u escape\u string要安全得多。您是否考虑过在SQL中使用类似mysql的PDO和绑定参数
我的理解是,这比使用mysql\u real\u escape\u string要安全得多。您已经抵御了一类攻击,即通过表单的SQL注入。在这些代码中,您无需做更多的事情,但这很难保证您的应用程序或服务器的安全。Dan,谢谢。那么,您还建议我看什么呢?您已经抵御了一类攻击,即通过表单的SQL注入。在这些代码中,您无需做更多的事情,但这很难保证您的应用程序或服务器的安全。Dan,谢谢。那么你还建议我看什么呢?假设
columnone
是一个字符字段。如果不是,则引号不合适。@Dan没关系,您需要清理变量。我可以在$variable
中执行任何操作,比如启动子选择或其他操作。如果它不是一个字符字段,您需要确保它是一个int
(或者使用引号-mySQL允许它们用于任何类型的值)我没有说不需要对变量进行清理,只是您声称需要在查询中引用它不一定合适。如果它应该是一个数字,您应该确保它是一个数字,但在查询中不应该在它周围加引号。@Dan很公平,我会澄清这一点。假设columnone
是一个字符字段。如果不是,则引号不合适。@Dan没关系,您需要清理变量。我可以在$variable
中执行任何操作,比如启动子选择或其他操作。如果它不是一个字符字段,您需要确保它是一个int
(或者使用引号-mySQL允许它们用于任何类型的值)我没有说不需要对变量进行清理,只是您声称需要在查询中引用它不一定合适。如果它应该是一个数字,你应该确保它是一个数字,但你不应该在查询中用引号括起来。@Dan公平地说,我会澄清这一点。这不完全是真的-mysql\u real\u escape\u string可能具有完美的安全性,你只需要知道你在做什么。但是事先准备好的声明会让人更难忽视一些事情,所以使用themHi Matt没有错,这是我的第一个动态网站,所以说实话,我只是在尝试了解基本情况。不过有几个人把我指给PDO。也许下一次:)PDO确实让生活变得更轻松,但有些查询构造无法处理准备好的语句。对于那些需要从头开始构建自己的查询并自行处理转义/清理的查询,这并不完全正确-mysql\u real\u escape\u string有可能实现完美的安全性,您只需要知道自己在做什么。但事先准备好的陈述会让人更难忽视事情,所以