我有一个请求用户名的注册系统。有些人的姓氏有撇号,这阻止了数据被写入MySQL数据库表(例如O'Hare)。
我正在使用mysql_real_escape_string,它正在从字符串中删除撇号。这很好,除了我需要对Web服务使用带撇号的值,否则Web服务将返回false。
我以为在使用mysql_real_escape_string之前我可以使用Web服务进行名称检查,但这是否存在安全漏洞?或者SOAP Web服务是否已经对干净的输入进行了自己的检查?
或者是否有更好的方法来传递变量,从而PHP保留了撇号,但仍保持安全,MySQL可以接受它?
答案 0 :(得分:7)
您应该向我们展示一些代码,因为mysql_real_escape_string
不会删除撇号,而只会删除它们。
转义意味着O'Hare
将成为O\'Hare
,以便可以将其作为字符串插入:'O\'Hare'
。从数据库中检索后,您的值仍应为原始O'Hare
。
因此,如果撇号“丢失”,程序逻辑中的其他地方可能会出现错误。
另一种选择是从使用MySQL库切换到MySQLi或PDO库来访问您的数据库。后两者支持准备好的陈述。准备好的语句通常被认为是查询数据库的最佳实践。
答案 1 :(得分:0)
mysql_real_escape_string()
不会删除撇号。
您的问题可能出在输出端,或其他一些与输入混乱的功能。
答案 2 :(得分:0)
在使用mysql_real_escape_string
之前,您需要打开数据库连接,否则它将发生故障。