只有一个简单的问题:下面的PHP代码安全吗?还有什么你认为我可以或应该补充的吗?
$post = $_GET['post'];
if(is_numeric($post))
{
$post = mysql_real_escape_string($post);
}
else
{
die("NAUGHTY NAUGHTY");
}
mysql_select_db("****", $*****);
$content = mysql_query("SELECT * FROM tbl_***** WHERE Id='" . $post . "'");发布于 2010-02-18 22:36:03
在这种特殊的情况下,我猜is_numeric可以让您避免SQL注入(尽管您仍然可以中断SQL语句,参见Alex的回答)。然而,我真的认为你应该考虑使用参数化查询(也就是。准备好的语句),因为:
代码时,您不会有忘记输入环境保护的风险将使编写和读取更加容易
下面是一个示例(其中$db是一个PDO连接):
$stmt = $db->prepare('SELECT * FROM tbl_Persons WHERE Id = :id');
$stmt->execute(array(':id' => $_GET['post']));
$rows = $stmt->fetchAll();有关PHP中参数化SQL语句的详细信息,请参阅:
发布于 2010-02-18 22:34:52
这有点粗糙,但我不会立即看到任何会给您带来严重问题的东西。您应该注意到,根据文档,十六进制表示法在is_numeric()中被接受。您可能希望使用is_int()或强制转换它。为了清楚起见,我建议使用参数化查询:
$sql = sprintf("SELECT col1
FROM tbl
WHERE col2 = '%s'", mysql_real_escape_string($post));在本例中,$post将作为%s的值传入。
发布于 2010-02-18 22:36:00
对于十六进制数字,is_numeric将返回true,例如'0xFF‘。
EDIT:要解决此问题,您可以执行以下操作:
sprintf('%d', mysql_real_escape_string($post, $conn));
//If $post is not an int, it will become 0 by sprintf有关更多信息,请查看代码片段here on php.net。
https://stackoverflow.com/questions/2289295
复制相似问题