我现在使用PDO编写PHP5编程,不使用预处理语句,而只是使用“普通”查询:
$oQuery = $oDatabase->query(
"SELECT
Content
FROM
CMS
WHERE
Title = '". $this->TITLE ."'
LIMIT 1"
);
$aItem = $oQuery->fetch();
echo stripslashes($aItem['Content']);
现在我有两个问题:
如果我想插入一些内容,这是否足以保护SQL注入?
$something = quote($something);
HTML 和 SQL注入是否足够?
$something = htmlspecialchars($something, ENT_QUOTES);
请注意ENT_QUOTES,因为这也将取代:'
这个怎么样?
$this->TITLE = mysql_real_escape_string($this->TITLE);
$oQuery = $oDatabase->query(
"SELECT
Content
FROM
CMS
WHERE
Title = '". $this->TITLE ."'
LIMIT 1"
);
$aItem = $oQuery->fetch();
echo stripslashes($aItem['Content']);
或者我还应该使用准备好的陈述吗?
谢谢!
答案 0 :(得分:0)
不,HTML和SQL根据上下文有不同的特殊字符。所以他们需要一种不同的,对情境敏感的治疗方法。
即使引用的HTML属性值(使用double quotes或single quotes和MySQL string literals,乍一看似乎相似,也有不同的特殊字符集和不同的转义序列。特别是if MySQL uses backslashes for escape sequences, htmlspecialchars
won’t prevent SQL injections in string literals。
答案 1 :(得分:0)
我认为你误解了一些事情。
HTML注入:
htmlspecialchars
将特殊字符转换为HTML实体。
这就是它,它只对将数据显示到网页有帮助,以便有人不会尝试注入html。例如:
echo '<p> Welcome: ' . htmlspecialchars($_GET['username']) . '</p>';
SQL注入
您正在使用PDO
,这很棒,但您未能准备好查询。
你不能手动逃避准备陈述的全部内容。
在没有准备的情况下查询非常非常糟糕,你应该做好准备。
$oQuery = $oDatabase->prepare(
"SELECT
Content
FROM
CMS
WHERE
Title = :title
LIMIT 1"
);
$oQuery->execute(array('title'=>$this->TITLE));
$aItem = $oQuery->fetch();
$content = $aItem['Content'];
仅当没有参数
时才使用query
$oDatabase->query("SELECT Content FROM CMS");
否则总是准备避免sql注入