gpt4 book ai didi

php - 在 PHP 中,当向数据库提交字符串时,我应该使用 htmlspecialchars() 还是使用正则表达式来处理非法字符?

转载 作者:IT王子 更新时间:2023-10-29 00:00:31 25 4
gpt4 key购买 nike

我正在开发一个表单,用户可以在要提交给数据库的字符串中使用非法/特殊字符。我想转义/否定字符串中的这些字符,一直在使用 htmlspecialchars() .但是,是否有更好/更快的方法?

最佳答案

数据库没有“非法”字符。不能存储某些字符的数据库是无稽之谈。有一些服务字符,例如引号,用于分隔字符串。这些字符应该只是转义,而不是消除。

要向数据库发送查询,您有 2 个选择:

  1. 以常规方式构建查询,使其看起来与您可以在 SQL 控制台中运行的 SQL 查询完全一样。
    为此,应该了解一整套规则,而不仅仅是“使用 mysql_real_escape_string”。
    规则如:

    • 字符串应包含在引号中并进行转义。那是转义的唯一意义:它只是转义分隔符! (和一些其他字符 - 字符串终止字符和转义字符本身)。如果没有引号,mysql_real_escape_string 就毫无用处。
    • 数字应该明确地转换成它的类型。尽管数据数字可以像字符串一样受到威胁,但有些数字(例如 LIMIT 子句参数)无法转义,只能强制转换。
  2. 分开发送查询和数据。
    这是最优选的方式,因为它可以缩短为“使用绑定(bind)”。可以绑定(bind)所有字符串、数字和 LIMIT 参数 - 完全不用担心。
    使用这种方法,带有占位符的查询按原样发送到数据库,绑定(bind)数据在单独的数据包中发送,因此,它不会干扰。这就像代码数据 分离。您将程序(查询本身)与数据分开发送。

但是!

上面所说的一切只涵盖了查询的数据部分。
但有时我们必须使我们的查询更加动态,添加运算符或标识符。
在这种情况下,每个动态参数都应该在我们的脚本中进行硬编码,并从该集合中选择。
例如,进行动态排序:

$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";

在这个例子中,我们只将用户输入的数据添加到查询中,而不是字段名称,这些都是硬编码在脚本中的。对于绑定(bind),算法将非常相似。

等等。

关于php - 在 PHP 中,当向数据库提交字符串时,我应该使用 htmlspecialchars() 还是使用正则表达式来处理非法字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2993027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com