非常简单的代码;接受用户输入的名称(引号/撇号有效),然后将其存储在mysql数据库中;
$this->sql = new mysqli($this->host, $this->user, $this->pass, $this->dbname);
$firstname = $this->sql->real_escape_string($firstname);
$lastname = $this->sql->real_escape_string($lastname);
$sql = "INSERT INTO users
(firstname, lastname)
('{$firstname}', '{$lastname}')";
$this->sql->query($sql);
但是,在使用时,这会将所有引号/撇号转换为'
。
有人会对可能导致这种情况的想法有任何想法吗?我已经通过脚本检查了所有htmlspecialchars或其他被调用的方法。
答案 0 :(得分:1)
这就是real_escap_string的作用。必须转义所有可用于执行SQL注入攻击的字符。请点击此处查看这些“符号”http://www.w3.org/MarkUp/html-spec/html-spec_13.html的完整列表 如果您显示它们,浏览器会将它们呈现为它们应该是什么样子,但它们不再影响您的查询。
如果您不想更改字符,我建议使用预准备语句。它们是防止SQL注入攻击的最佳方法。有关此主题的更多信息,请访问:http://php.net/manual/de/mysqli.quickstart.prepared-statements.php和此处:How can I prevent SQL injection in PHP?