use*_*391 12 php xss sql-injection
这足以避免SQL注入吗?
mysql_real_escape_string(htmlentities (urlencode($_POST['postmessage'])));
Run Code Online (Sandbox Code Playgroud)
Col*_*ert 21
mysql_real_escape_string()是你需要的唯一方法.
你不应该做的htmlentities(),也没有urlencode()在数据库中插入数据之前.这些方法通常是在呈现您向用户提供的View时的代码.
避免SQL注入的更好方法是使用预准备语句.
资源:
在同一主题上:
Dan*_*ien 10
我认为您混淆了两个安全问题:SQL注入和跨站点脚本(XSS).
当在发送到SQL数据库的SQL查询中使用不正确的清理用户输入时,网站容易受到SQL注入攻击.例如,此代码引入了SQL注入漏洞:
mysql_query("INSERT INTO postmessages (postmessage) VALUES ('" . $_POST['postmessage'] . "')");
Run Code Online (Sandbox Code Playgroud)
通过以下函数转义用户输入很容易解决此问题mysql_real_escape_string:
mysql_query("INSERT INTO postmessages (postmessage) VALUES ('" . mysql_real_escape_string($_POST['postmessage']) . "')");
Run Code Online (Sandbox Code Playgroud)
这就是您需要做的所有事情,但棘手的部分是记住为SQL语句中使用的每个用户输入执行此操作.
当用户输入用于发送到客户端的HTML时,网站容易受到跨站点脚本的攻击.例如,此代码引入了XSS漏洞:
echo "<div class='postmessage'>" . $_POST['postmessage'] . "</div>";
Run Code Online (Sandbox Code Playgroud)
通过使用以下函数转义用户输入来修复XSS漏洞htmlspecialchars:
echo "<div class='postmessage'>" . htmlspecialchars($_POST['postmessage']) . "</div>";
Run Code Online (Sandbox Code Playgroud)
同样,这很容易做到,但很容易被遗忘.
通常,放置在数据库中以用于稍后发送回HTML的用户输入未经修改地保存.也就是说,仅mysql_real_escape_string使用.但是,您可以转义用户输入以阻止XSS,然后转义XSS安全字符串以防止SQL注入:
mysql_query("INSERT INTO postmessages (postmessage) VALUES ('" . mysql_real_escape_string(htmlspecialchars($_POST['postmessage'])) . "')");
Run Code Online (Sandbox Code Playgroud)
好处是,在将数据htmlspecialchars写入HTML之前,您无需记住从数据库中转义值.缺点是某些值可能需要使用不同的函数进行转义.例如,用户名可能会被转义htmlspecialchars,但"postmessage"可能允许BBcode,Markdown或HTML的子集.如果您转义所有输入以阻止XSS,那么您需要从数据库中取消值,例如,htmlspecialchars_decode.
一个问题是,转义转义字符串并不总是返回原始字符串(unescape(escape($orig))不一定相同$orig).即使使用htmlspecialchars和htmlspecialchars_decode,使用不同的引用样式也会导致此问题.另一个例子是如果strip_tags使用if ,那么信息将被无法恢复; 你将无法撤消strip_tags.因此,许多开发人员选择mysql_real_escape_string仅使用将值保存到数据库和htmlspecialchars(或其他任何)来从数据库中准备要在HTML中使用的字符串.
| 归档时间: |
|
| 查看次数: |
2111 次 |
| 最近记录: |