Php 如何处理包含引号(等)的用户输入?
我有一个标准的文本输入字段。它从Php 如何处理包含引号(等)的用户输入?,php,mysql,odbc,Php,Mysql,Odbc,我有一个标准的文本输入字段。它从$\u POST中获取它的值,我使用它来构建一个SQL查询(ODBC,而不仅仅是MySQL,如果这有区别的话(或者实例,我不能使用MySQL\u escape\u string()) 我正在构建的查询在PHP上有单引号,在SQL上有双引号。例如: $sql = 'SELECT * FROM ' . $table . ' WHERE field="' . $_POST['some_field'] . '""; 如果用户在其输入中包含双引号,例如6“扳手,则在不平衡
$\u POST
中获取它的值,我使用它来构建一个SQL查询(ODBC,而不仅仅是MySQL,如果这有区别的话(或者实例,我不能使用MySQL\u escape\u string())
我正在构建的查询在PHP上有单引号,在SQL上有双引号。例如:
$sql = 'SELECT * FROM ' . $table . ' WHERE field="' . $_POST['some_field'] . '"";
如果用户在其输入中包含双引号,例如6“扳手
,则在不平衡字符串上出现SQL错误(如O'reilly
中的单引号没有问题)
正确的处理方法是什么?再说一遍,我使用的是ODBC接口,而不是MySQL
这仅仅是一个addslashes()
?还是一个神奇的引号的问题
更新:PHP手册中提到了神奇的引号 从PHP5.3.0开始,此功能已贬值。强烈不鼓励依赖此功能 (并不是说他们建议了一个替代方案;事实上,它还说在PHP6中会删除神奇的引号)
答案应该是使用准备好的语句吗?使用PDO。It ODBC使用PDO。It ODBC使用和喜欢PDO使用和喜欢PDO更容易…为什么不使用htmlspecialchars呢
我的意思是,它更快,我假设你给用户一个允许他们使用引号的数据字段的原因是因为你将在某个时候打印出数据。这仍然是可行的,而且你不必改变存储数据的位置。更简单……为什么不使用htmlspecialchars呢
我的意思是,它更快,我假设你给用户一个允许他们使用引号的数据字段的原因是因为你将在某个时候打印出数据。这仍然是可行的,而且你不必改变存储数据的位置。Magic quotes不受欢迎,因为它们在错误的时间做了错误的事情时间。它基本上是自动
addslashes()
处理所有输入的数据,而不是在数据输出之前对特定于目的地的数据进行转义。即使它在MySQL中工作正常(事实并非如此),addslashes
标准SQL转义是否完全错误?在标准SQL中,引号字符是通过将它们加倍而不是添加反斜杠来转义的。您提到了mysql\u escape\u string()
但是该函数已经贬值,如果适用,请使用mysql\u real\u escape\u string()
Magic quotes被弃用,因为它们在错误的时间做了错误的事情。它基本上是自动的addslashes()
,而不是在数据出来之前对特定于目的地的数据进行转义。即使它对MySQL起到了正确的作用(但事实并非如此),addslashes
标准SQL转义是否完全错误?在标准SQL中,引号字符是通过将它们加倍而不是添加反斜杠来转义的。您提到了mysql\u escape\u string()
但是该函数已经贬值,如果适用,请使用mysql\u real\u escape\u string()
+1叹气!谢谢。我知道你是对的;真希望我从一开始就这么做。现在我有几百个地方要换。非常感谢你确认这一点。+1叹气!谢谢。我知道你是对的;真希望我从一开始就这样做。现在我有几百个地方要换。非常感谢你确认这一点。+1谢谢你的发帖。我不太清楚您所说的“您不必更改存储数据的位置”是什么意思(对不起,我是n00b)呃。这不就是一个严格的翻译吗?所以,我会在6"e;Wrench上搜索匹配项,因为这个函数与数据库无关。它是html specialchars,而不是MySQLSSpecialChars。请参考图+1,谢谢您的发布。我不太确定“您不必改变数据存储位置”是什么意思(对不起,我是n00b)呃。这不是做了一个严格的翻译吗?所以,我会在6"e;Wrench上搜索匹配项,因为这个函数与数据库无关。它是html specialchars,而不是MySQLSSpecialChars。想想看