逃避的正确方法是什么?
我有一个基本的注册表,用户名和密码,例如。我使用PDO将这些值保存到数据库通过php脚本(一切都在php中),所以不应该注入SQL(我希望,如果有更安全的方法,请告诉我)。 我的问题是,我应该在将用户名值保存到数据库之前将其转义。所以,如果有人试图做
<script>alert("hi")</script>
它可以保存这样的东西
<script>alert("hi")</script>
进入数据库。之后没有XSS应该是可能的(是的,有点天真的陈述,但我不知道怎么说这个)。或者保存纯文本
<script>alert("hi")</script>
进入数据库,当时我想打印那些值逃脱它们?
在我看来,更安全的方法是在save into database事件中转义,因此将转义值放入数据库然后打印它们。但是我猜我的问题,我是否应该再次使用数据库中的转义值的转义函数来打印它们?或者只是按原样打印它们(应该被转义)。第一个&#34;解决方案&#34;我不喜欢因为
<script>alert("hi")</script>
将在浏览器中呈现为已转义但不仅仅是<
等安全字符
而第二种解决方案似乎是,如果我陷入困境,我就注定了。
答案 0 :(得分:3)
经验法则:如果用户以后能够编辑他的输入,则将其保存在未转义的DB中。
否则在写入DB之前转义以保存每个输出的处理步骤。
答案 1 :(得分:0)
始终将变量编码为正确的格式。 MySQL中的存储(通常)是纯文本,因此将其保存为纯文本,而不是HTML格式。
答案 2 :(得分:0)
请查看使用Prepared Statements来预防SQL注入。
Prepared语句充当SQL的编译模板。使用预准备语句可以防止数据库将数据解释为SQL查询。
例如,如果用户尝试注入以下SQL:
DROP TABLE my_users;
预准备语句将把它作为字符串值处理,不会将其作为SQL语句执行。
对于从输入字段转义HTML,如果您的输入不允许HTML,则可以在使用strip_tags函数将其保存到数据库之前从字符串中删除HTML。
$entered_username = '<script>alert("hi")</script>';
$entered_username = strip_tags($entered_username);
//Insert $entered_username into a prepared SQL statement to save to the database.
或者在输入字段上实现仅允许字母或数字的验证方法。