【发布时间】:2013-12-31 07:52:54
【问题描述】:
为了防止 SQL 注入,我正在使用 PDO。我见过人们同时使用这两种方法,即:bindValue() 然后 execute() 或只是 execute(array())
这两种方法都可以防止攻击吗?由于 mysql_real_escape_string() 已被弃用,还有什么我应该考虑在这里使用的吗?
像 $aenrollmentno 我应该将类型转换成
$aenrollmentno = (int)($_POST['aenrollmentno']);
如果我不在准备好的语句中使用它,这是否足够安全?我还缺少任何其他安全措施吗?
<?php
if(isset($_POST['aenrollmentno']))
{
$aenrollmentno = mysql_real_escape_string($_POST['aenrollmentno']);
}
if(isset($_POST['afirstname']))
{
$afirst_name = mysql_real_escape_string($_POST['afirstname']);
$afirstname = ucfirst(strtolower($afirst_name));
}
//PDO connection
try {
$conn = new PDO('mysql:host=localhost;dbname=practice','root','');
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $conn->prepare('INSERT INTO modaltable(afirstname, alastname,aenrollmentno) VALUES (:afirstname,:alastname,:aenrollmentno)');
$stmt->execute(array(
'afirstname' => $afirstname,
'alastname' => $alastname,
'aenrollmentno' => $aenrollmentno,
));
echo "Success!";
}
catch (PDOException $e) {
echo 'ERROR: '. $e->getMessage();
}
?>
【问题讨论】:
-
有趣的是你应该问。 Have a read at this...阅读全文,你会很惊讶;我是。
-
mysql_real_escape_string 本身并没有被弃用。 ENTIRE mysql_*() 函数集已弃用。同样, m_r_e_s() 需要与服务器建立活动连接才能运行,因为您使用的是 PDO,所以您不太可能拥有。你不能像那样混合/匹配库。 PDO 准备好的语句几乎完全消除了手动转义数据的需要。
-
由于您使用的是准备好的语句,因此 m_r_e_s 调用实际上只会对数据进行双重转义,并以您以后不喜欢的方式将其丢弃。
-
我现在明白了。我不会使用 m_r_e_s()!谢谢。
标签: php security pdo database-connection sql-injection