在PHP中,当向数据库提交字符串时,我应该使用htmlSpecialchars()处理非法字符

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

我正在处理一个表单,该表单允许用户在要提交到数据库的字符串中使用非法/特殊字符。我想转义/否定字符串中的这些字符,并且一直在使用htmlSpecialchars()..然而,是否有更好/更快的方法?



MYYA
浏览 859回答 3
3回答

MMMHUHU

如果将此数据提交给数据库,请查看数据库的转义函数。也就是说,对于MySQL来说MySQL真实转义字符串.这些转义函数处理任何可能是恶意的字符,您仍将以相同的方式获取数据。您还可以使用准备好的语句来处理数据:$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();哪里$db是PHP数据对象(PDO)。如果你不使用它,你可以在PHP数据对象.

临摹微笑

数据库中没有“非法”字符。不能存储某些字符的数据库是一派胡言。有一些服务字符,如引号,用于分隔字符串。这些角色应该只是转义,而不是被删除。要向数据库发送查询,您有两个选项:构建一个通常的查询方式,使其看起来与SQL控制台中运行的SQL查询完全一样。要做到这一点,一个人应该明白一整套规则,而不仅仅是“使用MySQL_REAL_EXECH_String”。规则,如:字符串应该用引号和转义来括起来。这是转义的唯一含义:它只是逃避分隔符!(以及其他一些字符-字符串终止字符和转义字符本身)。没有周围的引号,MySQL_REAL_EXECH_String就没用了。数字应该显式地转换为它的类型。虽然数据数字可以像字符串一样受到威胁,但也有一些数字,比如限制子句参数,它们不能转义,只能进行强制转换。发送查询和数据分别.这是最可取的方式,因为它可以缩短为只是“使用绑定”。所有字符串、数字和限制参数都可以绑定-完全不用担心。使用此方法,您的查询将占位符按原样发送到数据库,绑定数据以单独的数据包发送,因此不会发生干扰。就像电码和数据分离。将程序(查询本身)与数据分开发送。但!上面提到的所有内容都只涉及查询的数据部分。但有时我们必须使查询更加动态,添加运算符或标识符。在这种情况下,每个动态参数都应该在脚本中进行硬编码,并从该集合中选择。例如,要执行动态排序:$orders&nbsp;&nbsp;=&nbsp;array("name","price","qty");&nbsp;//field&nbsp;names$key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;array_search($_GET['sort'],$orders));&nbsp; //&nbsp;see&nbsp;if&nbsp;we&nbsp;have&nbsp;such&nbsp;a&nbsp;name$orderby&nbsp;=&nbsp;$orders[$key]; &nbsp;//if&nbsp;not,&nbsp;first&nbsp;one&nbsp;will&nbsp;be&nbsp;set&nbsp;automatically.&nbsp;smart&nbsp;enuf&nbsp;:)$query&nbsp;&nbsp;&nbsp;=&nbsp;"SELECT&nbsp;*&nbsp;FROM&nbsp;`table`&nbsp;ORDER&nbsp;BY&nbsp;$orderby";&nbsp; &nbsp;//value&nbsp;is&nbsp;safe或动态搜索:$w&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;array();$where&nbsp;=&nbsp;'';if&nbsp;(!empty($_GET['rooms']))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $w[]="rooms='".mesc($_GET['rooms'])."'";if&nbsp;(!empty($_GET['space']))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $w[]="space='".mesc($_GET['space'])."'";if&nbsp;(!empty($_GET['max_price']))&nbsp; $w[]="price&nbsp;<&nbsp;'".mesc($_GET['max_price'])."'";if&nbsp;(count($w))&nbsp;$where="WHERE&nbsp;".implode('&nbsp;AND&nbsp;',$w);$query="select&nbsp;*&nbsp;from&nbsp;table&nbsp;$where";在本例中,我们只向查询中添加由用户输入的数据,而不是字段名,这些数据都是在脚本中硬编码的。对于绑定,算法将非常相似。
打开App,查看更多内容
随时随地看视频慕课网APP