在使用PHP和Javascript应用处理表单数据时,我犯了一个新手错误,我没有预料到并在文本字段中支持撇号(')。
更麻烦的是,在一个多行的应用程序中,我使用单引号或''将包含HTML的变量和可能包含同一张表中的撇号的变量括起来,而不是使用引号(“”)和转义html。
在我使用PHP函数real_escape_string function修改输入到MySQL数据中的$ _POST数据之前,该函数仍然存储带撇号的文本,不带斜杠。然后接着修改每个用单引号定义变量的实例,然后将其更改为引号(“”),然后转义,然后在这里询问是否遗漏了一些内容。
这是使用上面的PHP / Mysql函数可以处理$ _POST数据的示例
$ db-> real_escape_string($ _ POST [“ name”]) 其中“名称” = O'Brien 在数据库中存储为O'Brien,而不是O \'Brien
当我将这些数据读入前端时,它是这样完成的:
var options = '<option value="<?php echo $row[$name];?>" selected><?php echo $row[$name];?></option>';
在这些情况下,如果名称中包含撇号,则javascript控制台会在参数列表后引发错误“ Uncaught SyntaxError:missing)”,这是有道理的。
我希望获得有关如何以最少的工作量/最短的时间解决此问题的建议,但以正确的方式进行,在将来使用撇号甚至引号时不会引起任何问题。
答案 0 :(得分:1)
您应该使用准备好的语句并参数化查询,而不是转义(并且交换报价类型,我不清楚您为什么这样做)。
但是这些方法与您当前的问题无关。当前,您在输出时会遇到封装错误的影响,并且还会接受XSS注入。您应该使用http://php.net/manual/en/function.htmlspecialchars.php来输出到浏览器。
var options = '<option value="<?php echo htmlspecialchars($row[$name], ENT_QUOTES);?>" selected><?php echo htmlspecialchars($row[$name] , ENT_QUOTES);?></option>';
但是您也应该读https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#Why_Can.27t_I_Just_HTML_Entity_Encode_Untrusted_Data.3F,因为您使用的是JS,而不是HTML,所以这可能是不够的。