2013-12-16 42 views
0

我有一个链接缩略图列表。每个缩略图都有一个变量的链接。如何安全地通过在URL中重写PHP的变量?

<a href="index.php?id=1"><img src="thumb1.jpg"> 
<a href="index.php?id=2"><img src="thumb2.jpg"> 

等等

现在,我已经更新站点使用URL重写。想法是,我有这样的链接

<a href="gallery/?id=1"><img src="thumb1.jpg"> 
<a href="gallery/?id=2"><img src="thumb2.jpg"> 

或东西simillar。

在着陆页上,我使用$id来执行MySQL查询,并使用该ID显示来自库的所有图片。

$pictures = mysql_query("SELECT * FROM t_gallery where id=$id",$db); 

可以这样做,主要的是,我该如何防止通过身份证构成安全威胁?

干杯, 阿莱克斯

回答

2

URL重写部分本身并没有真正引入任何新的安全威胁,问题是使用mysql_*函数(已弃用),而不是转义$id请求变量。

如果你害怕SQL注入(应该是这样),要么在查询中使用它之前转义$ id变量,要么使用准备语句(然后切换到mysqli或PDO,你应该这样做在任何情况下都会导致mysql_ *被弃用!)。

始终验证并转义您即将在数据库查询中使用的任何内容。

+0

我怎样才能逃避它,你实际上可以让您的href网址,这样的吗?我不是非常familliar与此... 我不输入任何东西到数据库,只是读,但我,如你所说,害怕SQL注射。 其他的事情,当我使用gallery /?id = 2作为链接时,varibale不会传递给其他文件。我该怎么做 ? – Aleks

+0

那么,没有看到你的重写规则(可能在.htaccess文件中),我不能帮助为什么param没有通过。我会再次推荐移动到PDO或mysqli并使用准备好的语句,在这种情况下不需要转义。但是如果你坚持不推荐使用的mysql函数,那么'mysql_real_escape_string'函数可能就是你正在寻找的东西。如果你期望$ id是一个数字,你总是可以用'if(is_numeric($ id))'来检查,如果是的话,你不需要转义它。 Sql注入适用于任何类型的查询,而不仅仅是插入。 – Jite

+0

是的,它将始终是数字。 is_numeric函数addes,mysqli添加。 我只需要通过变量:)。重写作品(是的,在htaccess),所以当它找到特定的页面ID时,它会重写url 例如index.php?page_id = 300成为/ gallery-thumbs /和index.php?page_id = 301成为/ gallery /。现在,我只需要通过身份证表格/画廊大拇指/到/ gallery/ – Aleks

0

对于一个特定的实现我离开这个封装一段代码

function ControllerAction($id=null) { 
    // I like to formalize on entry; this is supposed to be an absolute integer and nothing else 
    $id = abs((int)$id); 
    $q = 'SELECT * FROM t_gallery where id = ?'; // placeholder 
    // use PDO, it's safe and very comfortable 
    $pdo = get_pdo_connection($whatever_you_need); 
    // prepare it because it has placeholders, and because there is external input comming in 
    $stmt = $pdo->prepare($q); 
    // execute it 
    $stmt->execute(array($id)); // read the reference documentation to understand this clearly 
    // now the stmt object holds the results 
    return $stmt->fetchObject();// whatever you like here, I like to make a DAO 
} 

在这个例子中那么简单进来的参数已经准备好使用,但我仍然使用的一致性准备好的语句(我自己的代码约定)

警报:它使用某种形式的半称职的MVC/MVP/MVVM的(我不知道了)型架构

  • 如果您正在使用URL重写进一步落实你的SEO链接

    protocol://host/controller/action/getParam1/getParam2 
    // usage 
    http://yourhost/browsethumbs/aNumber