我正在使用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...
用户无法使用这些字符创建网页:< > / \ * ? =
我是否应该禁用'
和"
?
或者我应该只允许'
和"
个字符中的一个,还是可以一起使用它们并保证服务器安全?
答案 0 :(得分:2)
$stmt->bindParam(和bindValue,一般来说,准备好的语句)可以安全地防止SQL注入。所有严肃的SB框架都支持向查询添加参数的方法,并且以这种方式添加的值将被清理。您应该始终这样做,并且永远不要将来自用户(请参阅注释)的变量数据手动插入到SQL查询字符串中。
这仍然留下了XSS注射的问题,这更容易被错过(尽管也不那么危险);要避免它们,请确保始终使用htmlspecialchars($var,ENT_QUOTES)
(或urlencode,具体取决于具体情况)。
答案 1 :(得分:0)
PDO会自动转义'
之类的字符,因此您应该没问题,只需确保关闭register_globals
和magic_quotes
并始终使用bindParam
进行查询。< / p>
此外,如果您谈论创建动态网址,则不应该在其中包含'
字符。我总是使用:
$str = preg_replace("([^0-9a-zA-Z\-])", "", $str);
从字符串中删除任何不是0-9,a-z或短划线的内容。