0

我正在从 mysql 数据库中获取文本,并通过 url 中的 ID 获取它:

site.php?id=1 等等

什么被认为是最安全的,以防止 sql 注入和东西。这种方式是否正确:

<?php
$news_id = $_GET['news_id'];

if(!is_numeric($news_id)) die('Wrong');

//mysql_query and stuff here
?>

或者这样:

<?php
$news_id = $_GET['news_id'];

if(!intval($news_id)) die('Wrong');

//mysql_query and stuff here
?>
4

5 回答 5

6

为什么不直接使用prepared statement,这才是应对sql注入攻击的正确方式。

但是,使用 intval 将字符串转换为整数,然后将其放入准备好的语句中,您将受到保护,因为 int 值可能为零或负数,因此您的查询不会返回任何内容。

于 2009-09-04T20:33:58.630 回答
3
$news_id = (int)@$_GET['news_id'];
if ($news_id <= 0) die ('Wrong');

假设news_id为正 (>0)。

于 2009-09-04T20:30:14.987 回答
1

如果您使用 intval,您将无法使用 news_id=0,因为如果 news_id 不是数字,intval 将始终返回 0。is_numeric 在您的情况下更合适、更安全。

于 2009-09-04T20:32:43.110 回答
0

is_numeric 不是检查它的好方法,

$number = "4"; // string ? int ?

intval 不返回真或假。所以你不能像你写的那样使用它。试试这个

if(intval($news_id) === (int)$news_id){
//code goes here
}

或者

if(intval($news_id) == $news_id){
//code goes here
}
于 2009-09-04T20:30:00.960 回答
0
if (preg_match("/^[1-9]+\d*$/", $news_id)){
    // you're good to go
}
于 2011-12-21T01:08:36.647 回答