URL和mod_rewrite:使用许多特殊字符并保护数据免受攻击

时间:2010-12-12 14:11:39

标签: php mysql security mod-rewrite pdo

我正在使用mod_rewrite处理内容网页的网站,并且我正在尝试使用mod_rewrite来管理受SQL injections保护的网址,但有一些字符限制,因为用户可以创建如下页面内容:

http://site.com/content-type/Page-created-by-user

当他们插入类似的内容时,我的怀疑来了:

http://site.com/architect/Giovanni+Dall'Agata

我需要插入' char,因为我可以拥有这样的名称,例如着名建筑师,但我不知道我是否可以保证数据安全,以及如何使用此字符阻止SQL injections

我应该做一些特别的事情来防止攻击吗?

我在PDO class中使用PHP,如下所示:

$architect = strip_tags (trim ($_REQUEST["architect"]));

// pdo class etc..
$pdo_stmt->bindParam (":arch", $architect, PDO::PARAM_STR);
// and the other code here...

用户无法使用这些字符创建网页:< > / \ * ? =我是否应该禁用'"? 或者我应该只允许'"个字符中的一个,还是可以一起使用它们并保证服务器安全?

2 个答案:

答案 0 :(得分:2)

$stmt->bindParam(和bindValue,一般来说,准备好的语句)可以安全地防止SQL注入。所有严肃的SB框架都支持向查询添加参数的方法,并且以这种方式添加的值将被清理。您应该始终这样做,并且永远不要将来自用户(请参阅注释)变量数据手动插入到SQL查询字符串中。

这仍然留下了XSS注射的问题,这更容易被错过(尽管也不那么危险);要避免它们,请确保始终使用htmlspecialchars($var,ENT_QUOTES)(或urlencode,具体取决于具体情况)。

答案 1 :(得分:0)

PDO会自动转义'之类的字符,因此您应该没问题,只需确保关闭register_globalsmagic_quotes并始终使用bindParam进行查询。< / p>

此外,如果您谈论创建动态网址,则不应该在其中包含'字符。我总是使用:

$str = preg_replace("([^0-9a-zA-Z\-])", "", $str);

从字符串中删除任何不是0-9,a-z或短划线的内容。