use*_*531 5 php mysql sql sql-injection
我之前在动态SQL中提出了这个问题防止SQL注入,但是不清楚导致问题被关闭的问题,后来在评论中告诉我应该再次提出这个问题.
我的PHP/MySQL应用程序的一个要求是允许所有用户创建自己的数据"多个"视图.这些视图不是传统的SQL视图,而是由应用程序执行.
例如,用户可以创建视图并提供以下条件:
根据用户的选择,可能需要将各种表连接到查询以支持select,where和group by子句,并且应用程序用于消除重复的表连接(如果存在).
用户完成视图配置后,会出现一个下拉菜单,允许他们选择所需的视图,并显示相应的结果.
我已经通过将用户的选择存储在几个表中并且还存储结果查询来实现此功能(实际上,我将查询的各个部分存储在各个列中,因此我可以在初始查询中计算总结果并返回正确的数量导致SQL表中的第二个查询.请注意,我只存储用户的选择,以便我可以允许他们编辑他们的视图要求,而不是动态创建结果查询(稍后将详细介绍).
我认识到我必须非常小心,因为这样做可能会导致SQL禁令.例如,我不能仅使用PDO转义用户的输入并将其存储在数据库中,然后检索数据并在查询中使用它,因为在检索数据时,它不再被转义.
为了克服这种风险,我尽可能将用户输入限制为整数,并在可能的情况下对其进行类型化.在用户输入为百分比和美元的情况下,我乘以100,将结果作为整数进行类型转换,然后在存储之前除以100.一些过滤器需要将文本作为WHERE子句中的值,并且如前所述,不需要转义数据,而是使用它$user_input= preg_replace('/[^a-z0-9,]/i', '', $_POST['user_input']);来保证安全.
这是实现此功能的可接受方法吗?有没有更简单的方法来确保用户输入是安全的?我之前在动态SQL中预防SQL注入的帖子表明,不应该尝试这种类型的练习,但是,我不知道如何做到这一点.我应该采取其他措施来预防注射吗?
或者也许我不应该在用户保存其视图配置时创建查询并将其存储在表中,而是在每次用户选择给定视图时使用用户保存的值动态创建查询.这会产生负面的性能影响并增加共谋,但我想我可以做到.你会建议使用这个策略吗?
谢谢
use*_*921 -3
你好,我想我明白你了。
这就是您正在寻找的内容: http ://www.php.net/manual/en/function.addslashes.php
$safestring=mysql_real_escape_string($_POST['user_input']);
$safestring=addslashes($safestring);
Run Code Online (Sandbox Code Playgroud)
如果你想让它更安全,即用户不能在输入中输入html,请在使用上面的功能(即mysql_real_escape_string)后使用此功能
$safestring=htmlspecialchars($safestring);
Run Code Online (Sandbox Code Playgroud)
现在,您的所有使用输入将保持原样,如果字符串是“用户输入”,它将保持为“用户输入”,不会更改为“用户输入”,因此没有任何内容被替换,并且仍然安全。
问候。