在PHP中,当将字符串提交到数据库时,我应该使用htmlspecialchars()或使用正则表达式来处理非法字符吗?
我正在编写一个表单,该表单可以让用户在要提交到数据库的字符串中使用非法/特殊字符。我想转义/否定字符串中的这些字符,并且一直在使用htmlspecialchars()。但是,有没有更好/更快的方法?
我正在编写一个表单,该表单可以让用户在要提交到数据库的字符串中使用非法/特殊字符。我想转义/否定字符串中的这些字符,并且一直在使用htmlspecialchars()。但是,有没有更好/更快的方法?
数据库没有“非法”字符。无法存储某些字符的数据库是无稽之谈。有一些服务字符(如引号)用于分隔字符串。这些字符应该只是转义,而不是消除。
要向数据库发送查询,您有 2 个选项:
通常构建查询,使其看起来与可以在 sql 控制台中运行的 SQL 查询完全相同。
要做到这一点,人们应该理解一整套规则,而不仅仅是“使用mysql_real_escape_string”。
规则如下:
分别发送查询和数据。
这是最优选的方式,因为它可以缩短为“使用绑定”。所有字符串,数字和LIMIT参数都可以绑定 - 完全不用担心。
使用此方法,您的查询占位符按原样发送到数据库,绑定数据在单独的数据包中发送,因此,它不会干扰。它就像代码和数据分离一样。发送与数据分离的程序(查询本身)。
上面所说的一切仅涵盖查询的数据部分。
但有时我们必须使查询更加动态,添加运算符或标识符。
在这种情况下,每个动态参数都应该在我们的脚本中进行硬编码,并从该集合中进行选择。
例如,要执行动态排序:
$orders = array("name","price","qty"); //field names
$key = array_search($_GET['sort'],$orders)); // see if we have such a name
$orderby = $orders[$key]; //if not, first one will be set automatically. smart enuf :)
$query = "SELECT * FROM `table` ORDER BY $orderby"; //value is safe
或动态搜索:
$w = array();
$where = '';
if (!empty($_GET['rooms'])) $w[]="rooms='".mesc($_GET['rooms'])."'";
if (!empty($_GET['space'])) $w[]="space='".mesc($_GET['space'])."'";
if (!empty($_GET['max_price'])) $w[]="price < '".mesc($_GET['max_price'])."'";
if (count($w)) $where="WHERE ".implode(' AND ',$w);
$query="select * from table $where";
在此示例中,我们仅向查询添加用户输入的数据,而不添加字段名称,这些字段名称都在脚本中进行了硬编码。对于绑定,算法将非常相似。
等等。
如果您将此数据提交到数据库,请查看数据库的转义函数。
也就是说,对于MySQL,mysql_real_escape_string。
这些转义函数可以处理任何可能是恶意的字符,并且您仍将以与放入数据相同的方式获取数据。
您还可以使用预准备语句来处理数据:
$dbPreparedStatement = $db->prepare('INSERT INTO table (htmlcontent) VALUES (?)');
$dbPreparedStatement->execute(array($yourHtmlData));
或者更自我解释一下:
$dbPreparedStatement = $db->prepare('INSERT INTO table (htmlcontent) VALUES (:htmlcontent)');
$dbPreparedStatement->execute(array(':htmlcontent' => $yourHtmlData));
如果要保存不同类型的数据,请使用 来定义每种类型的数据,也就是说,整数可以由以下公式定义:。例:bindParam
$db->bindParam(':userId', $userId, PDO::PARAM_INT);
$dbPreparedStatement = $db->prepare('INSERT INTO table (postId, htmlcontent) VALUES (:postid, :htmlcontent)');
$dbPreparedStatement->bindParam(':postid', $userId, PDO::PARAM_INT);
$dbPreparedStatement->bindParam(':htmlcontent', $yourHtmlData, PDO::PARAM_STR);
$dbPreparedStatement->execute();
您的 PHP 数据对象 (PDO) 在哪里。如果您没有使用,则可以在PHP数据对象中了解有关它的更多信息。$db