使用正则表达式验证用户输入以防止 sql 注入
validating user input using regex to prevent an sql injection
使用:
是个好主意吗?
// input can only contain numbers letters
if (preg_match('/^[a-zA-Z0-9_\-\.]+$/', 'input')) {}
这是否有助于防止 SQL 注入 ?
并使网站更安全?
我首先要说的是,您绝对应该在这里使用 PHP Prepared Statements。不要尝试自己处理 SQL 注入,而且这个问题早就解决了。
您的模式 可能 阻止某些类型的 SQL 注入。例如,假设您有以下 SQL 查询:
SELECT col1, col2 FROM some_table WHERE col = ?;
您的正则表达式模式 将 阻止某人将 'value'; DELETE FROM some_table
注入查询。这是因为您的正则表达式模式不允许使用分号。
但是,还有其他类型的注入攻击不涉及链接附加(恶意)语句。联盟攻击也可能发生,您当前的正则表达式 确实 允许这样做。考虑注入以下片段:
'value' UNION ALL SELECT username, password FROM users
这将给出以下完整的 SQL 查询:
SELECT col1, col2 FROM some_table WHERE col = 'value'
UNION ALL
SELECT username, password FROM users;
虽然攻击者不太可能成功,但有可能发生,如果成功了,攻击者可以从完全不同的用户那里获取每个用户名和密码 table。
使用准备好的语句,忘记自己处理这个问题。
使用:
是个好主意吗?// input can only contain numbers letters
if (preg_match('/^[a-zA-Z0-9_\-\.]+$/', 'input')) {}
这是否有助于防止 SQL 注入 ?
并使网站更安全?
我首先要说的是,您绝对应该在这里使用 PHP Prepared Statements。不要尝试自己处理 SQL 注入,而且这个问题早就解决了。
您的模式 可能 阻止某些类型的 SQL 注入。例如,假设您有以下 SQL 查询:
SELECT col1, col2 FROM some_table WHERE col = ?;
您的正则表达式模式 将 阻止某人将 'value'; DELETE FROM some_table
注入查询。这是因为您的正则表达式模式不允许使用分号。
但是,还有其他类型的注入攻击不涉及链接附加(恶意)语句。联盟攻击也可能发生,您当前的正则表达式 确实 允许这样做。考虑注入以下片段:
'value' UNION ALL SELECT username, password FROM users
这将给出以下完整的 SQL 查询:
SELECT col1, col2 FROM some_table WHERE col = 'value'
UNION ALL
SELECT username, password FROM users;
虽然攻击者不太可能成功,但有可能发生,如果成功了,攻击者可以从完全不同的用户那里获取每个用户名和密码 table。
使用准备好的语句,忘记自己处理这个问题。