我正在处理一个表单,其中有可能让用户在要提交给数据库的字符串中使用非法/特殊字符.我想在字符串中转义/否定这些字符,并且一直在使用htmlspecialchars().但是,有更好/更快的方法吗?
我有一个非常简单的辅助函数来为传统的普通mysql驱动程序用法生成SET语句:
function dbSet($fields) {
$set='';
foreach ($fields as $field) {
if (isset($_POST[$field])) {
$set.="`$field`='".mysql_real_escape_string($_POST[$field])."', ";
}
}
return substr($set, 0, -2);
}
Run Code Online (Sandbox Code Playgroud)
像这样用过
$id = intval($_POST['id']);
$fields = explode(" ","name surname lastname address zip fax phone");
$_POST['date'] = $_POST['y']."-".$_POST['m']."-".$_POST['d'];
$query = "UPDATE $table SET ".dbSet($fields)." stamp=NOW() WHERE id=$id";
Run Code Online (Sandbox Code Playgroud)
它使代码非常干燥,同时也很灵活.
我要问是否有人愿意分享类似的功能,利用PDO预备语句功能?
我仍然怀疑,如何做到这一点.
是否有一种直接而简单的方法来使用PDO预处理语句来插入数据?应该是什么形式?查询构建器助手?还是插入查询助手?它应该采取什么参数?
我希望它可以很容易被用作SO的答案.因为在每个主题中我们都可以看到预备语句的使用建议,但是没有一个好的例子.真实的例子,我的意思是.键入bind_param()20次并不是一个好的编程风格我相信.甚至还有20个问号.
我一直在发现这句话PHP PDO's prepared statements prevents SQL injection.
- php PDO(PDO准备好的语句)如何阻止sql注入?
- 使用PDO(PDO准备好的声明)的其他优缺点是什么?
- 使用PDO(PDO准备好的声明)会降低效率吗?
我已经读过:PDO准备好的语句是否足以阻止SQL注入? 但那里的数据并不完全清楚.
我有这个我正在使用的功能,我想确保它完全防止SQL注入攻击:
function MakeSafeForQuery($string)
{
// replace all of the quote
// chars by their escape sequence
$ret = str_replace("\\","\\\\",$string);
$ret = str_replace("'","\\'",$ret);
$ret = str_replace("\"","\\\"",$ret);
return $ret;
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么严肃的事吗?
编辑:我顺便使用MySQL.
我想使用mysql_real_escape_string阻止1 = 1,但不确定我是否正确,因为我仍然可以执行1 = 1.这是我的代码:
$memberId = mysql_real_escape_string($_GET["memberId"]);
$sql = "SELECT firstName, lastName, dateSent, message, messageId FROM member, message WHERE member.memberId = message.sentFromId AND message.inboxId=" . $memberId . " ORDER BY dateSent DESC;";
Run Code Online (Sandbox Code Playgroud)
谢谢
一次又一次我在Stackoverflow上读到我应该使用PDO来访问MySQL,因为它更安全.我最近使用一些在线教程将一些select和insert语句更改为PDO,并发现它们与我的原始代码非常相似.这让我觉得也许我错过了一些东西.
那么,我的问题是what makes PDO safer than normal mysql?有什么能让这些例子更安全吗?
编辑:我已粘贴下面的插入代码.如果您能看到一些让它更安全的方法,请告诉我.
include 'dataB3S3.php';
try {
$dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
/*** connect to DB ***/
/*** INSERT data ***/
$count = $dbh->exec("INSERT INTO $table(`instance` ,`uid`,`teid`) VALUES (NULL,'$userID','$teid')");
/*** display the id of the last Auto INSERT ***/
$lastInsertValue=$dbh->lastInsertId();
/*** close the database connection ***/
$dbh = null;
}
Run Code Online (Sandbox Code Playgroud)